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 dst=new java.util.ArrayList(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

你可能感兴趣的:(opencv,java/android)