OpenCV相机校准- findChessboardCorners函数返回false

14

我试图校准我的相机。 我运行了一些示例,但它们都找不到棋盘的角落。 最后,我使用这个问题中的代码,但它仍然无法找到角落。下面是一张图片,我用它来寻找角落。

我在网上找到了一个解决此问题的命令。 它说board_sz必须包含内部角的数量,而不是方块的数量。 board_sz是一个二维对象。除了h*w之外,我不明白如何使用它来保存内部角落的数量。

我已经给出了w = 9,h = 7。

编辑1 ** ** 代码:

#include <cv.h>
#include <highgui.h>
#include <vector>
#include <stdlib.h>
#include <stdio.h>

using namespace cv;
using namespace std;

int main()
{
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);
VideoCapture capture = VideoCapture(0);

vector<vector<Point3d>> object_points;
vector<vector<Point2d>> image_points;

vector<Point2d> corners;
int successes=0;

Mat image;
Mat gray_image;
capture >> image;

vector<Point3d> obj;
for(int j=0;j<numSquares;j++)
    obj.push_back(Point3d(j/numCornersHor, j%numCornersHor, 0.0f));

while(successes<numBoards)
{
    cvtColor(image, gray_image, CV_BGR2GRAY);

    bool found = findChessboardCorners(image, board_sz, corners, CV_CALIB_CB_ADAPTIVE_THRESH | CV_CALIB_CB_FILTER_QUADS);

    if(found)
    {
        cornerSubPix(gray_image, corners, Size(11, 11), Size(-1, -1), TermCriteria(CV_TERMCRIT_EPS | CV_TERMCRIT_ITER, 30, 0.1));
        drawChessboardCorners(gray_image, board_sz, corners, found);
    }

    imshow("win1", image);
    imshow("win2", gray_image);

    capture >> 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!\n");

        successes++;

        if(successes>=numBoards)
            break;
    }
}

Mat intrinsic = Mat(3, 3, CV_32FC1);
Mat distCoeffs;
vector<Mat> rvecs;
vector<Mat> tvecs;

intrinsic.ptr<float>(0)[0] = 1;
intrinsic.ptr<float>(1)[1] = 1;

calibrateCamera(object_points, image_points, image.size(), intrinsic, distCoeffs, rvecs, tvecs);

Mat imageUndistorted;
while(1)
{
    capture >> image;
    undistort(image, imageUndistorted, intrinsic, distCoeffs);

    imshow("win1", image);
    imshow("win2", imageUndistorted);

    waitKey(1);
}

capture.release();

return 0;
}

图片:

输入图片描述


展示你的代码,否则我们无法帮助你。我的直觉告诉我,你给出的棋盘大小是错误的。 - Hannes Ovrén
顺便问一下,为什么要将intrinsic[0][0]和intrinsic[1][1]设置为1?通常它们会略有不同。 - John Smith
1个回答

19

尝试使用尺寸(8,6)。虽然正确数清方块有点困难,但尝试数一下“内部”角落。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接