【问题标题】:findChessboardCorners don't work in opencv 4.1.2 c++findChessboardCorners 在 opencv 4.1.2 c++ 中不起作用
【发布时间】:2020-03-13 04:45:47
【问题描述】:

我正在尝试校准我的相机。为此,我需要进行一些测试-> findChessboard; 我有真正的国际象棋,我拍了它的照片(它是 8x4),我设置了尺寸(8-1,4-1)->尺寸(7,3) 机器人板设置为 32(因为 4 乘以 8 给我 32(或者我应该写 7*3->21))。当我想找到 ChessBoard 时,它说我是假的;

会有这个棋盘的图片。:

我已经尝试了所有方法来找到 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】:

    查看您的输入图像,我发现了两个可能导致角点检测失败的问题。

    首先,图像太暗了。提供一些漫射照明。否则,即使应该检测到角点,但传感器噪声太大,检测精度会很差。

    第二,如findChessboardCorners()OpenCV documentation中所述:

    注意:该功能需要在电路板周围留有空白(如方形粗边框,越宽越好),以使检测在各种环境中更加稳健。否则,如果没有边框且背景较暗,则无法正确分割外面的黑色方块,从而导致方块分组排序算法失败。

    我建议打印出具有足够白色边框的高质量电路板图像,例如this,将其粘贴到一些坚固的平面(例如木板)上,然后在光线充足的环境中进行校准。这样,它不仅应该检测到角落,而且检测的准确性应该比您使用的设置更好。

    如果您想获得有关高质量相机校准的更多提示,请查看this answer

    【讨论】:

    • 谢谢。但它也没有奏效。对不起我迟到了。 [链接] (imgur.com/a/dVYOzHc)。我做完了。尺寸为 6x9,板为 54。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-05
    • 2015-10-26
    • 2014-11-20
    • 2012-04-02
    • 2013-10-11
    相关资源
    最近更新 更多