error: undefined reference to 'cv::CascadeClassifier::detectMultiScale

開發配置環境:

ndk :r19_x86_x64

opencv sdk :v3.4.3

android studio 3.2

遇到問題:

在調試Android Studio的Jni通過Ndk編譯opencv時遇到問題:

error: undefined reference to 'cv::CascadeClassifier::detectMultiScale

jni代碼:

extern "C"  JNIEXPORT jlong JNICALL
Java_com_test_MainActivity_detectFaces(JNIEnv *env, jobject instance, jlong addrInputRgbaImage) {
    cv::Mat& imageInput = *(cv::Mat*)addrInputRgbaImage;
    cv::Mat imageGray;
    cv::cvtColor(imageInput,imageGray,cv::COLOR_RGBA2GRAY);
    auto width = imageInput.size().width;
    auto height = imageInput.size().height;
    if(faceDetecter != nullptr){
        std::vector<cv::Rect> faces;
        faceDetecter->detectMultiScale( imageGray, faces, 1.1, 2, 
            0|cv::CASCADE_SCALE_IMAGE, cv::Size(width/10, height/5));
        for(auto faceRect: faces){
            cv::rectangle(imageInput,faceRect,cv::Scalar(255,0,0),3);
        }
    }
    return 0;
}

主要問題在 faceDetecter->detectMultiScale(... ...)

解決方法:

app的build.gradle文件中添加標準 gnustl_static(ndk-r16版本支持) ,而不是c++_static(ndk新版本)

    defaultConfig {
        ... ...
        externalNativeBuild {
            cmake {
                cppFlags "-std=c++11 -frtti -fexceptions"
                arguments '-DANDROID_STL=gnustl_static'
            }
        }
    }

這時由於我的ndk是r19版本:

所以報錯如下:

CMake Error: CMAKE_C_COMPILER not set, after EnableLanguage

CMake Error: CMAKE_CXX_COMPILER not set, after EnableLanguage

-- Configuring incomplete, errors occurred!

這時候我們需要把ndk更新爲r16版本即可解決,

https://dl.google.com/android/repository/android-ndk-r16-windows-x86.zip

https://dl.google.com/android/repository/android-ndk-r16-windows-x86_64.zip
下載r16 ,並解壓你的sdk目錄,通過選擇File->project structure...->SDK Location 更改ndk目錄:

總結分析:

不能確定是否爲ndk向下支持問題,應該是ndk和opencv版本匹配問題,目前還沒有找到高版本ndk調用opencv方法,但是如果你感興趣的話可以嘗試下,最新版本的opencv和ndk的匹配是否存在問題。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章