Qt+opencv部署深度学习模型到windows与android

配置

Qt + android的一套 + mingw版本opencv + android版本opencv
我用的模型是tensorflow的ssd_mobilenet_v1_coco_11_06_2017

mingw版本opencv (我的是3.41)
android版本opencv (我的是3.45)

结果展示

在这里插入图片描述
在这里插入图片描述

详细过程

主要的代码是融合了以前的工作Qt Android打开系统相机和相册,获得图片路径以及前几天的Qt+opencv dnn模块调用tensorflow模型,以及很久以前做的图片缩放移动的代码。

在Qt中通过opencv使用tensorflow目标检测模型主要是OpenCV调用TensorFlow预训练模型这篇文章的工作,感谢pan_jinquan的代码。

opencv的Mat格式与Qt的QImage格式相互转换,感谢opencv里的mat和Qt中的QImage相互转化这篇文章中提供的代码。

我在这些代码的基础上进行了拼接,新增的部分是使用opencv-android将模型部署到安卓手机上。

.Pro

Qt+opencv dnn模块调用tensorflow模型说的文中在pro文件中添加l库和头文件,大概因为版本不同,有几项需要修改,并且其中还有ZBAR是用来扫二维码的,这里我没有用到。
并且以下几项没有用到

#contains(ANDROID_TARGET_ARCH,armeabi-v7a) {
#    ANDROID_EXTRA_LIBS = \
#        E:/HZF/HZFProject/QtTest2/libnative_camera_r4.0.3.so \
#        E:/HZF/HZFProject/QtTest2/libiconv.so \
#        $$PWD/libzbarjni.so
#}

由于需要opencv的dnn模块,加一行

$$ANDROID_OPENCV/staticlibs/armeabi-v7a/libopencv_dnn.a  \

贴出完整的(android的是android大括号中用到的,windows上是win32大括号内用到的)

android {
ANDROID_OPENCV = D:/OpenCV-android-sdk/sdk/native

INCLUDEPATH += \
$$ANDROID_OPENCV/jni/include/opencv    \
$$ANDROID_OPENCV/jni/include/opencv2    \
$$ANDROID_OPENCV/jni/include            \


LIBS += $$ANDROID_OPENCV/libs/armeabi-v7a/libopencv_java3.so \
$$ANDROID_OPENCV/staticlibs/armeabi-v7a/libopencv_ml.a \
$$ANDROID_OPENCV/staticlibs/armeabi-v7a/libopencv_objdetect.a \
$$ANDROID_OPENCV/staticlibs/armeabi-v7a/libopencv_calib3d.a \
$$ANDROID_OPENCV/staticlibs/armeabi-v7a/libopencv_video.a \
$$ANDROID_OPENCV/staticlibs/armeabi-v7a/libopencv_features2d.a \
$$ANDROID_OPENCV/staticlibs/armeabi-v7a/libopencv_highgui.a \
$$ANDROID_OPENCV/staticlibs/armeabi-v7a/libopencv_dnn.a  \
$$ANDROID_OPENCV/staticlibs/armeabi-v7a/libopencv_flann.a \
$$ANDROID_OPENCV/staticlibs/armeabi-v7a/libopencv_imgproc.a \
$$ANDROID_OPENCV/staticlibs/armeabi-v7a/libopencv_core.a     \
$$ANDROID_OPENCV/3rdparty/libs/armeabi-v7a/libIlmImf.a  \
$$ANDROID_OPENCV/3rdparty/libs/armeabi-v7a/liblibjpeg-turbo.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 \

data.files += ssd_mobilenet_v1_coco_11_06_2017/frozen_inference_graph.pb
data.files += ssd_mobilenet_v1_coco_11_06_2017/ssd_mobilenet_v1_coco.pbtxt
data.path = /assets/ssd_mobilenet_v1_coco_11_06_2017/
INSTALLS += data


}

contains(ANDROID_TARGET_ARCH,armeabi-v7a) {
    ANDROID_EXTRA_LIBS = \
        $$PWD/../../../OpenCV-android-sdk/sdk/native/libs/armeabi-v7a/libopencv_java3.so
}

win32 {
INCLUDEPATH += D:\OpenCVMinGW3.4.1\include
LIBS += D:\OpenCVMinGW3.4.1\bin\libopencv_*.dll
}

使用模型

逻辑部分与windows相同,不同的地方是,模型文件需要打包进apk文件

Qt将资源通过assets打包进apk

data.files += ssd_mobilenet_v1_coco_11_06_2017/frozen_inference_graph.pb
data.files += ssd_mobilenet_v1_coco_11_06_2017/ssd_mobilenet_v1_coco.pbtxt
data.path = /assets/ssd_mobilenet_v1_coco_11_06_2017/
INSTALLS += data

打包进apk文件的模型文件不能直接通过"assets:/XXX"的地址使用,可能是opencv看不懂这种路径?
所以将其先放到android的普通路径,然后使用。

//从assets移动到普通路径下
bool Detector::moveFiles()
{
    AndroidSetup setup;
    QString dataDir = setup.getAppDataDir();
    qDebug()<<"data Dir:"<<dataDir;

    bool bMove = true;
    QString dstName = dataDir + "/frozen_inference_graph.pb";
    if(!QFile::copy("assets:/ssd_mobilenet_v1_coco_11_06_2017/frozen_inference_graph.pb", dstName))
        bMove = false;
    dstName = dataDir + "/ssd_mobilenet_v1_coco.pbtxt";
    if(!QFile::copy("assets:/ssd_mobilenet_v1_coco_11_06_2017/ssd_mobilenet_v1_coco.pbtxt",dstName))
        bMove = false;

    qDebug()<<"move status:"<<bMove;
    return bMove;
}

其他

完整的代码上传至github,我用的模型文件也在,只需要下载opencv即可。代码过于简陋(app经常卡死),仅供参考。
代码以后会继续改(里面的命名简直不忍直视,还有,opencv对图片的处理是裁切为正方形,感觉不太好,需要改),接下来几个月主要是做毕设了。

  • 3
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值