在线校准相机中校准相机时出现 OpenCV 运行时错误
Posted
技术标签:
【中文标题】在线校准相机中校准相机时出现 OpenCV 运行时错误【英文标题】:OpenCV run-time error while calibrating camera in line calibratecamera 【发布时间】:2012-10-17 16:47:24 【问题描述】:我写了一个校准代码如下:
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);
到目前为止一切正常。我显示 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);
谁能帮我解决这个错误?
谢谢。
【问题讨论】:
我们会回答。无需在您的问题下方添加 cmets,它不会加快速度。如果您的问题过于具体,有时可能需要数天/数周才能有人回复。这里很少有人为 OpenCV 标签做出贡献。 如果您有 OpenCV 源代码,您可以编译它,在您的系统上安装调试版本,然后调试您的应用程序以跟踪cv::calibrateCamera()
并找出 OpenCV 源代码中的哪一行崩溃。
好的,之前没看到那个代码。 r vec 是一个旋转矩阵,所以它是 3x3 (cvCreateMat(3, 3, CV_64F)),而 tVec 是一个平移矩阵,它应该是 3x1 或 1x3 (cvCreateMat(3,1, CV_64F) 有帮助吗?
还没有!总是崩溃
【参考方案1】:
好的,现在在我的系统上进行本地尝试,结果发现 rVecs 和 tVecs 的定义实际上与我预期的不同。
CvMat* rVecs = cvCreateMat( 1, 1, CV_32FC3 );
CvMat* tVecs = cvCreateMat( 1, 1, CV_32FC3 );
为我完成了这项工作。
【讨论】:
没有工作了。 cvCalibrateCamera2 对你有用吗?我在使用 Rodrigues() 时也遇到了同样的问题。 我使用了 cvCalibrateCamera2(),是的。 你能提供你的代码sn-p plz吗?也许其他事情是错的! 我实际上只有一对立体相机的代码,我为单个相机注入了代码。它可以在pastebin.com/QFqdfdVM找到。您的代码在第 117 行。请注意,我只每帧进行一次校准,因此我不会累积任何帧数据。【参考方案2】:我想知道如果
CvMat* tvec = cvCreateMat(3,10,CV_32FC1);
会有帮助的。
还有,试试
CvMat* tvec = cvCreateMat(1,10,CV_32FC3);
【讨论】:
以上是关于在线校准相机中校准相机时出现 OpenCV 运行时错误的主要内容,如果未能解决你的问题,请参考以下文章