android - native 库中的 OpenCV 创建错误

标签 android c++ opencv android-ndk java-native-interface

我将 OpenCV 3.4.5 与 native 库一起使用,为此我使用了 CMake (CMakeLists.txt)。

在这个项目之前,我用相同的方式尝试了非常简单的代码(即将实时 RGB 摄像机视频转换为灰色视频)并且它运行成功。

现在我正在尝试用相同的方式进行实时人脸检测(不是识别)项目。

这是我在项目中的 native-lib.cpp 文件。

#include "opencv2/core.hpp"
#include <jni.h>
#include <opencv2/imgproc.hpp>
#include <opencv2/opencv.hpp>
#include <string>

using namespace cv;


using namespace std;
void detect (Mat& frame);
extern "C"
JNIEXPORT void JNICALL Java_com_example_alas02_NativeClass_testFunction(JNIEnv *env, jclass type,jlong addrRgba){
    Mat &frame = *(Mat *) addrRgba;
    detect(frame);
}
void detect (Mat& frame){
    String face_cascade_name = "/storage/emulated/0/ony.xml";
    String eyes_cascade_name = "/storage/emulated/0/moe.xml";
    CascadeClassifier face_cascade;
    CascadeClassifier eyes_cascade;


    if( !face_cascade.load( face_cascade_name ) ){ printf("--(!)Error loading\n"); return; };
    if( !eyes_cascade.load( eyes_cascade_name ) ){ printf("--(!)Error loading\n"); return; };


    std::vector<Rect> faces;
    Mat frame_gray;

    cvtColor( frame, frame_gray, CV_BGR2GRAY );
    equalizeHist( frame_gray, frame_gray );

    //-- Detect faces
    face_cascade.detectMultiScale( frame_gray, faces, 1.1, 2, 0|CV_HAAR_SCALE_IMAGE, Size(30, 30) );

    for( size_t i = 0; i < faces.size(); i++ )
    {
        Point center( faces[i].x + faces[i].width*0.5, faces[i].y + faces[i].height*0.5 );
        ellipse( frame, center, Size( faces[i].width*0.5, faces[i].height*0.5), 0, 0, 360, Scalar( 255, 0, 255 ), 4, 8, 0 );

        Mat faceROI = frame_gray( faces[i] );
        std::vector<Rect> eyes;

        //-- In each face, detect eyes
        eyes_cascade.detectMultiScale( faceROI, eyes, 1.1, 2, 0 |CV_HAAR_SCALE_IMAGE, Size(30, 30) );

        for( size_t j = 0; j < eyes.size(); j++ )
        {
            Point center( faces[i].x + eyes[j].x + eyes[j].width*0.5, faces[i].y + eyes[j].y + eyes[j].height*0.5 );
            int radius = cvRound( (eyes[j].width + eyes[j].height)*0.25 );
            circle( frame, center, radius, Scalar( 255, 0, 0 ), 4, 8, 0 );
        }
    }
}

注意:有任何同步错误,但当我尝试构建它时,它会给我这样的错误;

Build command failed.
Error while executing process C:\Users\k22\AppData\Local\Android\Sdk\cmake\3.6.4111459\bin\cmake.exe with arguments {--build C:\Users\k22\AndroidStudioProjects\alas02\app\.externalNativeBuild\cmake\debug\x86_64 --target native-lib}
[1/2] Building CXX object CMakeFiles/native-lib.dir/src/main/cpp/native-lib.cpp.o
[2/2] Linking CXX shared library ..\..\..\..\build\intermediates\cmake\debug\obj\x86_64\libnative-lib.so
FAILED: cmd.exe /C "cd . && C:\Users\k22\AppData\Local\Android\Sdk\ndk-bundle\toolchains\llvm\prebuilt\windows-x86_64\bin\clang++.exe  --target=x86_64-none-linux-android21 --gcc-toolchain=C:/Users/k22/AppData/Local/Android/Sdk/ndk-bundle/toolchains/llvm/prebuilt/windows-x86_64 --sysroot=C:/Users/k22/AppData/Local/Android/Sdk/ndk-bundle/toolchains/llvm/prebuilt/windows-x86_64/sysroot -fPIC -g -DANDROID -fdata-sections -ffunction-sections -funwind-tables -fstack-protector-strong -no-canonical-prefixes -fno-addrsig -Wa,--noexecstack -Wformat -Werror=format-security   -std=gnu++11 -O0 -fno-limit-debug-info  -Wl,--exclude-libs,libgcc.a -Wl,--exclude-libs,libatomic.a -static-libstdc++ -Wl,--build-id -Wl,--warn-shared-textrel -Wl,--fatal-warnings -Wl,--no-undefined -Qunused-arguments -Wl,-z,noexecstack -shared -Wl,-soname,libnative-lib.so -o ..\..\..\..\build\intermediates\cmake\debug\obj\x86_64\libnative-lib.so CMakeFiles/native-lib.dir/src/main/cpp/native-lib.cpp.o  -llog ../../../../src/main/jniLibs/x86_64/libopencv_java3.so -latomic -lm && cd ."
C:\Users\k22\AndroidStudioProjects\alas02\app\src\main\cpp/native-lib.cpp:35: error: undefined reference to 'cv::CascadeClassifier::detectMultiScale(cv::_InputArray const&, std::__ndk1::vector<cv::Rect_<int>, std::__ndk1::allocator<cv::Rect_<int> > >&, double, int, int, cv::Size_<int>, cv::Size_<int>)'

C:\Users\k22\AndroidStudioProjects\alas02\app\src\main\cpp/native-lib.cpp:46: error: undefined reference to 'cv::CascadeClassifier::detectMultiScale(cv::_InputArray const&, std::__ndk1::vector<cv::Rect_<int>, std::__ndk1::allocator<cv::Rect_<int> > >&, double, int, int, cv::Size_<int>, cv::Size_<int>)'

clang++: error: linker command failed with exit code 1 (use -v to see invocation)

ninja: build stopped: subcommand failed.

最佳答案

您正在使用 libopencv_java3.so。它与最近发布的 NDK 不兼容。参见 https://stackoverflow.com/a/50686467/192373 .

双赢的解决方案是切换到 OpenCV 4。这可能需要对您的代码进行一些小的更改。

要继续使用 OpenCV 3.4.5,您可以退回到旧的 NDK 版本(不推荐),或者使用最新的 NDK 重建 libopencv_java3.so(冒险)。

关于android - native 库中的 OpenCV 创建错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57645338/

相关文章:

android - Flutter:Google Speech-To-Text API始终返回null

android - 什么是 `COLUMN_NAME_NULLABLE`

c++ - 如何在 C++ 项目中包含具有相似名称的头文件

python - 在 Python OpenCV 中发布 VideoWriter

opencv - 是否有可能找到反径向变形(cv2.undistortPoints)的雅可比集?

c++ - 使用 OpenCV 将图像区域移动到中心

android - 应用程序出现在 Play 商店的预计时间?

android - Adobe 是否为其 PDF 阅读器提供 Android SDK 或 API?

c++ - 编译器如何生成模板类定义?

c++ - 构造函数和析构函数中的虚函数调用