由于图形需要做畸变调整,找到两种方式,一种是仿射变换,另外一种是透视变换。目的都是为了将图形进行旋转、伸缩、扭曲后得到想要的图形效果。
仿射变换:可以将矩形转换成平行四边形,它可以将矩形的边压扁但必须保持边是平行的,也可以将矩形旋转或者按比例变化。
透视变换:提供了更大的灵活性,一个透视变换可以将矩阵转变成梯形。当然,平行四边形也是梯形,所以仿射变换是透视变换的子集
目的将一张图片可根据不同的坐标进行畸变调整。
为了对比两种变换方式,先使用了仿射变换的方式,对一张图片进行缩放,宽和高都变为原来的一半。但在使用Javacv中的Opencv做仿射变换时,遇到不稳定情况,每次生成的结果具有随机性,导致放弃使用该方式。代码如下
public static void fwarpAffine() { Mat src = opencv_imgcodecs.imread("E:\\javacv\\image-032.jpeg"); Mat dst = new Mat(); Point2f point2fSrc = new Point2f(3); point2fSrc.position(0).y(0).x(0);//TopLeft point2fSrc.position(1).y(0).x(src.cols()-1);//TopRight point2fSrc.position(2).y(src.rows()-1).x(0);//Bottom Left Point2f point2fDst = new Point2f(3); point2fDst.position(0).y(0).x(0);//TopLeft point2fDst.position(1).y(0).x(src.cols()/2);//TopRight point2fDst.position(2).y(src.rows()/2).x(0);//Bottom Left //Date date=new Date(); Mat affineTrans2 = opencv_imgproc.getAffineTransform(point2fSrc,point2fDst); opencv_imgproc.warpAffine(src, dst, affineTrans2, src.size()); //System.out.println(new Date().getTime()-date.getTime()); opencv_imgcodecs.imwrite("E:\\javacv\\image-032-1.jpeg", dst); }
原始图形
第一次生成,几乎是全黑色,并未将原始图片进行变换
第二次生成,宽度缩微原来的一半,长度发生了未知变化
第三次生成,宽度缩微原来的一半,图形发生了未知变化
经过多次尝试,仍然未得到想要的结果。
由于之前使用Opencv源码时,使用的透视变换,再次尝试使用Javacv中Opencv的透视变换
public static void warpPerspective() { Mat src = opencv_imgcodecs.imread("E:\\javacv\\Pic_001.bmp"); FloatPointer srcCorners = new FloatPointer(0,0,src.size().width(),0,src.size().width(),src.size().height(),0,src.size().height()); FloatPointer dstCorners = new FloatPointer(0,0,src.size().width()/2,0,src.size().width()/2,src.size().height()/2,0,src.size().height()/2); Mat srcmat = new Mat(new Size(2,4),5,srcCorners); Mat dstmat = new Mat(new Size(2,4),5,dstCorners); Mat perspective = opencv_imgproc.getPerspectiveTransform(srcmat,dstmat); Mat result = new Mat(); opencv_imgproc.warpPerspective(src,result,perspective,new Size(src.size().width(),src.size().height())); opencv_imgcodecs.imwrite("E:\\javacv\\Pic_001-1-1.bmp", result); }
生成结果,得到想要的图形
即使做其他的变换也没有任何问题
如果想用Javacv做畸变转换,建议使用透视变换。