我是OpenCV的初学者。我想使用opencv校准立体相机。我有两个usb-webcam和9x6的棋盘图案。我已经完成了立体视觉校准的教程以及opencv中的calibration.cpp示例。
我从两个相机中点击了大约20张图像并将其存储在一个文件夹中。另外,我根据Martin Paris教程制作了每个图像位置的文本文件。
我的问题是? 1.如何调用每个图像进行角点检测? 2.按照方法-Calibrate每个相机,然后进行StereoCalibration?
我真的被卡住了。 任何帮助都将受到高度赞赏。!
答案 0 :(得分:0)
对于第一个问题,在这种情况下,您需要分别找到每个图像的角落。例如:
found1 = findChessboardCorners(img1, board_sz, corners1, CV_CALIB_CB_ADAPTIVE_THRESH | CV_CALIB_CB_FILTER_QUADS);
found2 = findChessboardCorners(img2, board_sz, corners2, CV_CALIB_CB_ADAPTIVE_THRESH | CV_CALIB_CB_FILTER_QUADS);
其中board_sz是棋盘的大小,corner1是image1中棋盘的角落,而对于图像2则相同(有关详细信息,请参阅openCV参考:http://docs.opencv.org/2.4/modules/calib3d/doc/camera_calibration_and_3d_reconstruction.html#findchessboardcorners)
对于第二个问题,您不应单独校准每个相机。 stereoCalibrate为你工作并存储内在函数(cameraMatrix1,distCoeffs1用于camera1和cameraMatrix2,distCoeffs2用于camera2)和extrinsics参数(R,T,E,F是旋转,平移,基本矩阵和基本矩阵):
double stereoCalibrate(InputArrayOfArrays objectPoints, InputArrayOfArrays imagePoints1, InputArrayOfArrays imagePoints2, InputOutputArray cameraMatrix1, InputOutputArray distCoeffs1, InputOutputArray cameraMatrix2, InputOutputArray distCoeffs2, Size imageSize, OutputArray R, OutputArray T, OutputArray E, OutputArray F, TermCriteria criteria=TermCriteria(TermCriteria::COUNT+TermCriteria::EPS, 30, 1e-6), int flags=CALIB_FIX_INTRINSIC
请注意,intrinsics和extrinsics参数是输入/输出。
这里,imagePoints1和imagePoints2是一个角点列表,因为你需要拍摄几张不同姿势的棋盘图片。所以,你会做这样的事情(对于每张图片):
if (found1 && found2)
{
imagePoints1.push_back(corners1);
imagePoints2.push_back(corners2);
objectPoints.push_back(obj);
printf ("Corners stored\n");
success++;
}
如果您需要更多详细信息,请参阅此帖子:http://www.jayrambhia.com/blog/stereo-calibration/