當前位置:首頁 » 安卓系統 » androidopencvmat

androidopencvmat

發布時間: 2023-01-30 10:02:35

❶ opencv4android 中的2個Mat(Mat的值為2個Bitmap)如何變成一個Mat(即圖片融合)

用Core裡面的add或者addweighted來寫

❷ 如何在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,添加使用攝像機的許可權,即可測試是否成功了。

❸ android opencv 怎麼訓練模型

使用 Mat 中對矩陣元素的地址定位的知識 (參考博文:OpenCV中對Mat裡面depth,dims,channels,step,data,elemSize和數據地址計算的理解) Code 1 : int main() { //新建一個uchar類型的單通道矩陣(grayscale image 灰度圖) Mat m(400, 400, CV_8U, Scalar(0)); for (int col = 0; col < 400; col++) { for (int row = 195; row < 205; row++) { cout << (int)(*(m.data + m.step[0] * row + m.step[1] * col)) << " ==> "; //獲取第[row,col]個像素點的地址並用 * 符號解析 *(m.data + m.step[0] * row + m.step[1] * col) = 255; cout << (int)(*(m.data + m.step[0] * row + m.step[1] * col)) << endl; } } imshow("canvas", m); cvWaitKey(); return 0; } Output 1 : 0 ==> 255 0 ==> 255 0 ==> 255 0 ==> 255 0 ==> 255 0 ==> 255 ... Code1隻是演示了單通道的情況,對於多通道的例子,請看 Code2 然後再看 Code3。 Fn 2 : 使用 Mat::at 函數 原型 template<typename _Tp> inline _Tp& Mat::at(…) //其中參數有多個,也就是說 at 函數有多個重載 返回值為 Mat 類型, Mat 有個索引的重載,也就是 [] 符號的重載,用這個重載可以定位多通道數據,具體示例可以看下面代碼 下面的代碼把紅色通道值大於128的顏色的置為白色,左邊為原圖,右邊為處理過後的圖。

❹ opencv for android中mat的第4通道值用什麼表示

四個通道分別是啥?是否對應。
你原來圖片是什麼類型?一般是32位3通道。。
我估計你是這個問題:
..com/link?url=pDZfq55c98K0f_EGgfNMwpI-fvQjEb0gciY4N_

可以先按照原本的格式讀取進來,然後cvConvert。。。

新建一個目標模板即可。

❺ 如何在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)
然後調用即可

❻ 如何在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-bin\samples」下的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中定義的類型,事實上就是C\C++類型前面加上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 := $(call my-dir)
include $(CLEAR_VARS)
include /includeOpenCV.mk
ifeq (「$(wildcard $(OPENCV_MK_PATH))」,「」)
#try to load OpenCV.mk from default install location
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:=armeabi armeabi-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,得到下面的結果:
點擊使用C++ OpenCV進行處理,得到下面的結果:

❼ OpenCV (一)Mat基本操作以及灰度圖轉化

開始寫OpenCV這篇文章的時候,不由想到,我的大學計算機圖形學的第一門實操課程就是灰度轉化,拉普拉斯銳化等。其中灰度圖的轉化,是計算機圖形學基礎中基礎,這里就順著OpenCV的灰度的轉化,來看看OpenCV一些基礎的api。

本文地址: https://www.jianshu.com/p/7963c7dbaf92

先來看看OpenCV,基礎對象Mat,矩陣。什麼是矩陣,實際上沒有必要解釋,一般人都能夠明白數學意義上矩陣的含義。

OpenCV把每一個M * N的寬高圖像,看成M*N的矩陣。矩陣的每一個單元就對應著圖像中像素的每一個點。

我們如果放大圖中某個部分,就會發現如下情況

圖像實際上就如同矩陣一樣每個單元由一個像素點構成。

因為OpenCV的Mat每一個像素點,包含的數據不僅僅只有一個單純的數字。每一個像素點中包含著顏色通道數據。

稍微解釋一下顏色通道,我們可以把世間萬物肉眼能識別的顏色由3種顏色(R 紅色,G 綠色,B 藍色)經過調節其色彩飽和度組成的。也就是說通過控制RGB三種的色值大小(0~255)來調配新的顏色。

當我們常見的灰度圖,一般是單個顏色通道,因為只用黑白兩種顏色。我們常見的圖片,至少是三色通道,因為需要RGB三種顏色通道。

我們常見Android的Bitmap能夠設置ARGB_8888的標志位就是指能夠通過A(透明通道),R,G,B來控制圖片載入的顏色通道。

OpenCV為了更好的控制這些數據。因此採用了數學上的矩陣的概念。當OpenCV要控制如RGB三色通道的Mat,本質上是一個M * N * 3的三維矩陣。

但是實際上,我們在使用OpenCV的Mat的時候,我們只需要關注每個圖片的像素,而每個像素的顏色通道則是看成Mat中每個單元數據的內容即可

我們先來看看Mat的構造方法

現階段,實際上我們值得我們注意的是構造函數:

舉個例子:

這個mat矩陣將會製造一個高20,寬30,一個1位元組的顏色通道(也是Mat中每一個像素數據都是1位元組的unchar類型的數據),同時顏色是白色的圖片。

在這裡面我們能夠看到一個特殊的宏CV_8UC1。實際上這是指代OpenCV中圖片帶的是多少顏色通道的意思。

這4個宏十分重要,要時刻記住。

當我們需要把Mat 中的數據拷貝一份出來,我們應該調用下面這個api:

這樣就能拷貝一份像素數據到新的Mat中。之後操作新的Mat就不會影響原圖。

實際上,在本文中,我們能夠看到OpenCV是這么調用api讀取圖片的數據轉化為Mat矩陣。

OpenCV會通過imread去讀圖片文件,並且轉化為Mat矩陣。

能看見imread,是調用imread_把圖片中的數據拷貝的img這個Mat對象中。接著會做一次圖片的顛倒。這個方面倒是和Glide很相似。
文件:moles/imgcodecs/src/loadsave.cpp

這裡面做了幾個事情,實際上和FFmpge的設計十分相似。

其核心也是操作Mat中的像素指針,找到顏色通道,確定指針移動的步長,賦值圖片的數據到Mat矩陣中。核心如下:

其中還涉及到jpeg的哈夫曼演算法之類的東西,這里就不深入源碼。畢竟這是基礎學習。

什麼是灰度圖,灰度度圖實際上我們經常見到那些灰白的也可以納入灰度圖的范疇。實際上在計算機圖形學有這么一個公式:
將RGB的多顏色圖,通過 的演算法,將每一個像素的圖像的三顏色通道全部轉化為為一種色彩,通過上面的公式轉為為一種灰色的顏色。

一旦了解了,我們可以嘗試編寫灰度圖的轉化。我們通過矩陣的at方法訪問每一個像素中的數據。

為了形象表示矩陣指針,指向問題,可以把RGB在OpenCV的Mat看成如下分布:

記住OpenCV的RGB的順序和Android的不一樣,是BGRA的順序。和我們Android開發顛倒過來。

因此,我們可以得到如下的例子

我們經過嘗試之後,確實能夠把一個彩色的圖片轉化一個灰色圖片。但是這就是

這里介紹一下Mat的一個api:

實際上OpenCV,內置了一些操作,可以把RGB的圖像數據轉化灰度圖。

我們看看OpenCV實際上的轉化出來的灰度圖大小。我們通過自己寫的方法,轉化出來的灰度圖是119kb,而通過cvtColor轉化出來的是44kb。

問題出在哪裡?還記得嗎?因為只有灰白兩種顏色,實際上只需要一種顏色通道即可,而這邊還保留了3個顏色通道,也就說圖片的每一個像素點中的數據出現了沒必要的冗餘。

這樣就是44kb的大小。把三顏色通道的數據都設置到單顏色通道之後,就能進一步縮小其大小。

實際上在Android中的ColorMatrix中也有灰度圖轉化的api。

對畫筆矩陣進行一次,矩陣變化操作。

實際上就是做了一次矩陣運算。繪制灰度的時候相當於構建了這么一個矩陣

接著通過矩陣之間的相乘,每一行的 0.213f,0.715f,0.072f控制像素的每個通道的色值。
對於Java來說,灰度轉化的演算法是: ,把綠色通道的比例調大了。

在OpenCV中有這么兩個API,add和addWidget。兩者都是可以把圖像混合起來。

add和addWidget都是將像素合並起來。但是由於是像素直接相加的,所以容易造成像素接近255,讓整個像素泛白。

而權重addWeighted,稍微能減輕一點這種問題,本質上還是像素相加,因此打水印一般不是使用這種辦法。
等價於

saturate_cast這個是為了保證計算的值在0~255之間,防止越界。

飽和度,圖片中色值更加大,如紅色,淡紅,鮮紅
對比度:是指圖像灰度反差。相當於圖像中最暗和最亮的對比
亮度:暗亮度

控制對比度,飽和度的公式: , ,

因此當我們想要控制三通道的飽和度時候,可以通過alpha來控制色值成比例增加,beta控制一個色值線性增加。
如下:

在這里,看到了OpenCV會把所有的圖片看成Mat矩陣。從本文中,能看到Mat的像素操作可以能看到有兩種,一種是ptr像素指針,一種是at。ptr是OpenCV推薦的更加效率的訪問速度。

當然還有一種LUT的核心函數,用來極速訪問Mat矩陣中的像素。其原理是對著原來的色值進行預先的變換對應(設置一個顏色通道)。用來應對設置閾值等情況。

❽ 安卓opencvmat怎麼取值最快

安卓opencvmat取值如下。
1、利用at函數取值,單通道圖像讀取方式和三通道圖像讀取方式。
2、使用指針取值。
3、使用迭代器取值。
4、使用矩陣元素的地址定位知識取值。

熱點內容
convertlinux 發布:2024-05-02 18:20:00 瀏覽:705
zxingandroid簡化 發布:2024-05-02 17:47:53 瀏覽:189
貴州銀行卡查詢密碼是什麼 發布:2024-05-02 17:47:17 瀏覽:119
颶風演算法沒用 發布:2024-05-02 17:41:41 瀏覽:350
android鈴聲設置 發布:2024-05-02 17:40:01 瀏覽:485
php日記本 發布:2024-05-02 17:28:22 瀏覽:850
msc拒絕訪問 發布:2024-05-02 17:19:09 瀏覽:122
php函數漏洞 發布:2024-05-02 17:15:26 瀏覽:963
linux訪問localhost 發布:2024-05-02 17:04:11 瀏覽:880
劍三自動任務腳本 發布:2024-05-02 16:59:42 瀏覽:526