天天看點

在win和android上同時進行OpenCV程式設計

基于qt進行Android圖像處理項目設計的時候,初期可以首先在windows上進行調試,等到比較成熟後将代碼轉換到adnroid上。這裡僅以widget為例,如果使用qtquick是一樣的。具體以下幾步:

1、項目建立的時候,選擇android和desktop兩類(前提是安裝的時候已經都選擇了)
在win和android上同時進行OpenCV程式設計

這樣,在程式設計的過程中,我們就可以通過切換來進行選擇

在win和android上同時進行OpenCV程式設計

如果對于已經配置好kti(建構套件)的項目,可以先删除目錄下的.pro.user檔案,而後重新打開項目,則自動跳出建構套件配置界面

在win和android上同時進行OpenCV程式設計
2、配置檔案:

對配置檔案的修改是主要知識點所在,首先在不同平台下,要填寫不同的字首。對于pc平台是

win32 {……}

對于Android平台是

android {……}

大小寫不可寫錯,此外就是OpenCV基礎環境的配置。對于pc平台需要做的是配置系統路徑、設定include和lib路徑;對于Android平台需要做的是設定include和lib路徑,并且将libopencv_java3.so拷貝到最後的.apk中去。參考的配置檔案如下,其中重要的部分已經加粗。

QT += quick QT += multimedia CONFIG += c++11

win32 {

message("目前使用PC配置")

WIN32_OPENCV = D:/JsxyheluOpenCV/New-QT-dll/install

INCLUDEPATH += \

$$WIN32_OPENCV/include/opencv \

$$WIN32_OPENCV/include/opencv2 \

$$WIN32_OPENCV/include

LIBS += \

$$WIN32_OPENCV/x86/mingw/lib/

libopencv_core320.dll.a

\

$$WIN32_OPENCV/x86/mingw/lib/libopencv_highgui320.dll.a\

$$WIN32_OPENCV/x86/mingw/lib/libopencv_imgproc320.dll.a\

$$WIN32_OPENCV/x86/mingw/lib/libopencv_imgcodecs320.dll.a\

$$WIN32_OPENCV/x86/mingw/lib/libopencv_highgui320.dll.a\

$$WIN32_OPENCV/x86/mingw/lib/libopencv_videoio320.dll.a

}

android {

message("目前使用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_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_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_OPENCV/3rdparty/libs/armeabi-v7a/libtegra_hal.a \

$$ANDROID_OPENCV/libs/armeabi-v7a/libopencv_java3.so

}

# The following

define

makes your compiler emit warnings

if

you use # any feature of Qt which as been marked deprecated (the exact warnings # depend on your compiler). Please consult the documentation of the # deprecated API in order to know how to port your code away from it. DEFINES += QT_DEPRECATED_WARNINGS # You can also make your code fail to compile

if

you use deprecated APIs. # In order to

do

so, uncomment the following line. # You can also select to disable deprecated APIs only up to a certain version of Qt. #DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000 # disables all the APIs deprecated before Qt 6.0.0 SOURCES += main.cpp \ todocpp.cpp \ calibration.cpp RESOURCES += qml.qrc # Additional import path used to resolve QML modules in Qt Creator's code model QML_IMPORT_PATH = # Additional import path used to resolve QML modules just for Qt Quick Designer QML_DESIGNER_IMPORT_PATH = # Default rules for deployment. qnx: target.path = /tmp/$${TARGET}/bin else: unix:!android: target.path = /opt/$${TARGET}/bin !isEmpty(target.path): INSTALLS += target HEADERS += \ todocpp.h \ calibration.h DISTFILES += \ android/AndroidManifest.xml \ android/gradle/wrapper/gradle-wrapper.jar \ android/gradlew \ android/res/values/libs.xml \ android/build.gradle \ android/gradle/wrapper/gradle-wrapper.properties \ android/gradlew.bat 

contains(ANDROID_TARGET_ARCH,armeabi-v7a) {

ANDROID_EXTRA_LIBS = \

D:/OpenCV-android-sdk/sdk/native/libs/armeabi-v7a/libopencv_java3.so

}

ANDROID_PACKAGE_SOURCE_DIR = $$PWD/android

并設定正确的環境變量(如何在Windows和Android平台下編譯OpenCV請參考部落格中其它博文)

在win和android上同時進行OpenCV程式設計
3、編寫界面和代碼

為說明友善,在簡單的widget上面顯示一個自己生成的圓。其中圓的生成和最終顯示都調用OpenCV代碼。那麼如果這個是成功的,則證明OpenCV環境配置正确。

#

include

"mainwindow.h" #

include

"ui_mainwindow.h"

using

namespace

cv; Mat tmp; MainWindow::MainWindow(QWidget *parent) :     QMainWindow(parent),     ui(

new

Ui::MainWindow) {     ui->setupUi(

this

); } MainWindow::~MainWindow() {    

delete

ui; }

void

MainWindow::on_pushButton_pressed() {     Mat src(Size(640,480),CV_8UC1,cv::Scalar(255));     circle(src,Point(100,100),100,Scalar(0),-1);     // 格式轉換     QPixmap qpixmap = Mat2QImage(src);     // 将圖檔顯示到label上     ui->label->setPixmap(qpixmap); } //格式轉換 QPixmap Mat2QImage(Mat src) {     QImage img;     //根據QT的顯示方法進行轉換    

if

(src.channels() == 3)     {         cvtColor( src, tmp, CV_BGR2RGB );         img = QImage( (

const

unsigned

char

*)(tmp.data), tmp.cols, tmp.rows, QImage::Format_RGB888 );     }    

else

    {         img = QImage( (

const

unsigned

char

*)(src.data), src.cols, src.rows, QImage::Format_Grayscale8 );     }     QPixmap qimg = QPixmap::fromImage(img) ;    

return

qimg; }

4、結果和小結
在win和android上同時進行OpenCV程式設計
在win和android上同時進行OpenCV程式設計

在兩類平台上進行配置,其原始原因是為了能夠加快項目初期,Android+OpenCV處理程式的調試速度,主要的難點在于.pro檔案的配置。

在項目實踐過程中的如何提高實作速度?我們在後面的文章中繼續分享。

感謝閱讀至此,希望有所幫助!

來自為知筆記(Wiz)

目前方向:圖像拼接融合、圖像識别

聯系方式:[email protected]

繼續閱讀