android opencv 勸退之路第一章:環(huán)境編譯

一篓足、下載opencv源碼包

官網(wǎng)下載Android版帽馋,最新版本為V4.3.0


openCV官網(wǎng)

在這里插入圖片描述

二蕉汪、CMAKE構(gòu)建項(xiàng)目

  • 前提:環(huán)境已安裝好CMAKE和LLDB煌集,可在SdkManager查看


    image.png
  • 解壓源碼包,得到文件夾OpenCV-android-sdk


    image.png

1辛藻、Android studio新建Module碘橘,命名為opencvlib

2、將“OpenCV-android-sdk\sdk\native\libs”下的文件復(fù)制到opencvlib/libs

3吱肌、opencvlib/src/main下新建文件夾cpp,cpp下新建C++文件痘拆,例如native-lib.cpp。

將“OpenCV-android-sdk\sdk\native\jni”下的整個(gè)include文件夾復(fù)制到cpp文件夾下氮墨,因?yàn)镃MakeLists需要引用到該路徑纺蛆,頭文件最好存放在項(xiàng)目中

4、opencvlib目錄下新建文件CMakeLists.txt

5规揪、配置當(dāng)前Module下的buidl.gradle

  • 節(jié)點(diǎn)android下添加
externalNativeBuild {
    cmake {
        path"CMakeLists.txt"
    }
}
  • 節(jié)點(diǎn)android.defaultConfig下添加
externalNativeBuild {

    cmake {

        cppFlags "-std=c++11 -frtti -fexceptions"

        abiFilters 'x86' ,'armeabi-v7a','x86_64','arm64-v8a'   //CPU架構(gòu)

        arguments  "-DANDROID_STL=c++_shared" //解決"libc++_shared.so" not found

    }

}

6桥氏、配置CMakeLists.txt



cmake_minimum_required(VERSION 3.4.1)

#支持-std=gnu++11

set(CMAKE_VERBOSE_MAKEFILE on)

set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=gnu++11")

#配置加載native依賴
#以下路徑就是上述第3步提到的頭文件路徑
include_directories(${PROJECT_SOURCE_DIR}/src/main/cpp/include)

#動(dòng)態(tài)方式加載

add_library(lib_opencv STATIC IMPORTED ) #表示創(chuàng)建一個(gè)導(dǎo)入庫,靜態(tài)方式

#引入libopencv_java4.so文件

set_target_properties(lib_opencv

PROPERTIES

IMPORTED_LOCATION ${PROJECT_SOURCE_DIR}/libs/${ANDROID_ABI}/libopencv_java4.so

)
#自己的源文件

add_library( # Sets the name of the library.

            native-lib

            # Sets the library as a shared library.

            SHARED

            # Provides a relative path to your source file(s).

            src/main/cpp/native-lib.cpp )

# Searches for a specified prebuilt library and stores the path as a

# variable. Because CMake includes system libraries in the search path by

# default, you only need to specify the name of the public NDK library

# you want to add. CMake verifies that the library exists before

# completing its build.

find_library( # Sets the name of the path variable.

            log-lib

            # Specifies the name of the NDK library that

            # you want CMake to locate.

            log )

# Specifies libraries CMake should link to your target library. You

# can link multiple libraries, such as libraries you define in this

# build script, prebuilt third-party libraries, or system libraries.

target_link_libraries( # Specifies the target library.

            native-lib

            # Links the target library to the log library

            # included in the NDK.

${log-lib} android -ljnigraphics lib_opencv)

需要修改的地方

  • include_directories 路徑變量 根據(jù)實(shí)際頭文件路徑進(jìn)行編譯
  • set_target_properties的libopencv_java4.so實(shí)際路徑
  • add_library中的native-lib.cpp實(shí)際路徑

7猛铅、新建JNI工具類OpenCVUtil.java字支,聲明native方法

private static native int[]grey(int[] pixels, int width, int height);

8、在native-lib.cpp編寫C++代碼

例如

 #include <jni.h>
 #include <string>
 #include <stdio.h>
 #include <stdlib.h>
 #include <opencv2/opencv.hpp>
using namespace cv;
using namespace std;
extern "C"
JNIEXPORT jintArray JNICALL
Java_czb_com_opencvlib_OpenCVUtil_grey(JNIEnv *env, jobject instance, jintArray buf, jint w, jint h) {
jint *cbuf = env->GetIntArrayElements(buf, JNI_FALSE );
    if (cbuf == NULL) {
    return 0;
    }
    Mat imgData(h, w, CV_8UC4, (unsigned char *) cbuf);
    uchar* ptr = imgData.ptr(0);
    for(int i =0; i < w*h; i ++){
    //計(jì)算公式:Y(亮度) = 0.299*R + 0.587*G + 0.114*B
        //對(duì)于一個(gè)int四字節(jié)奸忽,其彩色值存儲(chǔ)方式為:BGRA
        int grayScale = (int)(ptr[4*i+2]*0.299 + ptr[4*i+1]*0.587 + ptr[4*i+0]*0.114);
        ptr[4*i+1] = grayScale;
        ptr[4*i+2] = grayScale;
        ptr[4*i+0] = grayScale;
    }
    int size = w * h;
    jintArray result = env->NewIntArray(size);
    env->SetIntArrayRegion(result, 0, size, cbuf);
    env->ReleaseIntArrayElements(buf, cbuf, 0);
    return result;
}

其中函數(shù)名 Java_czb_com_opencvlib_OpenCVUtil_grey堕伪,表示OpenCVUtil的包名為

czb.com.opencvlib,類下有g(shù)rey方法栗菜,需根據(jù)實(shí)際進(jìn)行改動(dòng)

9欠雌、點(diǎn)擊運(yùn)行

opencvlib的文件目錄為


image.png

運(yùn)行成功的話,可在該路徑下查看所編譯的so庫

app\build\intermediates\cmake\debug\obj


image.png

三疙筹、編寫demo

1桨昙、工具類實(shí)現(xiàn)

public class OpenCVUtil {

static {

    System.loadLibrary("native-lib");

    }

    private static native int[]grey(int[] pixels_, int width, int height);



    public static Bitmap bmpGrey(Bitmap bm) {

        int width = bm.getWidth();

        int height = bm.getHeight();

        int[] ps =new int[width * height];

        bm.getPixels(ps, 0, width, 0, 0, width, height);

        long time = System.currentTimeMillis();

        int[] newPs =grey(ps, width, height);

        Log.e("CZB","C++ 執(zhí)行:" + (System.currentTimeMillis() - time));

        Bitmap bitmap = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888);

        bitmap.setPixels(newPs, 0, width, 0, 0, width, height);

        return bitmap;

    }

}

2、在app中引用該Module

  • app.gradle的節(jié)點(diǎn)dependencies添加
implementation project(':opencvlib')

3腌歉、調(diào)用工具類

Bitmap srcBitmap = BitmapFactory.decodeResource(getResources(), R.drawable.test);

Bitmap bm=OpenCVUtil.bmpGrey(srcBitmap);//關(guān)于圖形處理步驟建議在子線程運(yùn)行

imageView.setImageBitmap(bm);

最后 問題匯總(持續(xù)更新)

  • 錯(cuò)誤信息:java.lang.UnsatisfiedLinkError: dlopen failed: library "libopencv_java4.so" not found
    解決辦法: 手動(dòng)加載libopencv_java4.so 蛙酪。由于本人是放在opencvlib模塊下,所以在
    opencvlib/build.gradle的android節(jié)點(diǎn)添加
    sourceSets.main {
        jniLibs.srcDir 'libs'
        jni.srcDirs = []
    }

JAVA代碼JNI類添加

     static {
        System.loadLibrary("native-lib");
        System.loadLibrary("opencv_java4");
      }
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末翘盖,一起剝皮案震驚了整個(gè)濱河市桂塞,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌馍驯,老刑警劉巖阁危,帶你破解...
    沈念sama閱讀 211,639評(píng)論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異汰瘫,居然都是意外死亡狂打,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,277評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門混弥,熙熙樓的掌柜王于貴愁眉苦臉地迎上來趴乡,“玉大人,你說我怎么就攤上這事×滥螅” “怎么了蒿涎?”我有些...
    開封第一講書人閱讀 157,221評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)惦辛。 經(jīng)常有香客問我劳秋,道長(zhǎng),這世上最難降的妖魔是什么胖齐? 我笑而不...
    開封第一講書人閱讀 56,474評(píng)論 1 283
  • 正文 為了忘掉前任玻淑,我火速辦了婚禮,結(jié)果婚禮上呀伙,老公的妹妹穿的比我還像新娘岁忘。我一直安慰自己,他們只是感情好区匠,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,570評(píng)論 6 386
  • 文/花漫 我一把揭開白布干像。 她就那樣靜靜地躺著,像睡著了一般驰弄。 火紅的嫁衣襯著肌膚如雪麻汰。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,816評(píng)論 1 290
  • 那天戚篙,我揣著相機(jī)與錄音五鲫,去河邊找鬼。 笑死岔擂,一個(gè)胖子當(dāng)著我的面吹牛位喂,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播乱灵,決...
    沈念sama閱讀 38,957評(píng)論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼塑崖,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了痛倚?” 一聲冷哼從身側(cè)響起规婆,我...
    開封第一講書人閱讀 37,718評(píng)論 0 266
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎蝉稳,沒想到半個(gè)月后抒蚜,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,176評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡耘戚,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,511評(píng)論 2 327
  • 正文 我和宋清朗相戀三年嗡髓,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片收津。...
    茶點(diǎn)故事閱讀 38,646評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡饿这,死狀恐怖浊伙,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情蛹稍,我是刑警寧澤,帶...
    沈念sama閱讀 34,322評(píng)論 4 330
  • 正文 年R本政府宣布部服,位于F島的核電站唆姐,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏廓八。R本人自食惡果不足惜奉芦,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,934評(píng)論 3 313
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望剧蹂。 院中可真熱鬧声功,春花似錦、人聲如沸宠叼。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,755評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽冒冬。三九已至伸蚯,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間简烤,已是汗流浹背剂邮。 一陣腳步聲響...
    開封第一講書人閱讀 31,987評(píng)論 1 266
  • 我被黑心中介騙來泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留横侦,地道東北人挥萌。 一個(gè)月前我還...
    沈念sama閱讀 46,358評(píng)論 2 360
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像枉侧,于是被迫代替她去往敵國(guó)和親引瀑。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,514評(píng)論 2 348