我最近使用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();
答案 0 :(得分:5)
让棋盘更大!这可能发生,而且确实发生了。通常,您希望棋盘格成为大部分屏幕的一部分。你解决了两个问题:
答案 1 :(得分:2)
你最好制作一个白色边缘大于正方形尺寸的较大棋盘,但如果你坚持使用这些图像,用油漆编辑它们并将一半最外面的黑色正方形和一些棋盘周围的区域。它有助于获得更好的检测,对进一步的计算没有不良影响。我希望它有效。
答案 2 :(得分:0)
也许您应该考虑删除校准中的异常值以获得更好的结果(我的意思是,校准时的错误百分比是多少?是否可以接受?)。消除扭曲后,也请尝试锐化图像。因为似乎未失真图像的分辨率已经大大降低,并且可能会导致错误。