Калибровка камеры с помощью opencv (ошибка подтверждения ошибки) - PullRequest
1 голос
/ 03 декабря 2011

Я пытаюсь получить параметры калибровки камеры, используя функции калибровки камеры opencv.У меня есть видео, и я пытаюсь найти параметры калибровки и найти точки в видео, которые включают контрольную доску в разных позициях.Но я еще не прошел фазу калибровки.Я могу найти угол шахматной доски и показать их в окне openCV, но когда дело доходит до строки:

calibrateCamera(objectPoints,imagePoints..............) 

, она выдает исключение и останавливается.

Я получаю следующую ошибку: Ошибка OpenCV: Утверждение не выполнено 0 && nimages == int imagePoints1.total () &&

Вот мой код:

#include "opencv2/imgproc/imgproc.hpp"
#include "opencv2/highgui/highgui.hpp"
#include "C:/opencv/include/opencv/cv.h"

#include <iostream>
#include <math.h>

using namespace cv;
using namespace std;

std::vector<cv::Point2f> imageCorners;
std::vector<cv::Point3f> objectCorners;
std::vector<std::vector<cv::Point3f>> objectPoints;
std::vector<std::vector<cv::Point2f>> imagePoints;

void addPoints(const std::vector<cv::Point2f>&imageCorners, const std::vector<cv::Point3f>& objectCorners)
{
// 2D image points from one view
imagePoints.push_back(imageCorners);
// corresponding 3D scene points
objectPoints.push_back(objectCorners);
}
int main()
{

int key;
cv::Mat   image;
cv::Mat   gray_image;

VideoCapture cap("here goes path of the file"); 
   if (!cap.isOpened())  // check if we succeeded
       cout<<"failed";
else
   cout<<"success";

    cvNamedWindow( "video",0);

cv::Size boardSize(8,6);
// output Matrices
cv::Mat cameraMatrix;
std::vector<cv::Mat> rvecs, tvecs;
cv::Mat distCoeffs;

for (int i=0; i<boardSize.height; i++) 
{
    for (int j=0; j<boardSize.width; j++) 
    {
        objectCorners.push_back(cv::Point3f(i, j, 0.0f));
    }
}
int frame=1;
int corner_count=0;
while(1) 
{
    if(cap.read(image))
    {
        frame++;
        if(frame%20==0)
        {
            if(waitKey(30) >= 0) break;

            bool found = cv::findChessboardCorners(image, boardSize, imageCorners);

            cvtColor( image, gray_image, CV_RGB2GRAY );


                addPoints(imageCorners, objectCorners);

            //bool found = cv::findChessboardCorners(image,boardSize, imageCorners);
            cv::drawChessboardCorners(gray_image,boardSize, imageCorners,found);
            imshow( "video",  gray_image );
        }
    }
    else
        break;

}
int flag=0;
std::string text="";

for (int i=1; i<imagePoints.size();i++)
{
    std::stringstream out;
    out << imagePoints[i];
    text=out.str();
    cout<<text<<endl;

}

calibrateCamera(objectPoints,imagePoints,gray_image.size(), cameraMatrix, distCoeffs, rvecs, tvecs, flag);

return 0;

}

Ответы [ 2 ]

0 голосов
/ 23 марта 2015

вы должны посмотреть на это: http://docs.opencv.org/modules/calib3d/doc/camera_calibration_and_3d_reconstruction.html#bool findChessboardCorners (изображение InputArray, размер patternSize, углы OutputArray, int flags)

он говорит, что ваш исходный вид шахматной доски должен быть 8-битным оттенком серого или цветным изображением. поэтому вы должны использовать это: bool found = cv::findChessboardCorners(gray_image, boardSize, imageCorners);

0 голосов
/ 03 декабря 2011

Напечатайте размер всех ваших std::vector, я подозреваю, что вы передаете пустой вектор этой функции.

EDIT:

Я поделился некоторыми инструкциями в этом ответе о том, как выполнить калибровку камеры. Эти ссылки включают рабочий исходный код. Вам, вероятно, придется сделать небольшую адаптацию к этим программам, чтобы они вместо этого работали с видео.

...