Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/200.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/125.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 本机库中的OpenCV创建错误_Android_C++_Opencv_Android Ndk_Java Native Interface - Fatal编程技术网

Android 本机库中的OpenCV创建错误

Android 本机库中的OpenCV创建错误,android,c++,opencv,android-ndk,java-native-interface,Android,C++,Opencv,Android Ndk,Java Native Interface,我在本机库中使用OpenCV 3.4.5,为此我使用了CMake(CMakeLists.txt) 在这个项目之前,我用同样的方法尝试了非常简单的代码(即将实时RGB摄像机视频转换为灰色视频),并且成功地工作了 现在我正试图用同样的方法做一个实时人脸检测(而不是识别)项目 这是我在project中的native-lib.cpp文件 #include "opencv2/core.hpp" #include <jni.h> #include <opencv2/imgproc.hpp&

我在本机库中使用OpenCV 3.4.5,为此我使用了CMake(CMakeLists.txt)

在这个项目之前,我用同样的方法尝试了非常简单的代码(即将实时RGB摄像机视频转换为灰色视频),并且成功地工作了

现在我正试图用同样的方法做一个实时人脸检测(而不是识别)项目

这是我在project中的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 );
        }
    }
}
#包括“opencv2/core.hpp”
#包括
#包括
#包括
#包括
使用名称空间cv;
使用名称空间std;
空隙检测(垫和框架);
外部“C”
JNIEXPORT void JNICALL Java_com_示例_alas02_NativeClass_testFunction(JNIEnv*env,jclass type,jlong addrRgba){
材料和框架=*(材料*)添加RRGBA;
检测(帧);
}
空隙检测(垫和框架){
字符串face_cascade_name=“/storage/emulated/0/ony.xml”;
字符串eyes_cascade_name=“/storage/emulated/0/moe.xml”;
层叠式分级机;
级联效应;
如果(!face_cascade.load(face_cascade_name)){printf(“-(!)错误加载\n”);返回;};
如果(!eyes_cascade.load(eyes_cascade_name)){printf(“-(!)错误加载\n”);返回;};
向量面;
垫子框架为灰色;
CVT颜色(框架、框架灰、CV灰);
均衡器历史(帧灰,帧灰);
//--检测人脸
人脸级联。检测多尺度(帧灰度,人脸,1.1,2,0;CV_HAAR_比例图像,大小(30,30));
对于(size_t i=0;i
注意:有任何同步错误,但当我试图建立它给我的错误,如

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.

Build命令失败。
执行进程C:\Users\k22\AppData\Local\Android\Sdk\cmake\3.6.4111459\bin\cmake.exe时出错,参数为{--build C:\Users\k22\AndroidStudioProjects\alas02\app\.externalNativeBuild\cmake\debug\x86\u 64--target native lib}
[1/2]构建CXX对象cmakfiles/native lib.dir/src/main/cpp/native lib.cpp.o
[2/2]链接CXX共享库..\\..\build\mediates\cmake\debug\obj\x86\u 64\libnative-lib.so
失败:cmd.exe/C"光碟,C:\Users\k22\AppData\Local\Android\Sdk\ndk bundle\toolschains\llvm\prebuild\windows-x86\u 64\bin\clang++.exe--target=x86\u 64-none-linux-android21--gcc toolschain=C:/Users/k22/AppData/Local/Android/Sdk/ndk bundle/toolschains/llvm/prebuild/windows-x86\u 64--sysroot=C:/Users/k22/AppData/Local/Android/Sdk/ndk bundle/toolschains/llvm/prebuilded/windows-x86_64/sysroot-fPIC-g-DANDROID-fdata sections-ffunction sections-funwind tables-fstack-protector-strong-无规范前缀-fno addrsig-Wa,--noexecstack-Wformat-Werror=格式安全性-std=gnu++11-O0-fno-limit调试信息-Wl,--排除libs,libgcc.a-Wl,-exclude libs,libatomic.a-静态libstdc++-Wl,-build id-Wl,-warn shared textrel-Wl,-fatal warnings-Wl,-no未定义的-Qunused参数-Wl,-z,noexecstack-shared-Wl,-soname,libnative-lib.so-o….\\\\..\build\mediates\cmake\debug\obj\x86\u 64\libnative-lib.so CMakeFiles/native lib.dir/src/main/cpp/native lib.cpp.o-llog../../../../src/main/jniLibs/x86\u 64/libopencv\u java3.so-latomic-lm&&cd。”
C:\Users\k22\AndroidStudioProjects\alas02\app\src\main\cpp/native lib.cpp:35:错误:未定义对“cv::CascadeClassifier::detectMultiScale(cv:_InputArray常量和,标准:uuu ndk1::vector&,double,int,int,cv::Size,cv::Size_x)”的引用
C:\Users\k22\AndroidStudioProjects\alas02\app\src\main\cpp/native lib.cpp:46:错误:未定义对“cv::CascadeClassifier::detectMultiScale(cv:_InputArray常量和,std:uuu ndk1::vector&,double,int,int,cv::Size,cv::Size_u)”的引用
clang++:错误:链接器命令失败,退出代码为1(使用-v查看调用)
忍者:构建停止:子命令失败。

您使用的是libopencv\u java3。因此它与NDK的最新版本不兼容。请参阅

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


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

我在OpenCV 4.1.1和4.1.0中尝试了相同的代码,但现在我给出了“OpenCV未加载”“来自我的设备的消息,其中一个是API 17,另一个是API 28。请写信告诉我哪些代码或文件我必须与您共享。您如何加载OpenCV?您是否将libopencv_java4.so打包到APK中?事实上,是的,我在CMakeLists.txt的关联行中编写了此文件。仅在CMakeLists.txt文件中引用
libopencv_java4.so
,是不够的;你也应该把它放在一个JniLibs.src目录中。我已经在app/src/main中有了JniLibs和jniIncludes目录,其中有从OpenCV自己下载的文件复制的文件夹和文件。它们还不足以导入OpenCV吗?如果是假的,你能详细写下我要做的事情吗?顺便说一下,谢谢你的回答。