2

我有一個圖像,其中內圖像是傾斜的,並具有(在其邊緣可見)其自身的座標表的一個圖像:轉換點到非傾斜點

enter image description here

現在我需要將實際圖像的一個點轉換爲傾斜圖像上的(x cm, y cm)點。說,我想知道什麼(x cm, y cm)座標左下角((0, img.height()))的實際圖像了。也就是說,如果內部圖像的座標表是外推的。

我已經知道:

  • 傾斜圖像的角度a
  • 兩點p1p2從傾斜圖像
  • 的釐米座標p1cmp2cm對於這兩個點手動選擇

我可以通過比較兩個圖片來獲得圖片的比例分在一起,並得到他們釐米的距離與實際距離之間的比率:

double dCmX = p1cm.x() - p2cm.x(); 
double dCmY = p1cm.y() - p2cm.y(); 
double dCm = sqrt(pow(dCmX, 2) + pow(dCmY, 2)) 

double dPointX = p1.x() - p2.x(); 
double dPointY = p1.y() - p2.y(); 
double dPoint = sqrt(pow(dPointX, 2) + pow(dPointY, 2)) 

double scale = dPoint/dCm; 

但我不知道怎麼走釐米座標左下角的座標。

+0

它比一個三角問題而已。如果你能夠理解https://en.wikipedia中的概念。org/wiki/Rotation_matrix,那麼這將很簡單地退出。或者考慮在數學網站上提問。 – Bathsheba

回答

2

這種變換(僅使用比例和傾斜角度)被稱爲仿射變換。爲簡單起見,您可能需要使用OpenCV庫。那麼代碼很簡單:

double scale = dPoint/dCm; 
Point center = Point(img.cols/2, img.rows/2); 
Mat warpMat = getRotationMatrix2D(center, angle, scale); 
Point2f src[1]; 
Point2f dst[1]; 
src[0] = Point2f(src_x, src_y); 
transform(src, dst, warpMat); 

然後,你將有裏面dst你的結果。您當然可以使src陣列更大,同時給transform方法多點。
有關opencv和仿射變換的更多信息,另請參閱this


如果你不想使用OpenCV你仍然可以看一看的getRotationMatrix2DwarpAffine文檔頁面,並通過自己實現它,這是很簡單的:

enter image description here

建立矩陣(warpMat):

enter image description here

然後,每個點(x,y)建立向量[x,y,1]並做warpMat[x,y,1]之間的矩陣乘法:

enter image description here

+0

非常感謝你:) –