Ошибка времени выполнения OpenCV при калибровке камеры в линии калибровки камеры

Я написал код калибровки, как показано ниже:

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;

point_points и image_points заполнены 54 элементами ~ 9 * 6

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

Я использую Qt Creator. Я всегда получаю ошибку во время выполнения при вызове последней строки: calibrateCamera ()

Изменить: я попробовал тот же код с cvCalibrateCamera2 и снова я получил ту же ошибку. Я предоставляю OpenCV Исключение:

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);

Может кто-нибудь помочь мне решить эту ошибку?

Благодарю.

1

Решение

Хорошо, попробовал это сейчас локально в моей системе, оказалось, что определение rVecs и tVecs фактически отличалось от того, что я ожидал.

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

сделал работу за меня.

0

Другие решения

Интересно, если
CvMat* tvec = cvCreateMat(3,10,CV_32FC1);
поможет.

Кроме того, попробуйте
CvMat* tvec = cvCreateMat(1,10,CV_32FC3);

0

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector