我最近使用MATLAB单相机校准应用算法来校准相机内在和外部参数。在发现棋盘的角落,多次detectCheckerboardPoints
Matlab的出执行(精度)OpenCV的API cv::findChessboardCorners
,功能又上了一些照片,Matlab的行为奇怪。
例如,下面的图像中,板之间的广场角落清晰可见,而MATLAB发现在陌生的地方多余的:
在MATLAB代码段是简单如下:
img=imread(fn);
[imUndist, newOrig]=undistortImage(img, cameraParams);
[pxs, bdsize]=detectCheckerboardPoints(imUndist); %or detect on 'img' directly
imMarked=insertMarker(imUndist, pxs);
imshow(imMarked);
opencv
(下面的代码)检测的角点是非常精确的:// OpenCV的代码:
Mat img = imread(fpath);
int ww = 8, hh = 15;
cv::Size bsz(ww, hh);
vector<Point2f> ptvec;
bool found = cv::findChessboardCorners(img, bsz, ptvec, CALIB_CB_ADAPTIVE_THRESH + CALIB_CB_NORMALIZE_IMAGE);
cv::drawChessboardCorners(img, bsz, ptvec, found);
imshow("img", img);
waitKey();
使棋盘还大!这可能发生,它发生。一般情况下,你想有一个棋盘是大多数屏幕的一部分。您解决两个问题:
你最好带白边比正方形的面积较大更大的棋盘,但如果你坚持使用该图片,用油漆和最外面的黑色方块的美白一半,周围的一些棋盘面积的编辑。它有助于有一个更好的检测与上进一步计算无不良影响。我希望它的作品。
也许你应该考虑在校准消除异常值有更好的效果(我的意思是当你校准误差百分比?是可以接受?)。也可以尝试摆脱失真后锐化图像。因为它似乎是不失真的图像的分辨率已经显著下降,这可能会导致错误。