2017-09-15 68 views
2

我使用openCV的功能來檢測棋盤,但沒有檢測到棋盤。攝像機標定 - 無法檢測棋盤

圖像我使用:

enter image description here

const Size chessboardDimensions = Size(4,8); 
int main (int argv, char ** argc) 
{ 
     frame = imread("/home/Georges/Desktop/a.jpg"); 
     cvtColor(frame, frame, CV_BGR2GRAY); 
     int found = findChessboardCorners(frame, chessboardDimensions, foundPoints, CV_CALIB_CB_ADAPTIVE_THRESH | CV_CALIB_CB_NORMALIZE_IMAGE); 

} 

總是發現等於0有人能解釋我爲什麼?

+0

發現應該是一個布爾值不是int,它會告訴你,如果方式被發現(我認爲這將返回找到,即使它返回false角落)。在你的情況下,大小是錯誤的,因此它無法找到模式。 – api55

+0

@ api55嗨,我想在這裏發表我的問題作爲評論,因爲我看到OP使用的圖像與我使用的圖像相同。由於我的問題的主題非常具體,我擔心它不會引起很多關注。 https://stackoverflow.com/questions/46225943/how-to-correctly-calibrate-my-camera-with-a-wide-angle-lens-using-opencv/ 任何想法是關於我面臨的問題? – privetDruzia

回答

4
const Size chessboardDimensions = Size(4,8); 

在此表達的大小應該是

Size(5,8) 

因爲你要算內廣場的角落。

編輯:

正如評論所說,int found應該是bool。因爲如果找到拐角,函數會返回。

而作爲建議快檢查選項添加到您的功能,否則功能可能會laggy:

bool found = findChessboardCorners(frame, chessboardDimensions, foundPoints, CV_CALIB_CB_ADAPTIVE_THRESH | CV_CALIB_CB_NORMALIZE_IMAGE | CALIB_CB_FAST_CHECK); 

而且這是檢查是否正確地發現所有的點好主意。在某些情況下,無法檢測到所有點,在進一步的應用中,這種情況會導致錯誤。因爲這個函數的輸出將會被另一個輸入。因此,一個繼續表達添加到您的循環:

if(found == 0 || foundPoints.size() != chessboardDimensions.area()) 
    continue; 
+0

這樣愚蠢的錯字!我會在幾分鐘內接受你的答案。 – LandonZeKepitelOfGreytBritn