双目标定(二)
2020-01-22 本文已影响0人
Parker2019
取材自己标定
按照官网标定例程,我们需要制作20对左右的棋盘图
take_pictures.cpp
#include <opencv2/opencv.hpp>
#include <string>
using namespace cv;
int main(){
VideoCapture capture(0);
capture = VideoCapture(CV_CAP_DSHOW);
capture.set(CV_CAP_PROP_FOURCC, CV_FOURCC('M', 'J', 'P', 'G'));
capture.set(CV_CAP_PROP_FRAME_WIDTH,1280);
capture.set(CV_CAP_PROP_FRAME_HEIGHT,480);
int key;
int i=0; //图片数
int j=0; //视频数
char picture_left_name[100];//左视图图片文件名
char picture_right_name[100]; //右视图图片文件名
char vName[100];//视频文件名
while(1){
Mat src_frame;//源帧
Mat image_left,image_right; //双目左右视图
Rect left_rect(0,0,640,480); //左框图
Rect right_rect(640,0,640,480); //右框图
//namedWindow("Camera");
capture>>src_frame;
//此步在于分离左右视图,并将其存入image_left与image_right
//方便标定使用
//opencv的stereoCalib是分左右单目标定,分离方便标定
image_left = Mat(src_frame,left_rect).clone();
image_right = Mat(src_frame,right_rect).clone();
if((key=waitKey(33))!=-1){
//按P键拍照
if(key=='p' || key == 'P'){
sprintf(picture_left_name,"photos/left%d.jpg",i);
imwrite(picture_left_name, image_left);
sprintf(picture_right_name,"photos/right%d.jpg",i);
imwrite(picture_right_name,image_right);
while(key==waitKey(33)==-1);
i++;
}
//视频录制,按V键录制
// if(key=='v' || key == 'V'){
// destroyWindow("Camera");
// sprintf(vName,"video/%d.avi",j);
// //写入视频格式avi
// VideoWriter writer(vName, CV_FOURCC('M', 'J', 'P', 'G'), 25.0, Size(640, 480));
// do
// {
// capture>>src_frame;
// writer<<src_frame;
// imshow("Record",src_frame);
// }
// while((key=waitKey(33))==-1);
// j++;
// destroyWindow("Record");
// }
}
imshow("Left",image_left);
imshow("right",image_right);
char esc_key = (char)waitKey(33);
if(esc_key == 27 || esc_key == 'q' || esc_key == 'Q')
break;
}
return 0;
}
对于采集程序的说明
- 相机首先要摆好(水平)
- 需要在
take_pictures.exe
同级目录下建立photos
文件夹 - 可能需要编译完成后在运行,此程序最好不要直接点击调试运行(有一定几率按P键拍不了照)。
- 按P键拍照,照片是成对存放在
photos
目录下,Q键退出程序。 - 标定选用的照片质量好,则标定的结果误差小。
- 将选好的照片路径添加到stereo_calib.xml中。