最近看了平均脸的一些东西,试了一下午没有装成功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++下,是可以直接显示图片的