C++ OpenCV CalibleCamera-断言失败(nimages>;0&;nimages==(int)imagePoints1.total()

C++ OpenCV CalibleCamera-断言失败(nimages>;0&;nimages==(int)imagePoints1.total(),c++,qt,opencv,camera-calibration,C++,Qt,Opencv,Camera Calibration,完全错误: OpenCV Error: Assertion failed (nimages > 0 && nimages == (int)imagePoints1.total() && (!imgPtMat2 || nimages == (int)imagePoints2.total())) in collectCalibrationData, file C:\OpenCV \sources\modules\calib3d\src\calibration

完全错误:

OpenCV Error: Assertion failed (nimages > 0 && nimages == 
(int)imagePoints1.total() && (!imgPtMat2 || nimages == 
(int)imagePoints2.total())) in collectCalibrationData, file C:\OpenCV
\sources\modules\calib3d\src\calibration.cpp, line 3164
守则:

cv::VideoCapture kalibrowanyPlik;   //the video

cv::Mat frame;
cv::Mat testTwo; //undistorted
cv::Mat cameraMatrix = (cv::Mat_<double>(3, 3) << 2673.579, 0, 1310.689, 0, 2673.579, 914.941, 0, 0, 1);
cv::Mat distortMat = (cv::Mat_<double>(1, 4) << -0.208143,  0.235290,  0.001005,  0.001339);
cv::Mat intrinsicMatrix = (cv::Mat_<double>(3, 3) << 1, 0, 0, 0, 1, 0, 0, 0, 1);
cv::Mat distortCoeffs = cv::Mat::zeros(8, 1, CV_64F);
//there are two sets for testing purposes. Values for the first two came from GML camera calibration app. 

std::vector<cv::Mat> rvecs;
std::vector<cv::Mat> tvecs;
std::vector<std::vector<cv::Point2f> > imagePoints;
std::vector<std::vector<cv::Point3f> > objectPoints;

kalibrowanyPlik.open("625.avi");
    //cv::namedWindow("Distorted", CV_WINDOW_AUTOSIZE); //gotta see things
    //cv::namedWindow("Undistorted", CV_WINDOW_AUTOSIZE);

int maxFrames = kalibrowanyPlik.get(CV_CAP_PROP_FRAME_COUNT);    
int success = 0;    //so we can do the calibration only after we've got a bunch

for(int i=0; i<maxFrames-1; i++) {    
    kalibrowanyPlik.read(frame);
    std::vector<cv::Point2f> corners; //creating these here so they're effectively reset each time
    std::vector<cv::Point3f> objectCorners;

    int sizeX = kalibrowanyPlik.get(CV_CAP_PROP_FRAME_WIDTH); //imageSize
    int sizeY = kalibrowanyPlik.get(CV_CAP_PROP_FRAME_HEIGHT);

    cv::cvtColor(frame, frame, CV_BGR2GRAY); //must be gray

    cv::Size patternsize(9,6); //interior number of corners

    bool patternfound = cv::findChessboardCorners(frame, patternsize, corners, cv::CALIB_CB_ADAPTIVE_THRESH + cv::CALIB_CB_NORMALIZE_IMAGE + cv::CALIB_CB_FAST_CHECK); //finding them corners

    if(patternfound == false) { //gotta know 
        qDebug() << "failure";
    }
    if(patternfound) {
        qDebug() << "success!";
            std::vector<cv::Point3f> objectCorners; //low priority issue - if I don't do this here, it becomes empty. Not sure why. 
            for(int y=0; y<6; ++y) {
                for(int x=0; x<9; ++x) { 
                    objectCorners.push_back(cv::Point3f(x*28,y*28,0)); //filling the array
                }
            }

            cv::cornerSubPix(frame, corners, cv::Size(11, 11), cv::Size(-1, -1),
            cv::TermCriteria(CV_TERMCRIT_EPS + CV_TERMCRIT_ITER, 30, 0.1));

            cv::cvtColor(frame, frame, CV_GRAY2BGR); //I don't want gray lines

            imagePoints.push_back(corners); //filling array of arrays with pixel coord array
            objectPoints.push_back(objectCorners); //filling array of arrays with real life coord array, or rather copies of the same thing over and over
            cout << corners << endl << objectCorners;
            cout << endl << objectCorners.size() << "___" << objectPoints.size() <<  "___" << corners.size() <<  "___" << imagePoints.size() << endl;
            cv::drawChessboardCorners(frame, patternsize, cv::Mat(corners), patternfound); //drawing. 

            if(success > 5) {
                double rms =  cv::calibrateCamera(objectPoints, corners, cv::Size(sizeX, sizeY), intrinsicMatrix, distortCoeffs, rvecs, tvecs, cv::CALIB_USE_INTRINSIC_GUESS); 
//error - caused by passing CORNERS instead of IMAGEPOINTS. Also, imageSize is 640x480, and I've set the central point to 1310... etc
                cout << endl << intrinsicMatrix << endl << distortCoeffs << endl;
                cout << "\nrms - " << rms << endl;
            }
            success = success + 1;

        //cv::imshow("Distorted", frame);
        //cv::imshow("Undistorted", testTwo);
        }
    }
对于objectCorners(现实生活中的坐标)、objectPoints(插入的数组数)以及corners(像素坐标)和imagePoints,它们也不是空的,输出是:

(...)
277.6792, 208.92903;
241.83429, 208.93048;
206.99866, 208.84637;
(...)
84, 56, 0;
112, 56, 0;
140, 56, 0;
168, 56, 0;
(...)
示例框架:

我知道这是一个混乱,但到目前为止,我试图完成的代码,而不是得到一个准确的阅读


每一行正好有54行。有人知道是什么导致了错误吗?我在Windows 7上使用OpenCV 2.4.8和Qt Creator 5.4。

首先,正如您所注意到的,必须切换角点和图像点


在大多数情况下(如果不是全部),大小请在此处发布一帧625.avi,让我们看看它的外观。此外,我认为您最好使用一组单独的图像,而不是avi。不幸的是,它必须是一个视频。我将在OPS中包含该帧。可能在drawChessboardCorners设置断点,检查objectPoints和corners中的元素是否具有相同的大小。检查si每个元素的ze是我想到的第一件事,是的,它们的大小都一样。objectPoints和imagePoints都有相等数量的数组,每个数组都有54个项目。@YangKui我是一个白痴。一个绝对的白痴。我通过了角点而不是imagePoints。但是,出现了新的错误。它使我的内在矩阵为空。扭曲系数真的很奇怪(-3.80871228702875;379.970212949286;0.4127166512419153;0.03035805582878129;-4.178316666034348)这是一个很好的答案。我会相应地修改代码。不幸的是,它必须是一个视频…我想我只需要添加一个工具,允许用户选择特定的帧(或者更确切地说,在挑选的时间戳周围寻找它们),让他挑选10-15,从不同的角度覆盖整个屏幕,并将结果保存到一个XML文件中。633*1/2.5从英寸转换为2532,这与4620(最精确的结果)或5800(管理者给出的焦距)相差甚远。哦,好吧。我会更努力地校准。
(...)
277.6792, 208.92903;
241.83429, 208.93048;
206.99866, 208.84637;
(...)
84, 56, 0;
112, 56, 0;
140, 56, 0;
168, 56, 0;
(...)