openCV(Java版):直接操作像素点的实例

最近看了平均脸的一些东西,试了一下午没有装成功dlib,因此就简单的将两张图片对应位置相加,然后取平均,虽然很简单,但是一直纠结在如何操作像素的问题。

程序具体如下:

import org.opencv.core.Core;
import org.opencv.core.Mat;
import org.opencv.core.Size;
import org.opencv.highgui.Highgui;
import org.opencv.imgproc.Imgproc;


public class testResize {
	public static void main(String[] args) {
        //resize_Image();
		average();
    }

	private static void resize_Image() {
		System.loadLibrary(Core.NATIVE_LIBRARY_NAME);

        Mat src = Highgui.imread("aver01.jpg");

        Mat dst = new Mat();
        Imgproc.resize(src, dst, new Size(144,144), 0, 0, Imgproc.INTER_AREA);
        //Imgproc.resize(src, dst, new Size(src.cols()/2,src.rows()/2), 0, 0, Imgproc.INTER_AREA);
        Highgui.imwrite("reaver01.jpg", dst);
        System.out.println("over");
	}
	
	public static void average(){
		System.loadLibrary(Core.NATIVE_LIBRARY_NAME);

        Mat aver01 = Highgui.imread("reaver01.jpg");
        Mat aver02 = Highgui.imread("aver02.jpg");
        Mat C = aver01.clone();//用于保存平均脸
        //Mat new = aver01-aver02;
        
        for(int i=0;i<144;i++){ 
        	for(int j=0;j<144;j++){
        		double[] data1 = aver01.get(i, j);
        		double[] data2 = aver02.get(i, j);
        		//System.out.print(" "+data[0]);原来get返回的三通道数据的地址,所哟需要采用数组的方式获得每一元的值
        		C.put(i,j,(data1[0]+data2[0])/2,(data1[1]+data2[1])/2,(data1[2]+data2[2])/2);
        	}
        }
        Highgui.imwrite("Hebing.jpg", C);
	}
}

在学习API的时候还是需要好好理解的:

1.get函数返回的是三张二维数组,所以在获取对应的double类型数组后需要采用数组方式访问每一色彩空间的值

2.put函数,前两个参数为要操作的像素点位置,第三个参数是不限个数的,这里应该是为应对不同通道数的图片

3.Highgui.imwrite("Hebing.jpg", C);这一句按照我自己的理解就是Java不能直接保存修改后的图片,所以直接加这一句,在C++下,是可以直接显示图片的

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值