取材自己標(biāo)定
按照官網(wǎng)標(biāo)定例程,我們需要制作20對(duì)左右的棋盤圖
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; //圖片數(shù)
int j=0; //視頻數(shù)
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
//方便標(biāo)定使用
//opencv的stereoCalib是分左右單目標(biāo)定,分離方便標(biāo)定
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;
}
對(duì)于采集程序的說明
- 相機(jī)首先要擺好(水平)
- 需要在
take_pictures.exe同級(jí)目錄下建立photos文件夾 - 可能需要編譯完成后在運(yùn)行,此程序最好不要直接點(diǎn)擊調(diào)試運(yùn)行(有一定幾率按P鍵拍不了照)。
- 按P鍵拍照,照片是成對(duì)存放在
photos目錄下,Q鍵退出程序。 - 標(biāo)定選用的照片質(zhì)量好,則標(biāo)定的結(jié)果誤差小。
- 將選好的照片路徑添加到stereo_calib.xml中。