OpenCV中二维点求取进行仿射和透视变换之后的坐标点方法

我使用的是OpenCV 2.2版本。得到了一个透视矩阵,想把屏幕上的一个二维点经过这个透视矩阵进行变换,本身很简单的一个事情,却颇费了一番周折。原因是刚接触OpenCV,而且使用了OpenCV新添加的C++部分的矩阵类Mat,使用起来还真有点不顺手,因为OpenCV中没有向量的说法。一个矩阵变换一个向量就让我找了半天。

最终得以解决,还是使用了CvMat类而不是Mat类。代码如下:

///透视变换
1 CvPoint transformPoint( const CvPoint pointToTransform,  const CvMat* matrix) 
2 {
3      double coordinates[3] = {pointToTransform.x, pointToTransform.y, 1};
4     CvMat originVector = cvMat(3, 1, CV_64F, coordinates);
5     CvMat transformedVector = cvMat(3, 1, CV_64F, coordinates);
6     cvMatMul(matrix, &originVector, &transformedVector);
7     CvPoint outputPoint = cvPoint(( int)(cvmGet(&transformedVector, 0, 0) / cvmGet(&transformedVector, 2, 0)), ( int)(cvmGet(&transformedVector, 1, 0) / cvmGet(&transformedVector, 2, 0)));
8      return outputPoint;
9 }

///仿射变换
//objectXY原坐标; temp转换后坐标; angle角度大小.
cv::Point2f calDeta(float angle, cv::Point2f pointXY, cv::Point2f objectXY)
{
cv::Point2f resultPoint, temp;
double radian = 3.1415926*(angle/180.0);
temp.x = objectXY.x*cos(radian) + objectXY.y*sin(radian) + (1-cos(radian))*pointXY.x - sin(radian)*pointXY.y;
temp.y = -objectXY.x*sin(radian) + objectXY.y*cos(radian) + sin(radian)*pointXY.x + (1-cos(radian))*pointXY.y;
return temp;
}

这个函数一个很有用的地方就在于,原本二维图上的一个像素点位于(x,y)处,经过一个变换(仿射变换、透视变换)之后,求取它的新的坐标点(x', y')。
  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值