2017-04-12 100 views
0

我正在使用官方500萬像素攝像頭的Raspberry Pi 2。我已經使用OpenCV 3.2.0校準了相機。我在Python 3.4.2中編寫代碼(我知道這不是最新版本,但是爲新版本重新編譯OpenCV是不可能的)。OpenCV Point Undistortion

我的問題是,如果我在相對於相機的正方形內有一個點,並且我有相對於相機的正方形的所有4個角的點(不完全是正方形,因爲它可能會旋轉並略微移動),我如何找到相對於廣場的那個點?例如,如果廣場的左上角是(10,20),並且原始點有點向右和向下,也許(21,33),那麼最後一點可能是某種東西像(15,18)。

將此結果置於1個角(僅減去輸入點和角)是不夠的,因爲圖像可能會縮放。將它放在2個相對的角落(假定方形是完全正方形且不旋轉)是不夠的,因爲圖像可能會旋轉。從理論上講,如果我正確校準相機(並且製作了完美的正方形或矩形),那麼3就足夠了,但4更好地完全確定。

問題是我不知道如何將圖像上的點重新映射到廣場上的點。我應該怎麼做?

例(抱歉低質量):

Checkerboard Checkerboard with input points: [(163, 17) -> (0, 0), (294, 50) -> (5, 0), (313, 273) -> (5, 8), and (145, 275) -> (0, 8)], output point: (257, 149) -> (3.5, 4)

鑑於4個紅色的攝像頭和輸出點和綠色的攝像頭點,如何找到綠色的輸出點?

回答

0

剛剛寫完(我發誓我已經有剛寫完),我找到了這個函數:cv2.getPerspectiveTransform()。以下是它將如何用於該示例:

rows = 5 
columns = 8 
inputs = [(163, 17), (294, 50), (313, 273), (145, 275)] 
outputs = [(0, 0), (5, 0), (5, 8), (0, 8)] 

transform_matrix = cv2.getPerspectiveTransform(inputs, outputs) 

def transform(point): 
    global transform_matrix 
    return cv2.perspectiveTransform(point, transform_matrix)