我使用的是OpenCV 2.2版本。得到了一個(gè)透視矩陣,想把屏幕上的一個(gè)二維點(diǎn)經(jīng)過這個(gè)透視矩陣進(jìn)行變換,本身很簡(jiǎn)單的一個(gè)事情,卻頗費(fèi)了一番周折。原因是剛接觸OpenCV,而且使用了OpenCV新添加的C++部分的矩陣類Mat,使用起來還真有點(diǎn)不順手,因?yàn)镺penCV中沒有向量的說法。一個(gè)矩陣變換一個(gè)向量就讓我找了半天。
最終得以解決,還是使用了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 }
這個(gè)函數(shù)一個(gè)很有用的地方就在于,原本二維圖上的一個(gè)像素點(diǎn)位于(x,y)處,經(jīng)過一個(gè)變換(仿射變換、透視變換)之后,求取它的新的坐標(biāo)點(diǎn)(x', y')。