2017-09-15 91 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