Android for opencv(1)android使用opencv基本操作:讀寫 圖片,操作像素等

由於項目需要,最近學習了一下android裏配置及使用opencv進行圖像處理的相關操作,總結一下~

我配置opencv的方法是參照了android調用usb攝像頭這個開源項目,具體配置請參照,我主要總結一下android裏使用opencv進行圖像處理方面的使用

(一)讀取和保存圖像

import org.opencv.android.OpenCVLoader;
import org.opencv.android.Utils;
import org.opencv.core.Core;
import org.opencv.core.CvType;
import org.opencv.core.Mat;
import org.opencv.imgproc.Imgproc;

//android裏使用opencv讀取照片
String filename = Environment.getExternalStorageDirectory()+"/image/RGBimg.jpg";
Mat src = Imgcodecs.imread(filename); 
if(src.empty()) return;

//android裏使用opencv保存照片
Mat srcGray = new Mat ();
Imgproc.cvtColor(src, srcGray,Imgproc.COLOR_BGR2GRAY);
String filenamesrcGray = Environment.getExternalStorageDirectory()+"/image/gray.jpg";
Imgcodecs.imwrite(filenamesrcGray, srcGray);

(二)矩陣構建及圖像像素層面操作

圖像Mat構建:

//新建圖像Mat,矩陣行數、列數、圖像類型
Mat image1=new Mat(480,640, CvType.CV_8UC3);

///新建圖像Mat,矩陣行數、列數、圖像類型,以及矩陣的初始值(3通道,故爲三個值)
Mat image2=new Mat(new Size(640,480),CvType.CV_8UC3,new Scalar(255,0,0));

常見的圖像類型有:CV_8UC1;CV_8UC3;CV_8UC4;CV_32SC3 ;CV_32FC3;CV_64FC3等,其通項表達式爲:
CV_<顏色深度>(S|U|F)C<通道數>。

S代表SignedInt,有符號整型;
U代表UnsignedInt,無符號整型;
F代表Float,單精度浮點型或雙精度浮點型。

像素操作實例:讀取兩張相同尺寸的RGB圖像,然後生成並保存兩張圖像的平均值圖像。

Mat img1 = Imgcodecs.imread("img1.jpg");
Mat img2 = Imgcodecs.imread("img2.jpg");
Mat averigeImg = img1 .clone();//用於保存平均值圖像
       
for(int i=0;i<144;i++){ 
    for(int j=0;j<144;j++){
        double[] data1 = img1.get(i, j);
        double[] data2 = img2.get(i, j);      
        averigeImg.put(i,j,(data1[0]+data2[0])/2,(data1[1]+data2[1])/2,(data1[2]+data2[2])/2);
    }
}
Imgcodecs.imwrite("averigeImg.jpg", averigeImg);

(三)opencv常用的圖像處理操作

3.1 RGB圖像分離單個通道並保存,合成多個單通道爲一副圖像

try{
	Mat src=Imgcodecs.imread("./images/RGBimg.jpg");
	//讀取圖像到矩陣中,取灰度圖像
	if(src.empty()){
		throw new Exception("no image");
	}
        //分離RGB三個通道並保存
        List<Mat> dst=new java.util.ArrayList<Mat>(3);
	Core.split(src, dst);			
	Imgcodecs.imwrite("./images/b.jpg", dst.get(0));
	Imgcodecs.imwrite("./images/g.jpg", dst.get(1));
	Imgcodecs.imwrite("./images/r.jpg", dst.get(2));

        //合成單通道爲一副RGB圖像
	Mat mergeBGR=new Mat();
	Core.merge(dst, mergeBGR);
	Imgcodecs.imwrite("./images/merge.jpg", mergeBGR);

}catch(Exception e){
	System.out.println("error:" + e);
}

 

參考:

https://blog.csdn.net/u012991166/article/details/77992757 

https://blog.csdn.net/alzm006/article/details/80801971

https://blog.csdn.net/byna11sina11/article/details/79044738

https://blog.csdn.net/sileixinhua/article/details/72811044?utm_source=blogxgwz6

https://blog.csdn.net/u013195275/article/details/79867781

https://blog.csdn.net/sileixinhua/article/details/72811044

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章