1 /****************************************************************************************\
5 \****************************************************************************************/
14 volatile int g_undistort = 0;
15 volatile int g_calib = 0;
16 volatile int g_rectify = 0;
17 volatile int g_save = 0;
18 volatile int g_calc_stereo = 1;
19 volatile int g_view_rectified = 0;
20 volatile int g_snap = 0;
21 volatile int g_write_avi = 0;
23 void callback( IplImage* image1,IplImage* image2 );
24 void callback1( IplImage* image );
26 CvCalibFilter CalibFilter;
27 double EtalonParams[3] = { 6, 8, 3 };
28 IplImage* vis_disp = NULL;
29 //StereoMatcher stereo_matcher;
31 CvVideoWriter* VideoWriterL = NULL;
32 CvVideoWriter* VideoWriterR = NULL;
33 CvVideoWriter* VideoWriterAux = NULL;
36 void toggle_calib(void);
37 void toggle_undistort(void);
41 void calc_dense_disparity(IplImage* image1, IplImage* image2);
46 "h - this help screen\n"
47 "g - start/stop calibration\n"
48 "spacebar - take a snapshot to send to calibration\n"
49 "s - save camera parameters to camera.txt\n"
50 "l - load camera parameters from camera.txt\n"
51 "u - toggle undistortion\n"
52 "r - toggle rectification\n"
53 "t - reverse the cameras order\n"
54 "n - save the couple of frames\n"
55 "d - on/off computing disparity\n"
56 "v - toggle view of the rectified images\n"
57 "a - start/stop writing avi files\n"
65 int main( int argc, char** argv )
67 int source = SOURCE_CAM;
74 CvCapture* captureL; //left
75 CvCapture* captureR; //right
77 IplImage* left_gray = 0;
78 IplImage* right_gray = 0;
80 CalibFilter.SetEtalon( CV_CALIB_ETALON_CHESSBOARD, EtalonParams );
81 CalibFilter.SetCameraCount(2);
82 CalibFilter.SetFrames(15);
84 if( source == SOURCE_CAM ) //input from cameras
86 captureL = cvCaptureFromCAM( 0 ); //first camera
87 captureR = cvCaptureFromCAM( 1 ); //second camera
91 captureL = cvCaptureFromAVI( argv[1] ); //first avi file
92 captureR = cvCaptureFromAVI( argv[2] ); //second avi file
95 if( !captureL || !captureR )
96 { printf("can't run camera/avi\n"); return 1; }
98 cvNamedWindow( "source left", 1 );
99 cvNamedWindow( "source right", 1 );
105 int cmd = cvWaitKey( 2 );
110 cvGrabFrame( captureL );
111 //int time2 = clock();
112 cvGrabFrame( captureR );
113 //int time1 = clock();
114 //printf("time diff = %d", time1 - time2);
115 IplImage* frameL = cvRetrieveFrame( captureL );
116 IplImage* frameR = cvRetrieveFrame( captureR );
118 if( !frameL || !frameR )
120 cvReleaseVideoWriter( &VideoWriterAux );
122 if( g_write_avi == 1 )
124 cvReleaseVideoWriter( &VideoWriterL );
125 cvReleaseVideoWriter( &VideoWriterR );
130 if( source == SOURCE_AVI )
132 frameL->origin = frameR->origin = IPL_ORIGIN_TL;
133 cvFlip( frameR, frameR, 0 );
134 cvFlip( frameL, frameL, 0 );
137 //convert color to gray
138 if( !left_gray && !right_gray )
140 left_gray = cvCreateImage(cvSize( frameL->width,frameL->height), IPL_DEPTH_8U, 1 );
141 right_gray = cvCreateImage(cvSize( frameL->width,frameL->height), IPL_DEPTH_8U, 1 );
142 left_gray->origin = right_gray->origin = frameL->origin;
145 cvCvtColor( frameL, left_gray, CV_BGR2GRAY );
146 cvCvtColor( frameR, right_gray, CV_BGR2GRAY );
148 callback( left_gray, right_gray );
150 switch( tolower(cmd) )
159 CalibFilter.SaveCameraParams("cameras.txt");
162 CalibFilter.LoadCameraParams("cameras.txt");
172 g_view_rectified ^= 1;
178 CvCapture* tmp = captureL;
192 VideoWriterL = cvCreateVideoWriter( "StereoL.avi", -1,
193 10, cvSize(frameL->width,frameL->height) );
194 VideoWriterR = cvCreateVideoWriter( "StereoR.avi", -1,
195 10, cvSize(frameL->width,frameL->height) );
199 cvReleaseVideoWriter( &VideoWriterL );
200 cvReleaseVideoWriter( &VideoWriterR );
210 cvReleaseCapture( &captureL );
211 cvReleaseCapture( &captureR );
213 cvReleaseImage( &left_gray );
214 cvReleaseImage( &right_gray );
216 cvReleaseImage(&vis_disp);
223 void toggle_undistort( void )
231 void toggle_calib( void )
233 prev_time = clock() - 1000;
239 void SaveStereoPair( IplImage** images, const char* rootname )
244 for( i = 0; i < 1000; i++ )
246 sprintf( name, "%s%03dL.bmp", rootname, i );
247 FILE* f = fopen( name, "rb" );
255 cvSaveImage( name, images[0] );
257 sprintf( name, "%s%03dR.bmp", rootname, i );
258 cvSaveImage( name, images[1] );
264 void callback( IplImage* image1, IplImage* image2 )
266 IplImage* images[] = { image1, image2 };
267 int save = g_save != 0;
270 if( g_calib && g_snap )
272 bool found = CalibFilter.FindEtalon( images );
274 g_view_rectified = 0;
277 CalibFilter.DrawPoints( images );
281 int cur_time = clock();
282 if( cur_time >= prev_time + 1000 )
284 prev_time = cur_time;
286 cvXorS( image1, cvScalarAll(255), image1 );
287 cvXorS( image2, cvScalarAll(255), image2 );
291 if( CalibFilter.IsCalibrated() )
300 if( !g_view_rectified )
302 cvDestroyWindow( "rectified left" );
303 cvDestroyWindow( "rectified right" );
307 // CalibFilter.Undistort( images, images );
309 cvShowImage( "source left", image1 );
310 cvShowImage( "source right", image2 );
312 if ( g_calib && g_snap ){
319 SaveStereoPair( images, "imgU" );
322 if( g_rectify && CalibFilter.IsCalibrated() )
324 CalibFilter.Rectify( images, images );
326 //calc_disparity(image1, image2);
329 SaveStereoPair( images, "imgR" );
333 if( CalibFilter.IsCalibrated() && g_view_rectified)
336 l = cvCreateImage( cvSize(image1->width, image1->height),
339 cvConvertScale( image1, l, 1, 0 );
340 cvNamedWindow( "rectified left", 1 );
341 cvNamedWindow( "rectified right", 1 );
342 cvShowImage( "rectified left", l );
343 cvConvertScale(image2, l, 1, 0);
344 cvShowImage( "rectified right", l );
345 cvReleaseImage( &l );
350 calc_dense_disparity(image1, image2);
355 cvWriteFrame( VideoWriterL, image1 );
356 cvWriteFrame( VideoWriterR, image2 );
361 int dense_inited = 0;
362 void calc_dense_disparity(IplImage* image1, IplImage* image2)
366 cvNamedWindow("disparity", 1);
367 cvCreateTrackbar( "maxdisp", "disparity", &maxdisp, 255, 0 );
369 vis_disp = cvCreateImage(cvSize(image1->width, image1->height), IPL_DEPTH_8U, 1);
372 vis_disp->origin = image1->origin;
373 cvFindStereoCorrespondence(
375 CV_DISPARITY_BIRCHFIELD,
378 cvConvertScale(vis_disp, vis_disp, 255.f/maxdisp);
379 cvShowImage("disparity", vis_disp);
382 /*void calc_disparity_matcher(IplImage* left, IplImage* right)
384 if( !stereo_matcher.IsInited() )
386 stereo_matcher.Init( cvSize(left->width, left->height ),
393 cvvNamedWindow("disparity", 1);
396 if( stereo_matcher.m_max_disparity != thresh1 )
397 stereo_matcher.Init( cvSize(left->width, left->height ),
400 stereo_matcher.OnFrames( left, right );
403 iplMultiplyS( stereo_matcher.GetDisparity(),
404 stereo_matcher.GetDisparity(),
405 255/stereo_matcher.m_max_disparity );
407 // iplBlur( stereo_matcher.GetDisparity(),
408 // stereo_matcher.GetDisparity(), 3,3,1,1 );
410 cvErode( stereo_matcher.GetDisparity(),
411 stereo_matcher.GetDisparity(), NULL, 1 );
412 //cvDilate( stereo_matcher.GetDisparity(),
413 // stereo_matcher.GetDisparity(), NULL, 1 );
417 cvvShowImage("left", left );
418 cvvShowImage("right", right );
419 cvvShowImage("disparity", stereo_matcher.GetDisparity() );
423 if( !VideoWriterAux )
425 VideoWriterAux = cvCreateVideoWriter( "StereoLD.avi", -1,
426 5, cvSize(left->width*2,left->height) );
428 IplImage* merged = cvCreateImage( cvSize(left->width*2,left->height),
431 roi.coi = 0; roi.height = left->height; roi.width = left->width;
437 iplCopy( left, merged);
440 stereo_matcher.GetDisparity()->roi = &roi2;
441 roi.xOffset = left->width;
443 iplCopy( stereo_matcher.GetDisparity(), merged);
445 merged->roi = left->roi = stereo_matcher.GetDisparity()->roi = NULL;
447 cvWriteFrame( VideoWriterAux, merged );
449 //visualize disparity
450 //cvvWaitKeyEx("left", 1000);