Javacv中Opencv 遇到的坑

由于图形需要做畸变调整,找到两种方式,一种是仿射变换,另外一种是透视变换。目的都是为了将图形进行旋转、伸缩、扭曲后得到想要的图形效果。

仿射变换:可以将矩形转换成平行四边形,它可以将矩形的边压扁但必须保持边是平行的,也可以将矩形旋转或者按比例变化。

透视变换:提供了更大的灵活性,一个透视变换可以将矩阵转变成梯形。当然,平行四边形也是梯形,所以仿射变换是透视变换的子集

目的将一张图片可根据不同的坐标进行畸变调整。

为了对比两种变换方式,先使用了仿射变换的方式,对一张图片进行缩放,宽和高都变为原来的一半。但在使用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做畸变转换,建议使用透视变换。

  • 9
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值