本机库中的 OpenCV 创建错误

OpenCV in native library creating errors

本文关键字:创建 错误 OpenCV 本机      更新时间:2023-10-16

我正在使用带有本机库的OpenCV 3.4.5,为此我使用了CMake(CMakeLists.txt)。

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

现在我正在尝试以同样的方式制作实时人脸检测(而不是识别)项目。

这是我在项目中的本机库.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 loadingn"); return; };
if( !eyes_cascade.load( eyes_cascade_name ) ){ printf("--(!)Error loadingn"); 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:Usersk22AppDataLocalAndroidSdkcmake3.6.4111459bincmake.exe with arguments {--build C:Usersk22AndroidStudioProjectsalas02app.externalNativeBuildcmakedebugx86_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 ........buildintermediatescmakedebugobjx86_64libnative-lib.so
FAILED: cmd.exe /C "cd . && C:Usersk22AppDataLocalAndroidSdkndk-bundletoolchainsllvmprebuiltwindows-x86_64binclang++.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 ........buildintermediatescmakedebugobjx86_64libnative-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:Usersk22AndroidStudioProjectsalas02appsrcmaincpp/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:Usersk22AndroidStudioProjectsalas02appsrcmaincpp/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(冒险)。