OpenCV 灰度圖處理

效果展示

效果展示.png

opencv android sdk

官網(wǎng):https://opencv.org/android/
sdk下載:https://github.com/opencv/opencv/releases
PS:本文下載的版本是opencv-4.10.0-android-sdk.zip

灰度圖處理的思路

分四部
1裂七、創(chuàng)建與原圖寬高一樣的bitmap
2袋毙、在ndk里將bitmap轉(zhuǎn)成c++的mat對象
3暮蹂、對mat對象進行灰度操作
4琅关、將mat對象轉(zhuǎn)回bitmap

核心代碼

#include <jni.h>
#include <string>
#include <android/log.h>
#include <opencv2/opencv.hpp>
#include <android/bitmap.h>

using namespace cv;

//定義TAG之后潘拱,我們可以在LogCat通過TAG過濾出NDK打印的日志
#define TAG "JNI_YGQ_DAY05"

// 定義info信息
#define LOGI(...) __android_log_print(ANDROID_LOG_INFO,TAG,__VA_ARGS__)
// 定義debug信息
#define LOGD(...) __android_log_print(ANDROID_LOG_DEBUG, TAG, __VA_ARGS__)
// 定義error信息
#define LOGE(...) __android_log_print(ANDROID_LOG_ERROR,TAG,__VA_ARGS__)

//bitmap2Mat和mat2bitmap參考的opencv官網(wǎng)源碼
//https://github.com/opencv/opencv/blob/4.x/modules/java/generator/src/cpp/utils.cpp

void bitmap2Mat(JNIEnv *env, Mat &mat, jobject bitmap) {
    AndroidBitmapInfo info;
    AndroidBitmap_getInfo(env, bitmap, &info);
    void *pixels = 0;
    AndroidBitmap_lockPixels(env, bitmap, &pixels);

    // CV_8UC4 8位無符號整數(shù)的4通道矩陣,對應(yīng)BGRA格式
    mat.create(info.height, info.width, CV_8UC4);

    if (info.format == ANDROID_BITMAP_FORMAT_RGBA_8888) {
        LOGD("nBitmapToMat: RGBA_8888 -> CV_8UC4");
        Mat tmp(info.height, info.width, CV_8UC4, pixels);
        tmp.copyTo(mat);
    } else if (info.format == ANDROID_BITMAP_FORMAT_RGB_565) {
        LOGD("nBitmapToMat: RGB_565 -> CV_8UC4");
        //8 位無符號整數(shù)的 2 通道矩陣
        Mat tmp(info.height, info.width, CV_8UC2, pixels);
        cvtColor(tmp, mat, COLOR_BGR5652RGBA);
    } else {
        LOGE("nBitmapToMat: unSupport format");
    }
    AndroidBitmap_unlockPixels(env, bitmap);
}

void mat2bitmap(JNIEnv *env, Mat &src, jobject bitmap) {
    // 1. 獲取圖片的寬高,以及格式信息
    AndroidBitmapInfo info;
    AndroidBitmap_getInfo(env, bitmap, &info);
    void *pixels;
    AndroidBitmap_lockPixels(env, bitmap, &pixels);

    if (info.format == ANDROID_BITMAP_FORMAT_RGBA_8888) {
        Mat tmp(info.height, info.width, CV_8UC4, pixels);
        if (src.type() == CV_8UC1) {
            LOGD("nMatToBitmap: CV_8UC1 -> RGBA_8888");
            cvtColor(src, tmp, COLOR_GRAY2RGBA);
        } else if (src.type() == CV_8UC3) {
            LOGD("nMatToBitmap: CV_8UC3 -> RGBA_8888");
            cvtColor(src, tmp, COLOR_RGB2RGBA);
        } else if (src.type() == CV_8UC4) {
            LOGD("nMatToBitmap: CV_8UC4 -> RGBA_8888");
            src.copyTo(tmp);
        }
    } else if (info.format == ANDROID_BITMAP_FORMAT_RGB_565) {
        Mat tmp(info.height, info.width, CV_8UC2, pixels);
        if (src.type() == CV_8UC1) {
            LOGD("nMatToBitmap: CV_8UC1 -> RGB_565");
            cvtColor(src, tmp, COLOR_GRAY2BGR565);
        } else if (src.type() == CV_8UC3) {
            LOGD("nMatToBitmap: CV_8UC3 -> RGB_565");
            cvtColor(src, tmp, COLOR_RGB2BGR565);
        } else if (src.type() == CV_8UC4) {
            LOGD("nMatToBitmap: CV_8UC4 -> RGB_565");
            cvtColor(src, tmp, COLOR_RGBA2BGR565);
        }
    } else {
        LOGE("nMatToBitmap: unSupport format");
    }

    AndroidBitmap_unlockPixels(env, bitmap);
}

extern "C"
JNIEXPORT jboolean JNICALL
Java_com_ygq_ndk_day05_NativeLib_00024Companion_grayTransform(JNIEnv *env, jobject thiz, jobject src, jobject dest) {
    Mat mat;
    bitmap2Mat(env, mat, src);
    Mat mat_gay;
    cvtColor(mat, mat_gay, COLOR_BGRA2GRAY);
    mat2bitmap(env, mat_gay, dest);
    return JNI_TRUE;
}

源碼地址

https://github.com/treech/NDKDemo

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末邓厕,一起剝皮案震驚了整個濱河市炫惩,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖并炮,帶你破解...
    沈念sama閱讀 217,734評論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件默刚,死亡現(xiàn)場離奇詭異,居然都是意外死亡逃魄,警方通過查閱死者的電腦和手機荤西,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,931評論 3 394
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來伍俘,“玉大人皂冰,你說我怎么就攤上這事⊙ǎ” “怎么了秃流?”我有些...
    開封第一講書人閱讀 164,133評論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長柳弄。 經(jīng)常有香客問我舶胀,道長,這世上最難降的妖魔是什么碧注? 我笑而不...
    開封第一講書人閱讀 58,532評論 1 293
  • 正文 為了忘掉前任嚣伐,我火速辦了婚禮,結(jié)果婚禮上萍丐,老公的妹妹穿的比我還像新娘轩端。我一直安慰自己,他們只是感情好逝变,可當(dāng)我...
    茶點故事閱讀 67,585評論 6 392
  • 文/花漫 我一把揭開白布基茵。 她就那樣靜靜地躺著,像睡著了一般壳影。 火紅的嫁衣襯著肌膚如雪拱层。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,462評論 1 302
  • 那天宴咧,我揣著相機與錄音根灯,去河邊找鬼。 笑死掺栅,一個胖子當(dāng)著我的面吹牛烙肺,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播氧卧,決...
    沈念sama閱讀 40,262評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼桃笙,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了假抄?” 一聲冷哼從身側(cè)響起怎栽,我...
    開封第一講書人閱讀 39,153評論 0 276
  • 序言:老撾萬榮一對情侶失蹤丽猬,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后熏瞄,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體脚祟,經(jīng)...
    沈念sama閱讀 45,587評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,792評論 3 336
  • 正文 我和宋清朗相戀三年强饮,在試婚紗的時候發(fā)現(xiàn)自己被綠了由桌。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,919評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡邮丰,死狀恐怖行您,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情剪廉,我是刑警寧澤娃循,帶...
    沈念sama閱讀 35,635評論 5 345
  • 正文 年R本政府宣布,位于F島的核電站斗蒋,受9級特大地震影響捌斧,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜泉沾,卻給世界環(huán)境...
    茶點故事閱讀 41,237評論 3 329
  • 文/蒙蒙 一捞蚂、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧跷究,春花似錦姓迅、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,855評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至潭袱,卻和暖如春柱嫌,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背屯换。 一陣腳步聲響...
    開封第一講書人閱讀 32,983評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留与学,地道東北人彤悔。 一個月前我還...
    沈念sama閱讀 48,048評論 3 370
  • 正文 我出身青樓,卻偏偏與公主長得像索守,于是被迫代替她去往敵國和親晕窑。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,864評論 2 354

推薦閱讀更多精彩內(nèi)容