findChessboardCorners在opencv 4.1.2 c ++中不起作用

问题描述 投票:0回答:1

我正在尝试校准我的相机。为此,我需要进行一些测试-> 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;
        }
        }
c++ opencv camera camera-calibration chess
1个回答
0
投票
查看您的输入图像,我看到两个可能导致拐角检测失败的问题。

首先,图像变暗。提供一些漫射照明。否则,即使应检测到拐角,传感器噪声也是如此之高,以至于检测精度将很差。

第二,如OpenCV documentationfindChessboardCorners()中所述:

注意:该功能需要在木板周围留有空白(如正方形的边框,越宽越好),以使检测在各种环境中都更加稳健。否则,如果没有边框并且背景很暗,则无法正确分割外部黑色正方形,因此正方形分组和排序算法将失败。

我建议打印出带有this之类的具有足够白色边框的高质量板图像,将其粘贴到一些坚固的平坦表面(例如木板)上,并在光线充足的环境中执行校准。这样,它不仅应该检测拐角,而且检测的精度应该比您使用的设置要好。

如果需要其他有关高质量相机校准的提示,请参阅this answer

© www.soinside.com 2019 - 2024. All rights reserved.