由於項目需要,最近學習了一下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