我正在尝试校准我的相机。为此,我需要进行一些测试-> findChessboard;我有真正的国际象棋,我拍了照片(是8x4),并设置了Size(8-1,4-1)-> Size(7,3)Bot板设置为32(4乘8等于32(或者我应该写7 * 3-> 21))。当我想找到国际象棋棋盘时,它说我是错误的;
将有此棋盘的图片。:
https://imgur.com/a/EczFwmy(我无法直接提供图像,因为我没有执行此操作的特权)。
我已经尝试了所有方法来找到ChessboardCorners->我给它标记为CALIB_CB_ADAPTIVE_THRESH | CALIB_CB_FILTER_QUADS或CALIB_CB_ADAPTIVE_THRESH + CALIB_CB_FILTER_QUADS。它也没有用。我试图给它的图像彩色(非灰色)图像也没有用。我该怎么办?
对我尝试执行的操作进行编码:
VideoCapture vc(0);
int numBoards = 0;
int numCornersHor;
int numCornersVer;
printf("Enter number of corners along width: ");
scanf("%d", &numCornersHor);
printf("Enter number of corners along height: ");
scanf("%d", &numCornersVer);
printf("Enter number of boards: ");
scanf("%d", &numBoards);
int numSquares = numCornersHor * numCornersVer;
Size board_sz = Size(numCornersHor, numCornersVer);
vector<vector<Point3f>> object_points;
vector<vector<Point2f>> image_points;
vector<Point2f> corners;
int successes = 0;
Mat image;
Mat gray_image;
vc >> image;
for (int j = 0; j < numSquares; j++)
obj.push_back(Point3f(j / numCornersHor, j % numCornersHor, 0.0f));
while (successes < numBoards)
{
if (image.empty())break;
cvtColor(image, gray_image, COLOR_BGR2GRAY);
bool found = findChessboardCorners
(image, board_sz, corners, CALIB_CB_ADAPTIVE_THRESH | CALIB_CB_FILTER_QUADS);
if (found)
{
cornerSubPix(gray_image, corners, Size(11, 11), Size(-1, -1), TermCriteria(TermCriteria::EPS | TermCriteria::MAX_ITER, 30, 0.1));
drawChessboardCorners(gray_image, board_sz, corners, found);
}
imshow("win1", image);
imshow("win2", gray_image);
if (image.empty())break;
vc >> image;
int key = waitKey(1);
if (key == 27)
return 0;
if (key == ' ' && found != 0)
{
image_points.push_back(corners);
object_points.push_back(obj);
printf("Snap stored!");
successes++;
if (successes >= numBoards)
break;
}
}
首先,图像变暗。提供一些漫射照明。否则,即使应检测到拐角,传感器噪声也是如此之高,以至于检测精度将很差。
第二,如OpenCV documentation的findChessboardCorners()
中所述:
注意:该功能需要在木板周围留有空白(如正方形的边框,越宽越好),以使检测在各种环境中都更加稳健。否则,如果没有边框并且背景很暗,则无法正确分割外部黑色正方形,因此正方形分组和排序算法将失败。
我建议打印出带有this之类的具有足够白色边框的高质量板图像,将其粘贴到一些坚固的平坦表面(例如木板)上,并在光线充足的环境中执行校准。这样,它不仅应该检测拐角,而且检测的精度应该比您使用的设置要好。
如果需要其他有关高质量相机校准的提示,请参阅this answer。