導航:首頁 > 操作系統 > qtopencvandroid

qtopencvandroid

發布時間:2022-09-27 03:42:19

1. C++寫的OpenCV程序怎麼實現在android平台

使用ndk可以在android里使用C++。
去下一個android-ndk
然後去裝一個opencv for android
http://opencv.willowgarage.com/wiki/Android

2. 如何在Android 上使用OpenCV的擴展包

要在Android 上使用OpenCV的擴展包,可以靜態導入,即接拷貝 SDK 到項目中作為庫。
靜態導入的步驟:
1: 從 DOWNLOADS | OpenCV 下載需要的 SDK 。
2: 在 AS 中點擊 -> File -> New -> Import Mole, 把 sdk/javafolder 導入進來。
3: 修改 build.gradle 文件中的 compileSdkVersion、 buildToolsVersion、 minSdkVersion 和 targetSdkVersion,讓它們適用於當前的版本。
4: 選中項目 right-click the dependent mole -> Open Mole Settings, 選擇 Dependencie,點擊加號按鈕,選擇 Mole Dependency 並選擇剛才導入的 Moudle。
5: 把SDK中 sdk/native 文件夾下的 libs 復制到項目中的 app/src/main 當中,並且改名為 "jniLibs"。
測試的時候在任意界面運行下面的代碼:

if (!OpenCVLoader.initDebug()){
// OpenCV is OK!
}

3. 如何在Qt中使用OpenCV

用Qt可以方便地創造好看的GUI,要是能和OpenCV結合起來我們就能寫出蠻好的一個處理或者管理圖片的軟體。怎麼在Qt中使用OpenCV呢?請看下文:
註:我的Qt版本4.7.4(C:\QtSDK\Desktop\Qt\4.7.4),OpenCV版本2.3.1(E:\opencv),Qt下有MinGW編譯器(C:\QtSDK\mingw)
具體步驟:
Step1>
CMake OpenCV,使用CMake)生成OpenCV庫的makefile文件,需要注意的是解壓出來的OpenCV存儲路徑中的文件夾不要帶有空格或者中文(我的是E:\OpenCV,不要用類似於E:\工程\opencv, E:\Open CV這種),打開CMake,指定源碼位置(就是OpenCV解壓出來的地方)和存放生成文件的地方,Configure彈出如圖對話框,選擇MinGW Makefiles和Specify native compilers

跳出對話框用以指定C++和C的編譯器路徑,C用gcc.exe,在QtSDK目錄下的mingw/bin子目錄中,C++用g++.exe:

然後再次Configure,無錯誤後選中WITH_QT

再次Configure會出現下圖信息提示找不到Qt的Qmake可執行文件

手動指定Qmake.exe所在目錄(在.\QtSDK\Desktop\Qt\4.7.4\mingw\bin下面):

再次Configure,無錯誤後 Generate。
Step2>
編譯
1> Cmd命令 轉到Generate到的目錄(我的是如上圖所示的E:\opencv\MinGW)
>> cd E:\opencv\MinGW
2> Cmd命令 編譯文件
>> mingw32-make
3> Cmd命令 編譯INSTALL
>> mingw32-make install
過程如圖:

Step3>
在存放Generate生成的目錄下有一個install目錄,編譯好的所有結果都在這里啦,包括bin,lib和include,把bin目錄放到環境變數path中,其實可以把整個install目錄拷貝到某個地方使用,這樣就可以把opencv目錄裡面的內容全刪了,省的占空間。我就把install裡面的內容全都搬到了E盤下的OpenCVforQt目錄下了(0.0)。

Example:
在用QtCreator和OpenCV的時候,修改用到opencv的工程的.pro文件就可以了,添加include和lib,例如:
QT += core gui
TARGET = Win_OpenCV_Test
TEMPLATE = app

INCLUDEPATH += E:\OpenCVforQt\include
INCLUDEPATH += E:\OpenCVforQt\include\opencv
INCLUDEPATH += E:\OpenCVforQt\include\opencv2

LIBS += E:\OpenCVforQt\lib\libopencv_core231.dll.a
LIBS += E:\OpenCVforQt\lib\libopencv_highgui231.dll.a
LIBS += E:\OpenCVforQt\lib\libopencv_imgproc231.dll.a

SOURCES += main.cpp

4. 如何在Android中使用OpenCV

如何在Android程序中使用OpenCV

有兩種方式(重點講後面一種):

1.使用OpenCV Java API。

OpenCV安裝路徑"F:OpenCV-2.3.1-android-bin"下有兩個文件夾,

將文件夾"OpenCV-2.3.1"拷貝到你的Eclipse工作空間所在的目錄,也就是在你的項目的上一級目錄中,然後導入到工作空間中,在Package Explorer中選擇你的項目,單機右鍵在彈出菜單中選擇Properties,然後在彈出的Properties窗口中左側選擇Android,然後點擊右下方的Add按鈕,選擇OpenCV-2.3.1並點擊OK,

此時,展開你的項目樹,你可以看到新加了一個OpenCV-2.3.1_src目錄,如下圖,那麼就是正確添加了OpenCV Java API,否則就是你放置OpenCV-2.3.1的目錄路徑不正確。

然後就可以在你的Java源文件中導入OpenCV的API包,並且使用OpenCV API了,OpenCV API的包的形式如下:

Org.opencv.(OpenCV模塊名).(OpenCV類名)

例如:

Org.opencv.core.Mat

2.利用JNI編寫C++ OpenCV代碼,通過Android NDK創建動態庫(.so)

新建一個工作空間,例如"TestOpenCV",在Window->Preferences中設置好Android SDK的路徑。

然後新建一個Android項目,Build Target選擇Android2.2,命名為"HaveImgFun",活動名改為HaveImgFun,Package name中填寫com.testopencv.haveimgfun,最後點擊finish。

如同使用OpenCV Java API那樣,將OpenCV-2.3.1文件夾拷貝到與工作空間同一級目錄中;另外,將"F:OpenCV-2.3.1-android-binsamples"下的includeOpenCV.mk文件拷貝到和項目HaveImgFun同一級目錄中:

(上面這個各個文件夾和文件的放置很重要,因為OpenCV-2.3.1下的OpenCV.mk中有很多相對路徑的指定,如果不是這樣放置,在NDK生成動態庫時可能會報文件或文件夾無法找到的錯誤)

選擇Package Explorer中你的項目,右鍵選擇new->folder,新建一個名為jni的文件夾,用來存放你的c/c++代碼。

然後把res->layout下的main.xml的內容改為下面所示:

1 <?xml version="1.0" encoding="utf-8"?>
2 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
3 android:orientation="vertical"
4 android:layout_width="fill_parent"
5 android:layout_height="fill_parent"
6 >
7 <Button android:layout_height="wrap_content"
8 android:layout_width="fill_parent"
9 android:id="@+id/btnNDK"
10 android:text="使用C++ OpenCV進行處理" />
11 <Button android:layout_height="wrap_content"
12 android:layout_width="fill_parent"
13 android:id="@+id/btnRestore"
14 android:text="還原" />
15 <ImageView android:id="@+id/ImageView01"
16 android:layout_width="fill_parent"
17 android:layout_height="fill_parent" />
18 </LinearLayout>

上面的代碼就是一個線性布局裡麵包含2個按鈕加上一個顯示圖像的ImageView

在文件夾src下的com.testopencv.haveimgfun包中新建一個類用於包裝使用了opencv c++代碼的動態庫的導出函數,類名為LibImgFun。

Eclipse會為你創建一個新的文件LibImgFun.java,將裡面的內容改為:

1 package com.testopencv.haveimgfun;
2 public class LibImgFun {
3 static {
4 System.loadLibrary("ImgFun");
5 }
6 /**
7 * @param width the current view width
8 * @param height the current view height
9 */
10 public static native int[] ImgFun(int[] buf, int w, int h);
11 }

從上面的代碼可以得知,我們的動態庫名字應該為「libImgFun.so」,注意"public static native int[] ImgFun(int[] buf, int w, int h)"中的native關鍵字,表明這個函數來自native code。static表示這是一個靜態函數,這樣就可以直接用類名去調用。

在jni文件夾下建立一個"ImgFun.cpp"的文件,內容改為下面所示:

1 #include <jni.h>
2 #include <stdio.h>
3 #include <stdlib.h>
4 #include <opencv2/opencv.hpp>
5 using namespace cv;
6
7 extern "C"
8 {
9 JNIEXPORT jintArray JNICALL Java_com_testopencv_haveimgfun_LibImgFun_ImgFun(JNIEnv* env, jobject obj, jintArray buf, int w, int h);
10 JNIEXPORT jintArray JNICALL Java_com_testopencv_haveimgfun_LibImgFun_ImgFun(JNIEnv* env, jobject obj, jintArray buf, int w, int h){
11
12 jint *cbuf;
13 cbuf = env->GetIntArrayElements(buf, false);
14 if(cbuf == NULL)
15 {
16 return 0;
17 }
18
19 Mat myimg(h, w, CV_8UC4, (unsigned char*)cbuf);
20 for(int j=0;j<myimg.rows/2;j++)
21 {
22 myimg.row(j).setTo(Scalar(0,0,0,0));
23 }
24
25 int size=w * h;
26 jintArray result = env->NewIntArray(size);
27 env->SetIntArrayRegion(result, 0, size, cbuf);
28 env->ReleaseIntArrayElements(buf, cbuf, 0);
29 return result;
30 }
31 }

上面的代碼中#include <jni.h>是必須要包含的頭文件,#include <opencv2/opencv.hpp>是opencv要包含的頭文件。

動態庫要導出的函數如下聲明:

JNIEXPORT jintArray JNICALL Java_com_testopencv_haveimgfun_LibImgFun_ImgFun(JNIEnv* env, jobject obj, jintArray buf, int w, int h);

JNIEXPORT 和JNICALL是必須要加的關鍵字

jintArray就是int[],這里返回類型要麼為空,要麼為jni中定義的類型,事實上就是CC++類型前面加上j,如果是數組,則在後面加上Array。

函數名的命名規則如下:

Java_(包路徑)_(類名)_(函數名) (JNIEnv *env, jobject obj, 自己定義的參數...)

包路徑中的"."用"_"(下劃線)代替,類名就是上麵包裝該動態庫函數的類的名字,最後一個才是真正的函數名;JNIEnv *env和jobject obj這兩個參數時必須的,用來調用JNI環境下的一些函數;後面就是你自己定義的參數。在這里,jintArray buf代表了傳進來的圖像的數據,int w是圖像的寬,int h是圖像的高。

這個函數的功能是將傳進來的圖像的上半部分塗成黑色。

然後再在jni下新建兩個文件"Android.mk"文件和"Application.mk"文件,這兩個文件事實上就是簡單的Makefile文件。

其中將Android.mk的內容改為如下所示:

LOCAL_PATH:=$(callmy-dir)

include$(CLEAR_VARS)

include../includeOpenCV.mk

ifeq("$(wildcard$(OPENCV_MK_PATH))","")

#trytoloadOpenCV.mkfromdefaultinstalllocation

include$(TOOLCHAIN_PREBUILT_ROOT)/user/share/OpenCV/OpenCV.mk

else

include$(OPENCV_MK_PATH)

endif

LOCAL_MODULE:=ImgFun

LOCAL_SRC_FILES:=ImgFun.cpp

include$(BUILD_SHARED_LIBRARY)

Application.mk的內容改為如下所示:

APP_STL:=gnustl_static

APP_CPPFLAGS:=-frtti-fexceptions

APP_ABI:=armeabiarmeabi-v7a

其中APP_ABI指定的是目標平台的CPU架構。(經過很多測試,android2.2必須指定為armeabi,android2.2以上的使用armeabi-v7a,如果沒有設置對,很有可能安裝到android虛擬機失敗,當然你同時如上面寫上也是可以的)

上面的步驟完成後,就可以使用NDK生成動態庫了,打開cygwin,cd到項目目錄下:

輸入$NDK/ndk-build命令,開始創建動態庫。

這時候刷新Eclipse的Package Explorer會出現兩個新的文件夾obj和libs。

現在,只剩最後一步完成這個測試程序。

將一張圖片,例如"lena.jpg"放到項目res->drawable-hdpi目錄中並刷新該目錄。

然後將HaveImgFun.java的內容改為下面所示:

1 package com.testopencv.haveimgfun;
2
3 import android.app.Activity;
4 import android.graphics.Bitmap;
5 import android.graphics.Bitmap.Config;
6 import android.graphics.drawable.BitmapDrawable;
7 import android.os.Bundle;
8 import android.widget.Button;
9 import android.view.View;
10 import android.widget.ImageView;
11
12 public class HaveImgFun extends Activity{
13 /** Called when the activity is first created. */
14 ImageView imgView;
15 Button btnNDK, btnRestore;
16
17 @Override
18 public void onCreate(Bundle savedInstanceState) {
19 super.onCreate(savedInstanceState);
20 setContentView(R.layout.main);
21
22 this.setTitle("使用NDK轉換灰度圖");
23 btnRestore=(Button)this.findViewById(R.id.btnRestore);
24 btnRestore.setOnClickListener(new ClickEvent());
25 btnNDK=(Button)this.findViewById(R.id.btnNDK);
26 btnNDK.setOnClickListener(new ClickEvent());
27 imgView=(ImageView)this.findViewById(R.id.ImageView01);
28 Bitmap img=((BitmapDrawable) getResources().getDrawable(R.drawable.lena)).getBitmap();
29 imgView.setImageBitmap(img);
30 }
31
32 class ClickEvent implements View.OnClickListener{
33 public void onClick(View v){
34 if(v == btnNDK){
35 long current=System.currentTimeMillis();
36 Bitmap img1=((BitmapDrawable) getResources().getDrawable(R.drawable.lena)).getBitmap();
37 int w=img1.getWidth(),h=img1.getHeight();
38 int[] pix = new int[w * h];
39 img1.getPixels(pix, 0, w, 0, 0, w, h);
40 int[] resultInt=LibImgFun.ImgFun(pix, w, h);
41 Bitmap resultImg=Bitmap.createBitmap(w, h, Config.RGB_565);
42 resultImg.setPixels(resultInt, 0, w, 0, 0,w, h);
43 long performance=System.currentTimeMillis()-current;
44 imgView.setImageBitmap(resultImg);
45 HaveImgFun.this.setTitle("w:"+String.valueOf(img1.getWidth())+",h:"+String.valueOf(img1.getHeight())+"NDK耗時"+String.valueOf(performance)+" 毫秒");
46 } else if(v == btnRestore){
47 Bitmap img2=((BitmapDrawable) getResources().getDrawable(R.drawable.lena)).getBitmap();
48 imgView.setImageBitmap(img2);
49 HaveImgFun.this.setTitle("使用OpenCV進行圖像處理");
50 }
51 }
52 }
53 }



點擊全部保存,OK,現在可以選擇一個Android虛擬機運行看一下效果,配置好Run Configuration然後點擊Run,得到下面的結果:

5. mac使用qt+opencv出問題,求助各位大大

1.New -> Android App Project 如果找不到,可以去Other -> android找到,也是一樣的: 2.然後依次輸入工程信息: 3.運行創建好的程序 4.從模擬器上看到運行效果:

6. 如何整合 QT 5.2.0 與 OpenCV2.4.6 和 Android

由於缺少庫定義 pro 文件 (libIlmImf.a) 中出現的問題。
pro 文件中的更正的庫定義,如下所示:
ANDROID_OPENCV = C:/OpenCV-2.4.6-android-sdk/sdk/native
LIBS += \
$$ANDROID_OPENCV/libs/x86/libopencv_contrib.a \
$$ANDROID_OPENCV/libs/x86/libopencv_legacy.a \
$$ANDROID_OPENCV/libs/x86/libopencv_ml.a \
$$ANDROID_OPENCV/libs/x86/libopencv_objdetect.a \
$$ANDROID_OPENCV/libs/x86/libopencv_calib3d.a \
$$ANDROID_OPENCV/libs/x86/libopencv_video.a \
$$ANDROID_OPENCV/libs/x86/libopencv_features2d.a \
$$ANDROID_OPENCV/libs/x86/libopencv_highgui.a \
$$ANDROID_OPENCV/libs/x86/libopencv_androidcamera.a \
$$ANDROID_OPENCV/libs/x86/libopencv_flann.a \
$$ANDROID_OPENCV/libs/x86/libopencv_imgproc.a \
$$ANDROID_OPENCV/libs/x86/libopencv_core.a \
$$ANDROID_OPENCV/3rdparty/libs/x86/libIlmImf.a \
$$ANDROID_OPENCV/3rdparty/libs/x86/liblibpng.a \
$$ANDROID_OPENCV/3rdparty/libs/x86/liblibtiff.a \
$$ANDROID_OPENCV/3rdparty/libs/x86/liblibjpeg.a \
$$ANDROID_OPENCV/3rdparty/libs/x86/liblibjasper.a \
$$ANDROID_OPENCV/3rdparty/libs/x86/libtbb.a

(但另一個問題發生時,運行在 android 模擬器造成的"不連著色器程序"。我仍在但這是另一個問題的問題)
編輯:我通過切換到 AVD API17,googleapi,x 86 不 NEXUS S) 從 GenyMotion 模擬器和設置"使用主機 GPU"標志及向臨文件中添加配置 + = opengl 解決問題的"著色器程序不鏈接"

7. 如何在Android中使用OpenCV

1、下載
進入官網下載OpenCV4Android並解壓。

其中,sdk目錄即是我們開發opencv所需要的類庫;samples目錄中存放著若干opencv應用示例(包括人臉檢測等),可為我們進行android下的opencv開發提供參考;doc目錄為opencv類庫的使用說明及api文檔等;而apk目錄則存放著對應於各內核版本的OpenCV_2.4.3.2_Manager_2.4應用安裝包。此應用用來管理手機設備中的opencv類庫,在運行opencv應用之前,必須確保手機中已經安裝了OpenCV_2.4.3.2_Manager_2.4_*.apk,否則opencv應用將會因為無法載入opencv類庫而無法運行(下篇文章會介紹不提前安裝openCV Manager,即可運行openCV的方法)。
2、將OpenCV引入Android Studio
在Android Studio中選擇File->Import Mole,找到OpenCV解壓的路徑,選擇sdk/java文件夾。

3、更新build.gradle信息
在Android Studio中的左上角選擇Project視圖,在oepnCVLibrary2411文件夾里,打開build.gradle(有很多重名的文件,一定找對openCV庫文件下的),修改文件中的1)compileSdkVersion 2)buildToolsVersion 3) minSdkVersion 4)targetSdkVersion,將其內容與app文件夾下的build.gradle中信息相一致。點擊上方提示的黃色提示框內的Try Again進行更新。
4、添加Mole Dependency
右鍵app文件夾,選擇Open Mole Settings,在app mole的Dependencies一欄中,點擊右上角的綠色加號,將openCVLibrary2411添加進去,點擊確定。

5、復制libs文件夾到項目中
在OpenCV的解壓包中,將sdk-->native-->libs文件夾復制,粘貼在Project視圖下app-->src-->main目錄下,並將其重命名為jniLibs。
自此,OpenCV的環境就配置好了。可以將OpenCV-android-sdk-->samples-->tutorial-1-camerapreview中的layout文件,java文件,放入工程中,修改AndroidManifest.xml,添加使用攝像機的許可權,即可測試是否成功了。

8. 如何在qt中使用opencv,還請過來人指教

Step1>

CMake OpenCV,使用CMake生成OpenCV庫的makefile文件,需要注意的是解壓出來的OpenCV存儲路徑中的文件夾不要帶有空格或者中文(我的是E:\OpenCV,不
要用類似於E:\工程\opencv, E:\Open
CV這種),打開CMake,指定源碼位置(就是OpenCV解壓出來的地方)和存放生成文件的地方,Configure彈出如圖對話框,選擇MinGW Makefiles和Specify native compilers

跳出對話框用以指定C++和C的編譯器路徑,C用gcc.exe,在QtSDK目錄下的mingw/bin子目錄中,C++用g++.exe:

然後再次Configure,無錯誤後選中WITH_QT

再次Configure會出現下圖信息提示找不到Qt的Qmake可執行文件

手動指定Qmake.exe所在目錄(在.\QtSDK\Desktop\Qt\4.7.4\mingw\bin下面):

再次Configure,無錯誤後 Generate。

Step2>

編譯

1> Cmd命令 轉到Generate到的目錄(我的是如上圖所示的E:\opencv\MinGW)

>> cd E:\opencv\MinGW

2> Cmd命令 編譯文件

>> mingw32-make

3> Cmd命令 編譯INSTALL

>> mingw32-make install

過程如圖:

Step3>

在存放Generate生成的目錄下有一個install目錄,
編譯好的所有結果都在這里啦,包括bin,lib和include,把bin目錄放到環境變數path中,其實可以把整個install目錄拷貝到某個地
方使用,這樣就可以把opencv目錄裡面的內容全刪了,省的占空間。我就把install裡面的內容全都搬到了E盤下的OpenCVforQt目錄下了
(0.0)。

Example:

在用QtCreator和OpenCV的時候,修改用到opencv的工程的.pro文件就可以了,添加include和lib,例如:

QT += core gui

TARGET = Win_OpenCV_Test
TEMPLATE = app
INCLUDEPATH += E:\OpenCVforQt\include
INCLUDEPATH += E:\OpenCVforQt\include\opencv
INCLUDEPATH += E:\OpenCVforQt\include\opencv2
LIBS += E:\OpenCVforQt\lib\libopencv_core231.dll.a
LIBS += E:\OpenCVforQt\lib\libopencv_highgui231.dll.a
LIBS += E:\OpenCVforQt\lib\libopencv_imgproc231.dll.a
SOURCES += main.cpp

一個例子:

Code Snippet

#include <QtGui/QApplication>
#include <QtGui/QMessageBox>
#include <cv.h>
#include <highgui.h>
using namespace cv;

int main(int argc, char *argv[])
{
QApplication app(argc, argv);
Mat giraffe = imread("f:/giraffe.jpg");
if(giraffe.empty())
{
QMessageBox::warning(0, "Warn", "Empty image!", QMessageBox::Ok);
}
else
{
imshow("giraffe [press any key to exit]", giraffe);
waitKey();
}
return 0;
}

閱讀全文

與qtopencvandroid相關的資料

熱點內容
phpredis所有keys 瀏覽:985
朋友賣房要解壓嗎 瀏覽:107
sar命令安裝 瀏覽:169
安卓怎麼看我自己去過哪裡 瀏覽:283
演算法分析里log沒有底數嗎 瀏覽:221
伺服器卡頓怎麼連接 瀏覽:957
手機拍照文件夾自動生成 瀏覽:787
瀏覽器如何運行在伺服器端 瀏覽:790
collinux 瀏覽:449
日本歐美韓國推理片電影大分享 瀏覽:615
怎麼下載香港app游戲 瀏覽:217
加密貨幣或迎來新的上漲趨勢 瀏覽:827
電腦桌面的文件夾怎麼發的 瀏覽:194
linuxkangle 瀏覽:150
程序員負債 瀏覽:154
怎麼把解壓的游戲放到桌面上 瀏覽:981
文件夾不存在刪除不了怎麼辦 瀏覽:835
android關機命令行 瀏覽:152
網易雲伺服器支持接入什麼功能 瀏覽:649
編程器用法hpz420 瀏覽:160