Qt5 for android + opencv

~~~~我的生活,我的点点滴滴!!

Qt5中新添加了qcamera接口,但是5.3版本之前android平台上的qcamera都不好用,QML的貌似可以用,有了camera功能确实方便干好多事情,不过今天我们不是来计qt自带的camera,我们使用opencv中的摄像头接口,之所以使用opencv是因为他对图像处理提供了很多方便,并且他也是开源跨平台的,下面开始我们qt5 for android + opencv之旅吧

一、 下载opencv库

去官网下载最新的opencv for android的库,我使用的时候最新为了2.4.9 版本,opencv自从2.3.1开始就支持anroid平台了,你也不用非得下载最新的opencv,本人测试2.4.x的都可以正常使用(别用太老的版本了)

下载完成后,不需要安装直接解压到非中文文件路径下,文件布局如下:

E:\HZF\qt-android\OpenCV-2.4.9-android-sdk

|——apk

|——doc

|——samples

|——sdk

1. apk —>文件夹下有一些后缀.apk的包和一个readme.txt 我们通过读txt文档,选择合适的OpenCV Manager apk包去安装到我们的真机上,你要觉得好奇可以解压此包看看里面都有什么,你会发现他里面全是java接口的.so 动态链接库,那表明我们的opencv程序在发布到android平台上时不需要自己在带这些库,只要提前安装了OpenCV Manager就行。

2. doc—->开发文档(对于我们没有用)。

3. samples—–>有一些例子,也有直接编译好的apk包,那些例子是java的,对于我们不使用原生态android开发来说没多大用处,例子可以安装到真机去测试一下真机环境及验证第一步是否需要提前安装OpenCV Manager, 安装运行example-tutorial-1-camerapreview.apk来检测真机的摄像头是否能用,这对于第一次使用新技术来说很有帮助,能确定出问题只会是自己的软件代码有问题。

4. sdk—–>里面有我们需要的native 开发动态链接库 pre-build 是提前编译好的,这点opencv组织做的很好,赞一下!进入到native\libs下面会看到四种不同编译器下面都有已经编译好的库文件,我们需要armeabi-v7a文件夹的下面的。

二、配置opencv到Qt

Qt中添加外部链接库只需要在.pro文件中添加 头文件路径 及 库路径,我们来看看pro里面怎么写的,他的正确性直接决定我们的程序是否能成功编译,我们看一下pro内容

unix {message("Using unix configuration")ANDROID_OPENCV = E:/HZF/qt-android/OpenCV-2.4.9-android-sdk/sdk/nativeINCLUDEPATH += \$$ANDROID_OPENCV/jni/include/opencv    \$$ANDROID_OPENCV/jni/include/opencv2    \$$ANDROID_OPENCV/jni/include            \LIBS += \$$ANDROID_OPENCV/libs/armeabi-v7a/libopencv_contrib.a \$$ANDROID_OPENCV/libs/armeabi-v7a/libopencv_legacy.a \$$ANDROID_OPENCV/libs/armeabi-v7a/libopencv_ml.a \$$ANDROID_OPENCV/libs/armeabi-v7a/libopencv_objdetect.a \$$ANDROID_OPENCV/libs/armeabi-v7a/libopencv_calib3d.a \$$ANDROID_OPENCV/libs/armeabi-v7a/libopencv_video.a \$$ANDROID_OPENCV/libs/armeabi-v7a/libopencv_features2d.a \$$ANDROID_OPENCV/libs/armeabi-v7a/libopencv_highgui.a \$$ANDROID_OPENCV/libs/armeabi-v7a/libopencv_androidcamera.a \$$ANDROID_OPENCV/libs/armeabi-v7a/libopencv_flann.a \$$ANDROID_OPENCV/libs/armeabi-v7a/libopencv_imgproc.a \$$ANDROID_OPENCV/libs/armeabi-v7a/libopencv_core.a     \$$ANDROID_OPENCV/3rdparty/libs/armeabi-v7a/liblibjpeg.a \$$ANDROID_OPENCV/3rdparty/libs/armeabi-v7a/liblibpng.a \$$ANDROID_OPENCV/3rdparty/libs/armeabi-v7a/liblibtiff.a \$$ANDROID_OPENCV/3rdparty/libs/armeabi-v7a/liblibjasper.a \$$ANDROID_OPENCV/3rdparty/libs/armeabi-v7a/libtbb.a}android底层是linux体系,Qt中编译android也是使用的arm体系工具链,这个在上篇blog中也有提到,所以我们使用unix{} 来包裹。

ANDROID_OPENCV 是用来指定opencv native根路径的。

INCLUDEPATH指定了其头文件。

重点来了:

LIBS 中我们用的是.a静态链接库(他只提供了这个),静态链接库的链接顺序是有先后之分的,如果顺序不对是会报错的,大多情况会提示一堆 “未定义”错误,上面基本已经把opencv的所有库都写全了,就是这个顺序,如果懒得研究的可以直接每次在Qt中使用opencv时复制进去就行了。配置好了opencv后我们就可以开始编写代码了。

三、问题及解决

在上面我们配置好编译环境后,我们测试发现失败,报错一堆,我们仔细看其错误,发现类似于 xxxx.so库没有 加载 之类的问题,我们解压我们的apk程序包,对比我们的lib与OpenCV Manager下面的lib 看看是否大体一样(我们lib下面Qt的库忽略,只看与opencv有关的)发现少了 libopencv_java.so我们修改pro链接这个库的全路径,部署运行依然出错,我们在去我们apk包的lib下面找,此时发现就算我们链接了此库但是Qt就没有把他复制到lib下面,怎么办?两种解决方案:

1. 为什么Qt的库能复制进去了?那是因为Qt会自动从他的lib根目录下去找需要的库,既然这样那么我们何不也把libopencv_java.so放到Qt的lib目录下面,然后在pro中写上 -lopencvjava 了?通过验证确实可以行,但是这样有点不太好,更改了Qt lib目录下的文件布局,我们使用第二种方法。

2.此方法在下面给出。

懂得接受失败的人,就是懂得人生真谛的人,

Qt5 for android + opencv

相关文章:

你感兴趣的文章:

标签云: