1. 程式人生 > >OpenCV中二維點求取進行仿射和透視變換之後的座標點方法

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')。