QT Widget使用OpenCV错误部署到Android [重复]

Posted

技术标签:

【中文标题】QT Widget使用OpenCV错误部署到Android [重复]【英文标题】:QT Widget using OpenCV error deploying to Android [duplicate] 【发布时间】:2014-12-05 23:25:12 【问题描述】:

我想创建一个 QT 小部件 (C++) 并使用 OpenCV 库 (C++) 并将其部署到 android

我已经安装了 QT for Android 和http://qt-project.org/doc/qt-5/androidgs.html 中提到的必要文件,例如 NDK、SDK 等。mingw 编译器包含在 QT for Android 中,所以我不必再次安装它。

将 QT 小部件部署到 android 没有问题。问题是在 QT 小部件中使用 OpenCV 库,然后部署它。

我尝试了两种在我的 QT 项目中使用 OpenCV 的方法:

    由于 QT for Android 带有 mingw 编译器,我使用 CMake 和 mingw 编译器从源代码编译了 OpenCV 库。然后我包含了头文件并将库链接到 QT 的项目文件中。此选项不起作用。我习惯了这种包含的方法,也想以同样的方式使用其他库,例如 Boost 和 Eigen。

    我已经下载了 OPENCV android SDK 并包含了它的头文件并将它的库链接到 QT 的项目文件中。这仍然没有奏效。

基本上我想做的只是用 C++ 编写代码,因此使用小部件而不是 qtquick(qml)。请您让我知道上述步骤中哪些(如果有)是正确的,以及我必须进行哪些更改。

另一方面,有谁知道我如何加快模拟器的速度,我有一个 AMD 处理器,所以无法利用 intels 工具。在哪里可以获得三星 Note 4 的 AVD 设置?

非常感谢!!

选项 1 的项目文件:

QT       += core gui

greaterThan(QT_MAJOR_VERSION, 4): QT += widgets

TARGET = test3
TEMPLATE = app


LIBS+= C:\programs\opencv\RELEASE\lib\\\*
INCLUDEPATH+= C:\programs\opencv\RELEASE\install\include\

SOURCES += main.cpp\
        mainwindow.cpp

HEADERS  += mainwindow.h

FORMS    += mainwindow.ui

CONFIG += mobility
MOBILITY = 

选项 1 的错误:

12:18:17: Starting: "C:\programs\QT\Tools\mingw482_32\bin\mingw32-make.exe" 
C:\programs\QT\5.3\android_armv7\bin\qmake.exe -spec android-g++ CONFIG+=debug -o Makefile ..\test3\test3.pro
The system cannot find the path specified.
C:\programs\android-ndk-r10c/toolchains/arm-linux-androideabi-4.9/prebuilt/windows/bin/arm-linux-androideabi-g++ --sysroot=C:\programs\android-ndk-r10c/platforms/android-9/arch-arm/ -Wl,-soname,libtest3.so -Wl,--no-undefined -Wl,-z,noexecstack -shared -o libtest3.so main.obj mainwindow.obj moc_mainwindow.obj   -LC:\programs\android-ndk-r10c/sources/cxx-stl/gnu-libstdc++/4.9/libs/armeabi-v7a -LC:\programs\android-ndk-r10c/platforms/android-9/arch-arm//usr/lib C:\programs\opencv\RELEASE\lib\\* -LC:/programs/QT/5.3/android_armv7/lib -lQt5Widgets -Lc:\Utils\android\ndk/sources/cxx-stl/gnu-libstdc++/4.8/libs/armeabi-v7a -Lc:\Utils\android\ndk/platforms/android-9/arch-arm//usr/lib -LC:\Utils\icu32_51_1_mingw482\lib -LC:\utils\postgresql\pgsql\lib -LC:\utils\mysql\mysql\lib -LC:\Utils\pgsql\lib -LC:\temp\opensll-android-master\openssl-android-master\lib -LC:\programs\QT\5.3\android_armv7/lib -lQt5Gui -lQt5Core -lGLESv2 -lgnustl_shared -llog -lz -lm -ldl -lc -lgcc
..\..\opencv\RELEASE\install\include/opencv2/core/mat.hpp:278: error: undefined reference to 'cv::fastFree(void*)'
..\..\opencv\RELEASE\install\include/opencv2/core/mat.hpp:298: error: undefined reference to 'cv::Mat::copySize(cv::Mat const&)'
..\..\opencv\RELEASE\install\include/opencv2/core/mat.hpp:367: error: undefined reference to 'cv::Mat::deallocate()'
..\test3/main.cpp:23: error: undefined reference to 'cv::imread(std::string const&, int)'
..\test3/main.cpp:31: error: undefined reference to 'cv::namedWindow(std::string const&, int)'
..\test3/main.cpp:32: error: undefined reference to 'cv::_InputArray::_InputArray(cv::Mat const&)'
Makefile:82: recipe for target 'libtest3.so' failed
..\test3/main.cpp:32: error: undefined reference to 'cv::imshow(std::string const&, cv::_InputArray const&)'
..\test3/main.cpp:34: error: undefined reference to 'cv::waitKey(int)'
collect2.exe: error: ld returned 1 exit status
mingw32-make: *** [libtest3.so] Error 1
12:18:22: The process "C:\programs\QT\Tools\mingw482_32\bin\mingw32-make.exe" exited with code 2.
Error while building/deploying project test3 (kit: Android for armeabi-v7a (GCC 4.9, Qt 5.3.2))
When executing step "Make"
12:18:22: Elapsed time: 00:04.

选项 2 的项目文件:

   #-------------------------------------------------
#
# Project created by QtCreator 2014-12-05T18:06:24
#
#-------------------------------------------------

QT       += core gui

greaterThan(QT_MAJOR_VERSION, 4): QT += widgets

TARGET = test3
TEMPLATE = app

INCLUDEPATH+= C:\programs\opencvandroidsdk\sdk\native\jni\include

LIBS += -LC:\programs\opencvandroidsdk\sdk\native\libs\armeabi-v7a\
-lopencv_contrib \
-lopencv_legacy \
-lopencv_ml \
-lopencv_objdetect \
-lopencv_calib3d \
-lopencv_video \
-lopencv_features2d \
-lopencv_highgui \
-lopencv_androidcamera \
-lopencv_flann \
-lopencv_imgproc \
-lopencv_core

LIBS += -LC:\programs\opencvandroidsdk\sdk\native\3rdparty\libs\armeabi-v7a\
-llibjpeg \
-llibpng \
-llibtiff \
-llibjasper \
-ltbb \
-lIlmImf

SOURCES += main.cpp\
        mainwindow.cpp

HEADERS  += mainwindow.h

FORMS    += mainwindow.ui

CONFIG += mobility
MOBILITY =

选项 2 的错误:

18:24:53: Running steps for project test3...
18:24:53: Configuration unchanged, skipping qmake step.
18:24:53: Starting: "C:\programs\QT\Tools\mingw482_32\bin\mingw32-make.exe" 
mingw32-make: Nothing to be done for 'first'.
18:24:55: The process "C:\programs\QT\Tools\mingw482_32\bin\mingw32-make.exe" exited normally.
18:24:55: Starting: "C:\programs\QT\Tools\mingw482_32\bin\mingw32-make.exe" INSTALL_ROOT="C:\programs\QT projects\build-test3-Android_for_armeabi_v7a_GCC_4_9_Qt_5_3_2-Release\android-build" install
copy /y "libtest3.so" "C:\programs\QT projects\build-test3-Android_for_armeabi_v7a_GCC_4_9_Qt_5_3_2-Release\android-build\libs\armeabi-v7a\libtest3.so"
The system cannot find the path specified.
        0 file(s) copied.
Makefile:1627: recipe for target 'install_target' failed
mingw32-make: [install_target] Error 1 (ignored)
18:24:57: The process "C:\programs\QT\Tools\mingw482_32\bin\mingw32-make.exe" exited normally.
Error while building/deploying project test3 (kit: Android for armeabi-v7a (GCC 4.9, Qt 5.3.2))
When executing step "Deploy to Android device"
18:27:00: Elapsed time: 02:07.

【问题讨论】:

没有关于“什么不起作用”的详细信息,也没有为试用粘贴的代码;帮不上忙。 @lpapp 我已经粘贴了代码。谢谢! Glob 不会像这样工作:LIBS+= C:\programs\opencvandroidsdk\sdk\native\3rdparty\libs\armeabi-v7a*。尝试指定LIBS += -LC:\path\to\cv\library -lopencvlibname @lpapp 谢谢,我应该改变什么? LIBS += -LC:\programs\opencvandroidsdk\sdk\native\3rdparty\libs -armeabi-v7a 【参考方案1】:

对于选项 2:

改变

LIBS += \
C:\programs\opencvandroidsdk\sdk\native\libs\armeabi-v7a\libopencv_contrib.a \
C:\programs\opencvandroidsdk\sdk\native\libs\armeabi-v7a\libopencv_legacy.a \
C:\programs\opencvandroidsdk\sdk\native\libs\armeabi-v7a\libopencv_ml.a \
C:\programs\opencvandroidsdk\sdk\native\libs\armeabi-v7a\libopencv_objdetect.a\
C:\programs\opencvandroidsdk\sdk\native\libs\armeabi-v7a\libopencv_calib3d.a \
C:\programs\opencvandroidsdk\sdk\native\libs\armeabi-v7a\libopencv_video.a \
C:\programs\opencvandroidsdk\sdk\native\libs\armeabi-v7a\libopencv_features2d.a \
C:\programs\opencvandroidsdk\sdk\native\libs\armeabi-v7a\libopencv_highgui.a \
C:\programs\opencvandroidsdk\sdk\native\libs\armeabi-v7a\libopencv_androidcamera.a \
C:\programs\opencvandroidsdk\sdk\native\libs\armeabi-v7a\libopencv_flann.a \
C:\programs\opencvandroidsdk\sdk\native\libs\armeabi-v7a\libopencv_imgproc.a \
C:\programs\opencvandroidsdk\sdk\native\libs\armeabi-v7a\libopencv_core.a \
C:\programs\opencvandroidsdk\sdk\native\3rdparty\libs\armeabi-v7a\liblibjpeg.a \
C:\programs\opencvandroidsdk\sdk\native\3rdparty\libs\armeabi-v7a\liblibpng.a \
C:\programs\opencvandroidsdk\sdk\native\3rdparty\libs\armeabi-v7a\liblibtiff.a \
C:\programs\opencvandroidsdk\sdk\native\3rdparty\libs\armeabi-v7a\liblibjasper.a \
C:\programs\opencvandroidsdk\sdk\native\3rdparty\libs\armeabi-v7a\libtbb.a \

到:

LIBS += -LC:\programs\opencvandroidsdk\sdk\native\libs\armeabi-v7a \  
-lopencv_legacy \  
-lopencv_ml \  
-lopencv_objdetect\  
... \  
-ltbb

【讨论】:

谢谢我现在收到一个错误“表达式后有多余的字符”我已经更新了我的问题以显示错误 对不起,是我的错。从 -LC:\programs\opencvandroidsdk\sdk\native\libs\armeabi-v7a\libopencv_contrib.a 中删除 libopencv_contrib.a 。所以 -L 用于 lib 目录, -l 用于库文件。要添加 libBlaBla.a,请使用 -lBlaBla(不带 lib 和 .a) 非常感谢!!成功了,你的传奇! 现在我只是有部署错误(见上文)有什么提示吗? 我的建议是在处理 Qt(文件夹“QT 项目”)时使用不带空格的路径。现在,上面的错误来自windows命令“复制”,“系统找不到指定的路径。”但是在你尝试构建一个没有空格的文件夹之前,没有必要进入。

以上是关于QT Widget使用OpenCV错误部署到Android [重复]的主要内容,如果未能解决你的问题,请参考以下文章

Qt Creator LNK2019:使用 OpenCV 无法解析的外部符号

使用QT+OpenCV打开摄像头

qt+opencv对两幅图片进行融合

Qt + opencv的学习

Qt + OpenCV 部署yolov5

将 opencv 库添加到 QT 创建者并出现错误:链接器命令失败,退出代码为 1