关于cv::warpaffine函数

原文地址: http://blog.csdn.net/txdb/article/details/6443364

在做汉字 验证码识别时用warpAffine做了个图像旋转,发现有点问题。仔细看了下这个函数的说明,如下:

//! warps the image using affine transformation
CV_EXPORTS_W void warpAffine( const Mat& src, CV_OUT Mat& dst,
                            const Mat& M, Size dsize,
                            int flags=INTER_LINEAR,
                            int borderMode=BORDER_CONSTANT,
                            const Scalar& borderValue=Scalar());

 

对应的解释网址http://opencv.willowgarage.com/documentation/cpp/geometric_image_transformations.html

 

图像的变换通过下面的公式完成

M 矩阵可以通过cv::Mat mat = cv::getRotationMatrix2D(center, angle, 1.0); 产生

其中center确定了旋转的中心点,angle是旋转的角度,1.0是放大的倍数。

 

M矩阵也可以指定为其他的形式,如自己设置M的值,

以center(23,23),angle=59.9,factor=1.0旋转图像对应的M值为

       注意M是CV_64F的。这个类型用at<t>似乎无法访问,它认为M是unsigned类型的。

需要强制类型转换double* m = (double*)M.data;,然后通过指针进行读取。具体代码可以参考getRotationMatrix2D的源码。

 

这个值通过下面的公式计算得到

第二行应该是-β α βx_0+(1-α)y_0。

 

在做字符旋转的时候,-59度的角度倾斜矫正有错误,而

-32度的角度是正确的。

 

原因出在cv::minAreaRect上,计算左转的倾斜角度时有90的相差,后面这个图是右转的,前面是左转的。

如何知道该不该+这个90度呢?源码很长,没仔细看。大致是用最左下角的点为conner,确定两个边来计算的,问题是取那个边呢?用位置关系好像无论怎么取,左转和右转的时候,这个边都有个切换。(懒的画图了。大家可以自己画个图看看)2个边向量刚好有90度的差。一种方法是确定取长边,但有些字不适合。

 

另外warpAffine有个参数需要注意:WARP_INVERSE_MAP



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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值