在校准相机校准相机时,OpenCV运行时错误

时间:2012-10-17 16:47:25

标签: c++ opencv runtime-error calibration

我在下面写了一个校准码:

int numBoards = 20;
int numCornersHor=6;
int numCornersVer=9;
int numSquares = numCornersHor * numCornersVer;
cv::Size board_sz = cv::Size(numCornersHor, numCornersVer);

std::vector<std::vector<cv::Point3f> > object_points;
std::vector<std::vector<cv::Point2f> > image_points;
std::vector<cv::Point2f> corners;
std::vector<cv::Point3f> obj;
    for(int j=0;j<numSquares;j++)
        obj.push_back(cv::Point3f(j/numCornersHor, j%numCornersHor, 0.0f));

int successes=0;

初始化有用变量后,我从网络摄像头获取帧并将其存储在缓冲区中。

    while(successes<numBoards)
    {        
        unsigned char* buffer=eyeCamera->getFrame();
        cv::Mat rawImg=cv::Mat(cv::Size(widthCam,heightCam),CV_8UC4, buffer,cv::Mat::AUTO_STEP);
        cv::Mat grayImg;
        cv::cvtColor(rawImg,grayImg,CV_BGR2GRAY);

        bool found = findChessboardCorners(rawImg, board_sz, corners,
                                           CV_CALIB_CB_ADAPTIVE_THRESH | CV_CALIB_CB_FILTER_QUADS);
        if(found)
        {
            cv::cornerSubPix(grayImg, corners, cv::Size(11, 11), cv::Size(-1, -1),
                             cv::TermCriteria(CV_TERMCRIT_EPS | CV_TERMCRIT_ITER, 30, 1.1));
            cv::drawChessboardCorners(grayImg, board_sz, corners, found);
        }

        cv::imshow("win2", grayImg);

到目前为止一切都很好。我显示了灰色和棋盘角落。

        int key = cv::waitKey(1);
        if(key==27)
            return;

        if(key==' ' && found!=0)
        {
          image_points.push_back(corners);
          object_points.push_back(obj);

          successes++;

          if(successes>=numBoards)
              break;
        }

    }

    cv::Mat intrinsic = cv::Mat(3, 3, CV_64F);
    cv::Mat distCoeffs= cv::Mat(8, 1, CV_64F);
    std::vector<cv::Mat> rvecs;
    std::vector<cv::Mat> tvecs;
    intrinsic.at<double>(0,0) = 1.0;

    int widthCam=640; 
    int heightCam=480;

object_points和image_points用54个元素填充~9 * 6

    cv::calibrateCamera(object_points, image_points, cv::Size(widthCam,heightCam), intrinsic, distCoeffs, rvecs, tvecs);

我正在使用Qt创建者。调用最后一行时,我总是遇到运行时错误:calibrateCamera()

编辑:我用cvCalibrateCamera2尝试了相同的代码,我又得到了同样的错误。我提供了opencv Exeption:

OpenCV error: Bad argument (the output array of translation vectors must be 3-channel
1xn or nx1 array or 1-channel nx3 array, where n is the bumber of views) in
cvCalibrateCamera2, file F:\OpenCV\opencv\modules\calib3d\src\calibration.cpp,line 1506
terminate called after throwing an instance of 'cv::Exeption'

我正在使用10个快照,我定义的rvec和tvec如下:

CvMat* rvec  = cvCreateMat(10,3,CV_32FC1);
CvMat* tvec  = cvCreateMat(10,3,CV_32FC1);

任何人都可以帮我解决这个错误吗?

感谢。

2 个答案:

答案 0 :(得分:0)

好的,现在在我的系统上尝试了这个,结果发现rVecs和tVecs的定义实际上与我预期的不同。

CvMat* rVecs = cvCreateMat( 1, 1, CV_32FC3 );
CvMat* tVecs = cvCreateMat( 1, 1, CV_32FC3 );

为我做了这份工作。

答案 1 :(得分:0)

我想知道是否  CvMat* tvec = cvCreateMat(3,10,CV_32FC1);  会有所帮助。

另外,试试  CvMat* tvec = cvCreateMat(1,10,CV_32FC3);