2 * A Demo of automatic samples capturing
3 * Author: Alexey Latyshev
11 #include "opencv/cv.h"
12 #include "opencv/highgui.h"
19 #include "calibration.h"
20 #include "createsamples3d.h"
21 #include "createsamplesfromvideo.h"
24 int VIDEO_CALIBRATION_DELAY = 1000;
25 bool AUTOFIND_CHESSBOARD=true;
26 bool USE_DEINTERLACING=false;
27 bool DRAW_CORNERS = true;
28 bool DRAW_CHESSBOARD = true;
29 bool USE_UNDISTORTION = false;
30 bool CALIBRATE_CAMERA = false;
31 bool IS_VIDEO_CAPTURE = false;
32 bool SAVE_DRAWINGS = false;
33 bool SAVE_SAMPLES = false;
34 bool SAVE_ALL_FRAMES = false;
35 bool SHOW_TEST_SQUARE = false;
39 char* OUTPUT_DIRECTORY;
40 char* CAMERA_PARAMETERS_PATH;
45 CvSize innerCornersCount;
46 CvMat* IntrinsicMatrix;
47 CvMat* DistortionCoeffs;
51 // Image deinterlacing
52 IplImage* Deinterlace(IplImage* src)
54 IplImage* res = cvCloneImage(src);
59 for (int i = 1; i < res->height-1; i+=2)
61 linea = (uchar*)res->imageData + ((i-1) * res->widthStep);
62 lineb = (uchar*)res->imageData + ((i) * res->widthStep);
63 linec = (uchar*)res->imageData + ((i+1) * res->widthStep);
65 for (int j = 0; j < res->width * res->nChannels; j++)
67 lineb[j] = (uchar)((linea[j] + linec[j])/2);
71 if (res->height > 1 && res->height % 2 == 0)
73 linea = (uchar*)res->imageData + ((res->height-2) * res->widthStep);
74 lineb = (uchar*)res->imageData + ((res->height-1) * res->widthStep);
75 memcpy(lineb, linea, res->width);
81 void InverseUndistortMap(const CvMat* mapx,const CvMat* mapy, CvMat** invmapx, CvMat** invmapy, bool interpolate)
83 *invmapx=cvCreateMat(mapx->rows,mapx->cols,mapx->type);
84 *invmapy=cvCreateMat(mapy->rows,mapy->cols,mapy->type);
86 for (int i=0;i<mapx->cols;i++)
87 for (int j=0;j<mapy->rows;j++)
89 (*invmapx)->data.fl[i+(*invmapx)->cols*j]=-1e20f;
90 (*invmapy)->data.fl[i+(*invmapy)->cols*j]=-1e20f;
93 for (int i=0;i<mapx->cols;i++)
94 for (int j=0;j<mapy->rows;j++)
96 x = (int) mapx->data.fl[i+mapx->cols*j];
97 y = (int) mapy->data.fl[i+mapy->cols*j];
98 if ((x>=0) && (x<(*invmapx)->cols) && (y>=0) && (y < (*invmapy)->rows))
100 (*invmapx)->data.fl[x+(*invmapx)->cols*y]=(float)i;
101 (*invmapy)->data.fl[x+(*invmapy)->cols*y]=(float)j;
106 for (int i=1;i<mapx->cols-1;i++)
107 for (int j=1;j<mapy->rows-1;j++)
109 if ((*invmapx)->data.fl[i+(*invmapx)->cols*j]==-1e20)
111 (*invmapx)->data.fl[i+(*invmapx)->cols*j] = ((*invmapx)->data.fl[i-1+(*invmapx)->cols*j]+(*invmapx)->data.fl[i+1+(*invmapx)->cols*j]
112 + (*invmapx)->data.fl[i+(*invmapx)->cols*(j-1)]+(*invmapx)->data.fl[i+(*invmapx)->cols*(j+1)])/4;
114 if ((*invmapy)->data.fl[i+(*invmapy)->cols*j]==-1e20)
116 (*invmapy)->data.fl[i+(*invmapy)->cols*j] = ((*invmapy)->data.fl[i-1+(*invmapy)->cols*j]+(*invmapy)->data.fl[i+1+(*invmapy)->cols*j]
117 + (*invmapy)->data.fl[i+(*invmapy)->cols*(j-1)]+(*invmapy)->data.fl[i+(*invmapy)->cols*(j+1)])/4;
123 // left button click sets new point;
124 // (!!!removed!!!)right button click removes last point
125 void on_mouse( int event, int x, int y, int flags, void* param )
129 case CV_EVENT_LBUTTONUP:
133 //for (n=0;(n<4) && ((*((CvPoint**)param))[n].x != -1);n++);
134 for (n=0;(n<4) && (((CvPoint*)param)[n].x != -1);n++);
137 ((CvPoint*)param)[n].x = x;
138 ((CvPoint*)param)[n].y = y;
146 //Load camera params from yaml file
147 int LoadCameraParams(char* filename, CvMat** intrinsic_matrix, CvMat** distortion_coeffs)
149 CvFileStorage* fs = cvOpenFileStorage( filename, 0, CV_STORAGE_READ );
150 if (fs==NULL) return 0;
152 *intrinsic_matrix = (CvMat*)cvReadByName( fs,0,"camera_matrix");
153 *distortion_coeffs = (CvMat*)cvReadByName( fs,0,"distortion_coefficients");
159 int LoadApplicationParams(char* filename)
161 CvFileStorage* fs = cvOpenFileStorage( filename, 0, CV_STORAGE_READ );
162 if (fs==NULL) return 0;
164 USE_DEINTERLACING = cvReadIntByName( fs,0,"USE_DEINTERLACING",0) != 0;
165 USE_UNDISTORTION = cvReadIntByName( fs,0,"USE_UNDISTORTION",0) != 0;
166 CALIBRATE_CAMERA = cvReadIntByName( fs,0,"CALIBRATE_CAMERA",0) != 0;
167 DRAW_CORNERS = cvReadIntByName( fs,0,"DRAW_CORNERS",1) != 0;
168 DRAW_CHESSBOARD = cvReadIntByName( fs,0,"DRAW_CHESSBOARD",1) != 0;
169 AUTOFIND_CHESSBOARD = cvReadIntByName( fs,0,"AUTOFIND_CHESSBOARD",1) != 0;
170 IS_VIDEO_CAPTURE = cvReadIntByName( fs,0,"IS_VIDEO_CAPTURE",0) != 0;
171 SAVE_DRAWINGS = cvReadIntByName( fs,0,"SAVE_DRAWINGS",0) != 0;
172 SAVE_SAMPLES = cvReadIntByName( fs,0,"SAVE_SAMPLES",0) != 0;
173 SAVE_ALL_FRAMES = cvReadIntByName( fs,0,"SAVE_ALL_FRAMES",0) != 0;
174 SHOW_TEST_SQUARE = cvReadIntByName( fs,0,"SHOW_TEST_SQUARE",0) != 0;
175 USE_3D = cvReadIntByName( fs,0,"USE_3D",0) != 0;
178 SAMPLES_PATH = new char[500];
179 if (cvReadStringByName( fs,0,"SAMPLES_PATH"))
180 strcpy(SAMPLES_PATH, cvReadStringByName( fs,0,"SAMPLES_PATH"));
183 if (IS_VIDEO_CAPTURE)
185 INPUT_VIDEO = new char[500];
186 if (cvReadStringByName( fs,0,"INPUT_VIDEO"))
187 strcpy(INPUT_VIDEO,cvReadStringByName( fs,0,"INPUT_VIDEO") );//input video filename
191 OUTPUT_DIRECTORY = new char[500];
192 if (cvReadStringByName( fs,0,"OUTPUT_DIRECTORY"))
193 strcpy(OUTPUT_DIRECTORY,cvReadStringByName( fs,0,"OUTPUT_DIRECTORY"));//output directory for images and selected regions path
195 //chessboard inner corners count (width x height)
196 int CHESSBOARD_WIDTH=cvReadIntByName( fs,0,"CHESSBOARD_WIDTH");
197 int CHESSBOARD_HEIGHT=cvReadIntByName( fs,0,"CHESSBOARD_HEIGHT");
198 innerCornersCount=cvSize(CHESSBOARD_WIDTH,CHESSBOARD_HEIGHT);
201 CAMERA_PARAMETERS_PATH = new char[500];
202 if (cvReadStringByName( fs,0,"CAMERA_PARAMETERS_PATH"))
203 strcpy(CAMERA_PARAMETERS_PATH, cvReadStringByName( fs,0,"CAMERA_PARAMETERS_PATH"));//camera parameters filename
206 if (LoadCameraParams(CAMERA_PARAMETERS_PATH,&IntrinsicMatrix,&DistortionCoeffs))
208 printf("\nCamera parameters loaded successfully\n");
212 printf("\nUnable to load parameters\n");
213 if (USE_UNDISTORTION && (!CALIBRATE_CAMERA))
218 //cvReleaseFileStorage(&fs);
223 IplImage* Undistort(IplImage* src,const CvMat* intrinsic_matrix,const CvMat* distortion_coeffs)
225 IplImage* undistortImg;
226 undistortImg = cvCreateImage(cvSize(src->width,src->height),src->depth,src->nChannels);
227 cvUndistort2(src,undistortImg,intrinsic_matrix,distortion_coeffs);
232 int ShowFrame(int pos)
234 cvSetCaptureProperty(capture,CV_CAP_PROP_POS_FRAMES,pos);
235 frame = cvQueryFrame(capture);
238 IplImage* undistortImg = 0;
239 cvReleaseImage(&workImage);
240 if (USE_DEINTERLACING)
241 workImage = Deinterlace(frame);
243 workImage = cvCloneImage(frame);
244 if (USE_UNDISTORTION)
247 undistortImg = Undistort(workImage,IntrinsicMatrix,DistortionCoeffs);
248 workImage = cvCloneImage(undistortImg);
249 cvReleaseImage(&undistortImg);
252 cvShowImage(FRAME_WINDOW,workImage);
259 //Calculates selected points coordinates (by x and y) in coordinate system connected with chessboard
260 //(zero point is in the upper-left corner of the chessboard, axises are horizontal and vertical chessboard edges)
261 // in: nFrame (number of frame on which points were selected), points (CvPoint[4] array with selected points)
262 // out: relCoords (pointer to the array[4] with (x1,y1) coordinate of every point)
263 // Function returns 0 if there is no chessboard found and array 2xN with corners otherwise
264 // Camera Matrix is for 3D relative position estimation with z start coordinate
265 // We also can give found Chessboard to the method instead of running chessboard finding algorithm
266 CvMat* CalcRelativePosition(IplImage* workImage, CvPoint* points, CvPoint2D32f** relCoords, CvMat* cameraMatrix=NULL, float z = 0, CvMat* Chessboard=NULL)
268 CvPoint2D32f* corners = new CvPoint2D32f[innerCornersCount.height*innerCornersCount.width];
273 if (cvFindChessboardCorners(workImage,innerCornersCount,corners,&count)==0)
279 IplImage* view_gray = cvCreateImage( cvGetSize(workImage), 8, 1 );
280 cvCvtColor(workImage, view_gray, CV_BGR2GRAY );
281 cvFindCornerSubPix( view_gray, corners, count, cvSize(11,11),cvSize(-1,-1), cvTermCriteria( CV_TERMCRIT_EPS+CV_TERMCRIT_ITER, 30, 0.1 ));
282 cvReleaseImage( &view_gray );
286 for (int i=0;i<Chessboard->cols;i++)
288 corners[i].x = (float)Chessboard->data.db[i];
289 corners[i].y = (float)Chessboard->data.db[Chessboard->cols+i];
297 src[0].x = corners[0].x;
298 src[0].y = corners[0].y;
299 src[1].x = corners[innerCornersCount.width-1].x;
300 src[1].y = corners[innerCornersCount.width-1].y;
301 src[2].x = corners[innerCornersCount.width*(innerCornersCount.height-1)].x;
302 src[2].y = corners[innerCornersCount.width*(innerCornersCount.height-1)].y;
305 dst[1].x = innerCornersCount.width-1.f;
308 dst[2].y = innerCornersCount.height-1.f;
310 CvMat* map_matrix = cvCreateMat(2,3,CV_64F);
311 cvGetAffineTransform(src,dst,map_matrix);
313 for (int i=0;i<4;i++)
315 (*relCoords)[i].x=(float)(points[i].x*(map_matrix->data.db[0])+points[i].y*(map_matrix->data.db[1])+(map_matrix->data.db[2]));
316 (*relCoords)[i].y=(float)(points[i].x*(map_matrix->data.db[3])+points[i].y*(map_matrix->data.db[4])+(map_matrix->data.db[5]));
318 cvReleaseMat(&map_matrix);
322 CvMat* image_points = cvCreateMat(2,innerCornersCount.height*innerCornersCount.width,CV_64FC1);
323 CvMat* object_points = cvCreateMat(3,innerCornersCount.height*innerCornersCount.width,CV_64FC1);
325 // Sets object points and image points
326 for (int i=0; i< innerCornersCount.height;i++)
327 for (int j=0; j < innerCornersCount.width;j++)
329 object_points->data.db[(i*innerCornersCount.width+j)]=j;
330 object_points->data.db[(i*innerCornersCount.width+j)+innerCornersCount.width*innerCornersCount.height]=i;
331 object_points->data.db[(i*innerCornersCount.width+j)+2*innerCornersCount.width*innerCornersCount.height]=0.0f;
333 image_points->data.db[(i*innerCornersCount.width+j)]=corners[(i*innerCornersCount.width+j)].x;
334 image_points->data.db[(i*innerCornersCount.width+j)+innerCornersCount.width*innerCornersCount.height]=corners[(i*innerCornersCount.width+j)].y;
337 CvMat* R = cvCreateMat(3, 3, CV_64FC1);
338 CvMat* T = cvCreateMat(3, 1, CV_64FC1);
339 CvMat* rotation_vector = cvCreateMat(3,1,CV_64FC1);
340 //Calculating Exrinsic camera parameters
341 CvMat* distCoeffs = cvCreateMat(5,1,CV_64FC1);
343 cvFindExtrinsicCameraParams2(object_points,image_points,cameraMatrix, distCoeffs,rotation_vector,T);
344 cvReleaseMat(&distCoeffs);
345 cvRodrigues2(rotation_vector,R);
346 CvMat* M = cvCreateMat(3, 4, CV_64FC1);
347 CvMat* A = cvCreateMat(3, 3, CV_64FC1);
348 CvMat* invA = cvCreateMat(3, 3, CV_64FC1);
349 CvMat* point3D = cvCreateMat(3, 1, CV_64FC1);
350 CvMat* t = cvCreateMat(3, 1, CV_64FC1);
352 cvGEMM(cameraMatrix,R,1.0,NULL,0,A);
353 cvGEMM(cameraMatrix,T,1.0,NULL,0,t);
355 t->data.db[0]+=z*A->data.db[2];
356 t->data.db[1]+=z*A->data.db[5];
357 t->data.db[2]+=z*A->data.db[8];
359 t->data.db[0]=-t->data.db[0];
360 t->data.db[1]=-t->data.db[1];
361 t->data.db[2]=-t->data.db[2];
364 for (int i=0;i<4;i++)
366 A->data.db[2]=-points[i].x;
367 A->data.db[5]=-points[i].y;
371 cvGEMM(invA,t,1.0,NULL,0,point3D);
372 (*relCoords)[i].x = (float)(point3D->data.db[0]);
373 (*relCoords)[i].y = (float)(point3D->data.db[1]);
376 CvMat* d3 = cvCreateMat(1,1,CV_64FC3);
377 d3->data.db[0] = point3D->data.db[0];
378 d3->data.db[1] = point3D->data.db[1];
380 distCoeffs = cvCreateMat(5,1,CV_64FC1);
381 CvMat* imP = cvCreateMat(1,1,CV_64FC2);
384 cvProjectPoints2(d3,rotation_vector,T,cameraMatrix,distCoeffs,imP);
387 cvReleaseMat(&distCoeffs);
394 cvReleaseMat(&rotation_vector);
398 cvReleaseMat(&point3D);
403 CvMat* result = cvCreateMat(2,innerCornersCount.height*innerCornersCount.width,CV_64FC1);
404 for (int i=0;i<result->cols;i++)
406 result->data.db[i]=corners[i].x;
407 result->data.db[result->cols+i]=corners[i].y;
420 // if chessboardPoints = NULL using simle affine transform otherwise we must have correct oldPoints pointer
421 // chessBoardPoints is array 2xN
422 // returns new points location
423 CvPoint* GetCurrentPointsPosition(IplImage* workImage, CvPoint2D32f* relCoords, CvMat* chessboardPoints, CvPoint* oldPoints, CvPoint2D32f* outCorners)
425 CvPoint2D32f* corners = new CvPoint2D32f[innerCornersCount.height*innerCornersCount.width];
428 if (cvFindChessboardCorners(workImage,innerCornersCount,corners,&count)==0)
435 IplImage* view_gray = cvCreateImage( cvGetSize(workImage), 8, 1 );
436 cvCvtColor(workImage, view_gray, CV_BGR2GRAY );
437 cvFindCornerSubPix( view_gray, corners, count, cvSize(11,11),cvSize(-1,-1), cvTermCriteria( CV_TERMCRIT_EPS+CV_TERMCRIT_ITER, 30, 0.1 ));
438 cvReleaseImage( &view_gray );
440 CvPoint* result = new CvPoint[4];
442 if (chessboardPoints && oldPoints)
444 CvMat* chessboardPoints2 = cvCreateMat(2,innerCornersCount.height*innerCornersCount.width,CV_64FC1);
445 for (int i=0;i<(chessboardPoints2)->cols;i++)
447 chessboardPoints2->data.db[i]=(corners)[i].x;
448 chessboardPoints2->data.db[chessboardPoints2->cols+i]=(corners)[i].y;
450 CvMat* homography = cvCreateMat(3,3,CV_64FC1);
452 cvFindHomography(chessboardPoints,chessboardPoints2,homography);
454 for (int i=0;i<4;i++)
456 double t = oldPoints[i].x*(homography->data.db[6])+oldPoints[i].y*(homography->data.db[7])+(homography->data.db[8]);
457 result[i].x = (int)((oldPoints[i].x*(homography->data.db[0])+oldPoints[i].y*(homography->data.db[1])+(homography->data.db[2]))/t);
458 result[i].y = (int)((oldPoints[i].x*(homography->data.db[3])+oldPoints[i].y*(homography->data.db[4])+(homography->data.db[5]))/t);
461 cvReleaseMat(&homography);
468 dst[0].x = (corners)[0].x;
469 dst[0].y = (corners)[0].y;
470 dst[1].x = (corners)[innerCornersCount.width-1].x;
471 dst[1].y = (corners)[innerCornersCount.width-1].y;
472 dst[2].x = (corners)[innerCornersCount.width*(innerCornersCount.height-1)].x;
473 dst[2].y = (corners)[innerCornersCount.width*(innerCornersCount.height-1)].y;
476 src[1].x = innerCornersCount.width-1.f;
479 src[2].y = innerCornersCount.height-1.f;
481 CvMat* map_matrix = cvCreateMat(2,3,CV_64F);
482 cvGetAffineTransform(src,dst,map_matrix);
484 for (int i=0;i<4;i++)
486 result[i].x=(int)(relCoords[i].x*(map_matrix->data.db[0])+relCoords[i].y*(map_matrix->data.db[1])+(map_matrix->data.db[2]));
487 result[i].y=(int)(relCoords[i].x*(map_matrix->data.db[3])+relCoords[i].y*(map_matrix->data.db[4])+(map_matrix->data.db[5]));
489 cvReleaseMat(&map_matrix);
494 for (int i=0;i<innerCornersCount.height*innerCornersCount.width;i++)
496 outCorners[i].x=corners[i].x;
497 outCorners[i].y=corners[i].y;
509 IplImage* GetSample(const IplImage* src,CvSize innerCornersCount, const CvPoint* points, CvPoint2D32f* chessboardCorners)
511 CvPoint2D32f* corners = new CvPoint2D32f[innerCornersCount.height*innerCornersCount.width];
514 if (!chessboardCorners)
516 if (cvFindChessboardCorners(src,innerCornersCount,corners,&count)==0)
522 IplImage* view_gray = cvCreateImage( cvGetSize(src), 8, 1 );
523 cvCvtColor(src, view_gray, CV_BGR2GRAY );
524 cvFindCornerSubPix( view_gray, corners, count, cvSize(11,11),cvSize(-1,-1), cvTermCriteria( CV_TERMCRIT_EPS+CV_TERMCRIT_ITER, 30, 0.1 ));
525 cvReleaseImage( &view_gray );
529 for (int i=0;i<innerCornersCount.height*innerCornersCount.width;i++)
531 corners[i]=chessboardCorners[i];
539 top.x = corners[0].x < corners[(innerCornersCount.height-1)*innerCornersCount.width].x ? corners[0].x : corners[(innerCornersCount.height-1)*innerCornersCount.width].x;
540 top.y = corners[0].y < corners[innerCornersCount.width-1].y ? corners[0].y : corners[innerCornersCount.width-1].y;
541 bot.x = corners[innerCornersCount.width-1].x < corners[innerCornersCount.width*innerCornersCount.height-1].x ? corners[innerCornersCount.width*innerCornersCount.height-1].x : corners[innerCornersCount.width-1].x;
542 bot.y = corners[innerCornersCount.height*innerCornersCount.width-1].y < corners[(innerCornersCount.height-1)*innerCornersCount.width].y ?
543 corners[(innerCornersCount.height-1)*innerCornersCount.width].y : corners[innerCornersCount.height*innerCornersCount.width-1].y;
545 CvMat* chessboardPoints = cvCreateMat(2,innerCornersCount.height*innerCornersCount.width,CV_64FC1);
546 CvMat* chessboardPoints2 = cvCreateMat(2,innerCornersCount.height*innerCornersCount.width,CV_64FC1);
548 //assumes that chessboard squares are squared
549 float step = (bot.x-top.x)/(innerCornersCount.width-1) > (bot.y-top.y)/(innerCornersCount.height-1) ? (bot.x-top.x)/(innerCornersCount.width-1) : (bot.y-top.y)/(innerCornersCount.height-1);
550 for (int i=0;i<innerCornersCount.width;i++)
551 for (int j=0;j<innerCornersCount.height;j++)
553 chessboardPoints2->data.db[i+j*innerCornersCount.width]=top.x+i*step;
554 chessboardPoints2->data.db[i+j*(innerCornersCount.width)+innerCornersCount.width*innerCornersCount.height]=
558 for (int i=0;i<(chessboardPoints)->cols;i++)
560 chessboardPoints->data.db[i]=(corners)[i].x;
561 chessboardPoints->data.db[chessboardPoints->cols+i]=(corners)[i].y;
563 CvMat* homography = cvCreateMat(3,3,CV_64FC1);
565 cvFindHomography(chessboardPoints,chessboardPoints2,homography);
567 for (int i=0;i<4;i++)
569 double t = points[i].x*(homography->data.db[6])+points[i].y*(homography->data.db[7])+(homography->data.db[8]);
570 result[i].x = (int)((points[i].x*(homography->data.db[0])+points[i].y*(homography->data.db[1])+(homography->data.db[2]))/t);
571 result[i].y = (int)((points[i].x*(homography->data.db[3])+points[i].y*(homography->data.db[4])+(homography->data.db[5]))/t);
574 IplImage* resImage= cvCloneImage(src);
575 cvWarpPerspective( src, resImage, homography);
577 rect.x = result[0].x<result[2].x ? result[0].x : result[2].x;
578 rect.y = result[0].y<result[1].y ? result[0].y : result[1].y;
579 rect.width = result[1].x<result[3].x ? (result[3].x-rect.x) : (result[1].x-rect.x);
580 rect.height = result[2].y<result[3].y ? (result[3].y-rect.y) : (result[2].y-rect.y);
581 if ((rect.x>=0) && (rect.y >=0) && ((rect.x+rect.width)<resImage->width)&&((rect.y+rect.height)<resImage->height))
582 cvSetImageROI(resImage,rect);
586 cvReleaseMat(&homography);
591 void createSamples2DObject(int argc, char** argv)
594 CvPoint pointsChessboardSquare[4];
596 CvPoint2D32f* relCoords = new CvPoint2D32f[4];
597 CvPoint2D32f* relCoordsChessboardSquare = new CvPoint2D32f[4];
599 CvPoint * newPointsChessboardSquare;
602 IplImage* undistortedImg;
604 if (CALIBRATE_CAMERA)
606 int v = IS_VIDEO_CAPTURE ? 10 : 7;
607 char** c = new char*[v];
608 c[0]=new char[11]; c[0]="calibration";
609 c[1]=new char[2]; c[1]="-w";
610 c[2] = new char[2]; sprintf(c[2],"%d",innerCornersCount.width);
611 c[3]=new char[2]; c[3]="-h";
612 c[4] = new char[2]; sprintf(c[4],"%d",innerCornersCount.height);
613 c[5] = new char[2]; c[5]="-d";
614 c[6] = new char[5]; sprintf(c[6],"%d",VIDEO_CALIBRATION_DELAY);
615 c[7]=new char[2]; c[7]="-o";
617 sprintf(c[8],"%scamera.yml",OUTPUT_DIRECTORY);
618 if (IS_VIDEO_CAPTURE)
620 c[9]=new char[strlen(INPUT_VIDEO)+1];
621 strcpy(c[9],INPUT_VIDEO);
625 LoadCameraParams(c[8],&IntrinsicMatrix, &DistortionCoeffs);
627 // Add functionality for camera calibration
630 cvNamedWindow(FRAME_WINDOW,1);
631 capture = IS_VIDEO_CAPTURE ? cvCreateFileCapture(INPUT_VIDEO) : cvCreateCameraCapture(0);
633 if (!IS_VIDEO_CAPTURE)
635 cvSetCaptureProperty(capture,CV_CAP_PROP_FRAME_WIDTH,640);
636 cvSetCaptureProperty(capture,CV_CAP_PROP_FRAME_HEIGHT,480);
639 cvResizeWindow(FRAME_WINDOW,(int)cvGetCaptureProperty(capture,CV_CAP_PROP_FRAME_WIDTH),(int)cvGetCaptureProperty(capture,CV_CAP_PROP_FRAME_HEIGHT));
641 CvPoint2D32f* corners = new CvPoint2D32f[innerCornersCount.height*innerCornersCount.width];
646 if (IS_VIDEO_CAPTURE)
647 cvSetCaptureProperty(capture,CV_CAP_PROP_POS_FRAMES,++currentFrame);
648 if (workImage) cvReleaseImage(&workImage);
649 frame = cvQueryFrame(capture);
652 if (USE_DEINTERLACING)
653 workImage = Deinterlace(frame);
655 workImage = cvCloneImage(frame);
657 if (USE_UNDISTORTION)
660 undistortedImg = Undistort(workImage,IntrinsicMatrix,DistortionCoeffs);
661 cvReleaseImage(&workImage);
662 workImage = cvCloneImage(undistortedImg);
663 cvReleaseImage(&undistortedImg);
665 //if (!IS_VIDEO_CAPTURE)
666 cvShowImage(FRAME_WINDOW,workImage);
672 while ( frame && (((AUTOFIND_CHESSBOARD && IS_VIDEO_CAPTURE)|| (!IS_VIDEO_CAPTURE)) && cvFindChessboardCorners(workImage,innerCornersCount,corners,&count)==0));
676 printf("\n Unable to load video with chessboard or connect to the camera");
683 IplImage* firstImage=cvCloneImage(workImage);
685 cvShowImage(FRAME_WINDOW,workImage);
692 printf("\n Select the quadrangle region by selectig its vertices on the frame with a mouse\n");
693 cvSetMouseCallback(FRAME_WINDOW, on_mouse, &points);
695 // Getting initial points position
696 for (int currPoint=0;currPoint<4;)
698 if (points[currPoint].x != -1)
700 cvCircle(workImage,cvPoint(points[currPoint].x,points[currPoint].y),2,cvScalar(255,255,255));
701 cvCircle(workImage,cvPoint(points[currPoint].x,points[currPoint].y),3,cvScalar(0));
702 cvShowImage(FRAME_WINDOW,workImage);
706 if (IS_VIDEO_CAPTURE)
710 case 32: // Space symbol
711 if (ShowFrame(++currentFrame))
724 case 8: // Backspace symbol
727 if (ShowFrame(--currentFrame))
747 for (int i=1;i<4;i++)
750 if (points[i].y<points[0].y)
758 if (points[1].x<points[0].x)
766 if (points[3].x<points[2].x)
776 if (workImage) cvReleaseImage(&workImage);
777 workImage = cvCloneImage(firstImage);
778 if (USE_DEINTERLACING)
779 workImage = Deinterlace(frame);
781 workImage = cvCloneImage(frame);
782 if (USE_UNDISTORTION)
784 undistortedImg = Undistort(workImage,IntrinsicMatrix,DistortionCoeffs);
785 cvReleaseImage(&workImage);
786 workImage = cvCloneImage(undistortedImg);
787 cvReleaseImage(&undistortedImg);
789 cvReleaseImage(&firstImage);
792 CvMat* chessboardPointsMat = CalcRelativePosition(workImage, points,&relCoords);
793 if (SHOW_TEST_SQUARE && chessboardPointsMat)
795 pointsChessboardSquare[0].x = (int)chessboardPointsMat->data.db[(innerCornersCount.height-1)*innerCornersCount.width-2];
796 pointsChessboardSquare[1].x = (int)chessboardPointsMat->data.db[(innerCornersCount.height-1)*innerCornersCount.width-1];
797 pointsChessboardSquare[3].x = (int)chessboardPointsMat->data.db[innerCornersCount.height*innerCornersCount.width-2];
798 pointsChessboardSquare[2].x = (int)chessboardPointsMat->data.db[innerCornersCount.height*innerCornersCount.width-1];
800 pointsChessboardSquare[0].y = (int)chessboardPointsMat->data.db[chessboardPointsMat->cols+(innerCornersCount.height-1)*innerCornersCount.width-2];
801 pointsChessboardSquare[1].y = (int)chessboardPointsMat->data.db[chessboardPointsMat->cols+(innerCornersCount.height-1)*innerCornersCount.width-1];
802 pointsChessboardSquare[3].y = (int)chessboardPointsMat->data.db[chessboardPointsMat->cols+innerCornersCount.height*innerCornersCount.width-2];
803 pointsChessboardSquare[2].y = (int)chessboardPointsMat->data.db[chessboardPointsMat->cols+innerCornersCount.height*innerCornersCount.width-1];
804 CalcRelativePosition(workImage,pointsChessboardSquare,&relCoordsChessboardSquare);
807 char* PATH = OUTPUT_DIRECTORY;
810 char path_frames[100];
811 sprintf(path_frames,"%sframes.txt",PATH);
815 sprintf(cmd,"mkdir %s",PATH);
817 sprintf(cmd,"del %s*.* /q",PATH);
821 sprintf(cmd,"mkdir %s",SAMPLES_PATH);
823 sprintf(cmd,"del %s*.* /q",SAMPLES_PATH);
828 sprintf(cmd,"mkdir %s",PATH);
830 sprintf(cmd,"rm -f %s*.*",PATH);
834 sprintf(cmd,"mkdir %s",SAMPLES_PATH);
836 sprintf(cmd,"rm -f %s*.*",SAMPLES_PATH);
843 if (workImage) cvReleaseImage(&workImage);
844 frame = cvQueryFrame(capture);
847 if (USE_DEINTERLACING)
848 workImage = Deinterlace(frame);
850 workImage = cvCloneImage(frame);
852 if (USE_UNDISTORTION)
854 undistortedImg = Undistort(workImage,IntrinsicMatrix,DistortionCoeffs);
855 cvReleaseImage(&workImage);
856 workImage = cvCloneImage(undistortedImg);
857 cvReleaseImage(&undistortedImg);
860 if (chessboardPointsMat)
862 CvPoint2D32f* ChessboardCorners = new CvPoint2D32f[innerCornersCount.height*innerCornersCount.width];
863 newPoints = GetCurrentPointsPosition(workImage,relCoords,chessboardPointsMat,points,ChessboardCorners/*&newPointsMat*/);
867 if (SHOW_TEST_SQUARE)
869 newPointsChessboardSquare = GetCurrentPointsPosition(workImage,relCoordsChessboardSquare,chessboardPointsMat,pointsChessboardSquare,ChessboardCorners);
870 cvFillConvexPoly(workImage,newPointsChessboardSquare,4,cvScalar(10,10,250));
872 bool areOnFrame=true; // are points on frame or not
873 for (int i=0;i<4;i++)
875 if ((newPoints[i].x>workImage->width)||(newPoints[i].x<0)||(newPoints[i].y>workImage->height)||(newPoints[i].y<0))
881 f = fopen(path_frames,"a");
882 sprintf(path,"%s%d.jpg",PATH,currentFrame+1);
883 fprintf(f,"%s,%d,%d,%d,%d,%d,%d,%d,%d\n",path,newPoints[0].x,newPoints[0].y,newPoints[1].x,newPoints[1].y,newPoints[2].x,newPoints[2].y,newPoints[3].x,newPoints[3].y);
887 cvDrawChessboardCorners(workImage,innerCornersCount,ChessboardCorners,innerCornersCount.height*innerCornersCount.width,1);
890 cvCircle(workImage,newPoints[0],2,cvScalar(255,255,255));
891 cvCircle(workImage,newPoints[0],3,cvScalar(0));
892 cvCircle(workImage,newPoints[1],2,cvScalar(255,255,255));
893 cvCircle(workImage,newPoints[1],3,cvScalar(0));
894 cvCircle(workImage,newPoints[2],2,cvScalar(255,255,255));
895 cvCircle(workImage,newPoints[2],3,cvScalar(0));
896 cvCircle(workImage,newPoints[3],2,cvScalar(255,255,255));
897 cvCircle(workImage,newPoints[3],3,cvScalar(0));
900 cvSaveImage(path,workImage);
903 if (USE_DEINTERLACING)
905 IplImage* tmp = Deinterlace(frame);
906 if (USE_UNDISTORTION)
908 undistortedImg = Undistort(tmp,IntrinsicMatrix,DistortionCoeffs);
909 cvReleaseImage(&tmp);
910 tmp = cvCloneImage(undistortedImg);
911 cvReleaseImage(&undistortedImg);
913 cvSaveImage(path,tmp);
914 cvReleaseImage(&tmp);
918 if (!USE_UNDISTORTION)
919 cvSaveImage(path,frame);
922 undistortedImg = Undistort(frame,IntrinsicMatrix,DistortionCoeffs);
923 cvSaveImage(path,undistortedImg);
924 cvReleaseImage(&undistortedImg);
930 sprintf(path,"%s%d.jpg",SAMPLES_PATH,currentFrame+1);
932 if (!USE_UNDISTORTION)
933 tmp = GetSample(frame,innerCornersCount,newPoints,ChessboardCorners);
936 undistortedImg = Undistort(frame,IntrinsicMatrix,DistortionCoeffs);
937 tmp = GetSample(undistortedImg,innerCornersCount,newPoints,ChessboardCorners);
938 cvReleaseImage(&undistortedImg);
942 cvSaveImage(path,tmp);
943 cvReleaseImage(&tmp);
946 printf("Frame %d successfully saved to %s\n",currentFrame+1,path);
947 delete[] ChessboardCorners;
948 ChessboardCorners = NULL;
957 sprintf(path,"%s%d.jpg",PATH,currentFrame+1);
958 cvSaveImage(path,workImage);
964 cvShowImage(FRAME_WINDOW,workImage);
969 while (frame && (key!=27));
972 cvReleaseCapture(&capture);
974 //--------------------------
976 void createSamples3DObject(int argc, char** argv)
983 IplImage* undistortedImg;
985 CvPoint3D32f* points3D = new CvPoint3D32f[8];
986 CvPoint* newPoints = new CvPoint[8];
990 int boxDepthValue=10;
991 int maxErrorValue=10;
994 if (CALIBRATE_CAMERA)
996 int v = 10;/*IS_VIDEO_CAPTURE ? 10 : 7*/;
997 char** c = new char*[v];
998 c[0] = new char[11]; c[0]="calibration";
999 c[1] = new char[2]; c[1]="-w";
1000 c[2] = new char[2]; sprintf(c[2],"%d",innerCornersCount.width);
1001 c[3] = new char[2]; c[3]="-h";
1002 c[4] = new char[2]; sprintf(c[4],"%d",innerCornersCount.height);
1003 c[5] = new char[2]; c[5]="-d";
1004 c[6] = new char[5]; sprintf(c[6],"%d",VIDEO_CALIBRATION_DELAY);
1005 c[7] = new char[2]; c[7]="-o";
1006 c[8] = new char[100];
1007 sprintf(c[8],"%scamera.yml",OUTPUT_DIRECTORY);
1008 c[9]=new char[strlen(INPUT_VIDEO)+1];
1009 strcpy(c[9],INPUT_VIDEO);
1012 LoadCameraParams(c[8],&IntrinsicMatrix, &DistortionCoeffs);
1014 // Add functionality for camera calibration
1017 cvNamedWindow(FRAME_WINDOW,1);
1018 cvCreateTrackbar(DEPTH_TRACKBAR,FRAME_WINDOW,&boxDepthValue,MAX_DEPTH_VALUE,NULL);
1019 cvCreateTrackbar(ERROR_TRACKBAR,FRAME_WINDOW,&maxErrorValue,MAX_ERROR_VALUE,NULL);
1020 capture =cvCreateFileCapture(INPUT_VIDEO);
1022 cvResizeWindow(FRAME_WINDOW,(int)cvGetCaptureProperty(capture,CV_CAP_PROP_FRAME_WIDTH),(int)cvGetCaptureProperty(capture,CV_CAP_PROP_FRAME_HEIGHT));
1024 CvPoint2D32f* corners = new CvPoint2D32f[innerCornersCount.height*innerCornersCount.width];
1026 if (capture == NULL)
1028 printf("\n Unable to load video with chessboard or connect to the camera");
1034 if (workImage) cvReleaseImage(&workImage);
1035 frame = cvQueryFrame(capture);
1038 if (USE_DEINTERLACING)
1039 workImage = Deinterlace(frame);
1041 workImage = cvCloneImage(frame);
1043 if (USE_UNDISTORTION)
1046 undistortedImg = Undistort(workImage,IntrinsicMatrix,DistortionCoeffs);
1047 cvReleaseImage(&workImage);
1048 workImage = cvCloneImage(undistortedImg);
1049 cvReleaseImage(&undistortedImg);
1053 IplImage* firstImage=cvCloneImage(workImage);
1055 cvShowImage(FRAME_WINDOW,workImage);
1068 printf("\nSelect the quadrangle region by selecting its vertices on the frame with a mouse\nUse Space and Backspace to go forward or backward\nPress Esc key to exit");
1070 cvSetMouseCallback(FRAME_WINDOW, on_mouse, &points1);
1072 // Getting initial points position
1073 for (int currPoint=0;currPoint<4;)
1075 if (points1[currPoint].x != -1)
1077 cvCircle(workImage,cvPoint(points1[currPoint].x,points1[currPoint].y),2,cvScalar(255,255,255));
1078 cvCircle(workImage,cvPoint(points1[currPoint].x,points1[currPoint].y),3,cvScalar(0));
1079 cvShowImage(FRAME_WINDOW,workImage);
1082 key = cvWaitKey(30);
1085 case 32: // Space symbol
1086 if (ShowFrame(++currentFrame))
1099 case 8: // Backspace symbol
1102 if (ShowFrame(--currentFrame))
1120 i1 = cvCloneImage(workImage);
1124 for (int i=1;i<4;i++)
1127 if (points1[i].y<points1[0].y)
1131 points1[0]=points1[i];
1135 if (points1[1].x<points1[0].x)
1139 points1[0]=points1[1];
1143 if (points1[3].x<points1[2].x)
1147 points1[3]=points1[2];
1154 ShowFrame(currentFrame);
1156 cvSetMouseCallback(FRAME_WINDOW, on_mouse, &points2);
1158 printf("\nSelect one more time on another frame\n");
1159 // Getting initial points position
1160 for (int currPoint=0;currPoint<4;)
1162 if (points2[currPoint].x != -1)
1164 cvCircle(workImage,cvPoint(points2[currPoint].x,points2[currPoint].y),2,cvScalar(255,255,255));
1165 cvCircle(workImage,cvPoint(points2[currPoint].x,points2[currPoint].y),3,cvScalar(0));
1166 cvShowImage(FRAME_WINDOW,workImage);
1169 key = cvWaitKey(30);
1172 case 32: // Space symbol
1173 if (ShowFrame(++currentFrame))
1186 case 8: // Backspace symbol
1189 if (ShowFrame(--currentFrame))
1206 i2 = cvCloneImage(workImage);
1209 for (int i=1;i<4;i++)
1212 if (points2[i].y<points2[0].y)
1216 points2[0]=points2[i];
1220 if (points2[1].x<points2[0].x)
1224 points2[0]=points2[1];
1228 if (points2[3].x<points2[2].x)
1232 points2[3]=points2[2];
1240 if (workImage) cvReleaseImage(&workImage);
1241 if (USE_DEINTERLACING)
1243 workImage = Deinterlace(i1);
1244 cvReleaseImage(&i1);
1245 i1=cvCloneImage(workImage);
1246 cvReleaseImage(&workImage);
1247 workImage = Deinterlace(i2);
1248 cvReleaseImage(&i2);
1249 i2=cvCloneImage(workImage);
1250 cvReleaseImage(&workImage);
1253 if (USE_UNDISTORTION)
1255 workImage = Undistort(i1,IntrinsicMatrix,DistortionCoeffs);
1256 cvReleaseImage(&i1);
1257 i1=cvCloneImage(workImage);
1258 cvReleaseImage(&workImage);
1259 workImage = Undistort(i2,IntrinsicMatrix,DistortionCoeffs);
1260 cvReleaseImage(&i2);
1261 i2=cvCloneImage(workImage);
1262 cvReleaseImage(&workImage);
1265 points3D = calc3DPoints(i1,i2,points1,points2,innerCornersCount,IntrinsicMatrix,DistortionCoeffs,
1266 !USE_UNDISTORTION,(float)(cvGetTrackbarPos(DEPTH_TRACKBAR,FRAME_WINDOW))/IDENTITY_DEPTH_VALUE,(float)(cvGetTrackbarPos(ERROR_TRACKBAR,FRAME_WINDOW))/IDENTITY_ERROR_VALUE);
1269 printf("\nUnable to find correct stereo correspondence, please try again\n");
1270 ShowFrame(currentFrame);
1277 workImage = cvCloneImage(firstImage);
1278 if (USE_DEINTERLACING)
1279 workImage = Deinterlace(frame);
1281 workImage = cvCloneImage(frame);
1282 if (USE_UNDISTORTION)
1284 undistortedImg = Undistort(workImage,IntrinsicMatrix,DistortionCoeffs);
1285 cvReleaseImage(&workImage);
1286 workImage = cvCloneImage(undistortedImg);
1287 cvReleaseImage(&undistortedImg);
1289 cvReleaseImage(&firstImage);
1292 char* PATH = OUTPUT_DIRECTORY;
1295 char path_frames[100];
1296 sprintf(path_frames,"%sframes.txt",PATH);
1297 remove(path_frames);
1300 sprintf(cmd,"mkdir %s",PATH);
1302 sprintf(cmd,"del %s*.* /q",PATH);
1306 sprintf(cmd,"mkdir %s",SAMPLES_PATH);
1308 sprintf(cmd,"del %s*.* /q",SAMPLES_PATH);
1313 sprintf(cmd,"mkdir %s",PATH);
1315 sprintf(cmd,"rm -f %s*.*",PATH);
1319 sprintf(cmd,"mkdir %s",SAMPLES_PATH);
1321 sprintf(cmd,"rm -f %s*.*",SAMPLES_PATH);
1328 if (workImage) cvReleaseImage(&workImage);
1329 frame = cvQueryFrame(capture);
1332 if (USE_DEINTERLACING)
1333 workImage = Deinterlace(frame);
1335 workImage = cvCloneImage(frame);
1337 if (USE_UNDISTORTION)
1339 undistortedImg = Undistort(workImage,IntrinsicMatrix,DistortionCoeffs);
1340 cvReleaseImage(&workImage);
1341 workImage = cvCloneImage(undistortedImg);
1342 cvReleaseImage(&undistortedImg);
1348 newPoints = Find3DObject(workImage,points3D,innerCornersCount,IntrinsicMatrix,DistortionCoeffs,!USE_UNDISTORTION);
1352 bool areOnFrame=true; // are points on frame or not
1353 if (areOnFrame=true)
1355 f = fopen(path_frames,"a");
1356 sprintf(path,"%s%d.jpg",PATH,currentFrame+1);
1357 fprintf(f,"%s,%d,%d,%d,%d,%d,%d,%d,%d,",path,newPoints[0].x,newPoints[0].y,newPoints[1].x,newPoints[1].y,newPoints[2].x,newPoints[2].y,newPoints[3].x,newPoints[3].y);
1358 fprintf(f,"%d,%d,%d,%d,%d,%d,%d,%d\n",newPoints[4].x,newPoints[4].y,newPoints[5].x,newPoints[5].y,newPoints[6].x,newPoints[6].y,newPoints[7].x,newPoints[7].y);
1361 if (DRAW_CHESSBOARD)
1363 CvPoint2D32f* ChessboardCorners = new CvPoint2D32f[innerCornersCount.height*innerCornersCount.width];
1364 cvFindChessboardCorners(workImage,innerCornersCount,ChessboardCorners);
1365 cvDrawChessboardCorners(workImage,innerCornersCount,ChessboardCorners,innerCornersCount.height*innerCornersCount.width,1);
1366 delete[] ChessboardCorners;
1370 for (int i=0;i<8;i++)
1372 cvCircle(workImage,newPoints[i],2,cvScalar(255,255,255));
1373 cvCircle(workImage,newPoints[i],3,cvScalar(0));
1375 cvLine(workImage,newPoints[0],newPoints[1], cvScalar(100,255,100));
1376 cvLine(workImage,newPoints[0],newPoints[2], cvScalar(100,255,100));
1377 cvLine(workImage,newPoints[1],newPoints[3], cvScalar(100,255,100));
1378 cvLine(workImage,newPoints[2],newPoints[3], cvScalar(100,255,100));
1379 cvLine(workImage,newPoints[4],newPoints[5], cvScalar(100,255,100));
1380 cvLine(workImage,newPoints[5],newPoints[7], cvScalar(100,255,100));
1381 cvLine(workImage,newPoints[6],newPoints[7], cvScalar(100,255,100));
1382 cvLine(workImage,newPoints[4],newPoints[6], cvScalar(100,255,100));
1383 cvLine(workImage,newPoints[0],newPoints[4], cvScalar(100,255,100));
1384 cvLine(workImage,newPoints[1],newPoints[5], cvScalar(100,255,100));
1385 cvLine(workImage,newPoints[2],newPoints[6], cvScalar(100,255,100));
1386 cvLine(workImage,newPoints[3],newPoints[7], cvScalar(100,255,100));
1389 cvSaveImage(path,workImage);
1392 if (USE_DEINTERLACING)
1394 IplImage* tmp = Deinterlace(frame);
1395 if (USE_UNDISTORTION)
1397 undistortedImg = Undistort(tmp,IntrinsicMatrix,DistortionCoeffs);
1398 cvReleaseImage(&tmp);
1399 tmp = cvCloneImage(undistortedImg);
1400 cvReleaseImage(&undistortedImg);
1402 cvSaveImage(path,tmp);
1403 cvReleaseImage(&tmp);
1407 if (!USE_UNDISTORTION)
1408 cvSaveImage(path,frame);
1411 undistortedImg = Undistort(frame,IntrinsicMatrix,DistortionCoeffs);
1412 cvSaveImage(path,undistortedImg);
1413 cvReleaseImage(&undistortedImg);
1419 sprintf(path,"%s%d.jpg",SAMPLES_PATH,currentFrame+1);
1421 if (!USE_UNDISTORTION)
1422 tmp = GetSample3D(frame,newPoints);
1425 undistortedImg = Undistort(frame,IntrinsicMatrix,DistortionCoeffs);
1426 tmp = GetSample3D(undistortedImg,newPoints);
1427 cvReleaseImage(&undistortedImg);
1431 cvSaveImage(path,tmp);
1432 cvReleaseImage(&tmp);
1435 printf("Frame %d successfully saved to %s\n",currentFrame+1,path);
1442 if (SAVE_ALL_FRAMES)
1444 sprintf(path,"%s%d.jpg",PATH,currentFrame+1);
1445 cvSaveImage(path,workImage);
1451 cvShowImage(FRAME_WINDOW,workImage);
1452 key = cvWaitKey(30);
1456 while (frame && (key!=27));
1459 cvReleaseCapture(&capture);
1464 void createSamples3DObject2(int argc, char** argv)
1468 CvPoint2D32f* relCoords = new CvPoint2D32f[4];
1469 CvPoint3D32f* objectPoints = new CvPoint3D32f[8];
1471 CvPoint * newPoints;
1474 IplImage* undistortedImg;
1476 if (CALIBRATE_CAMERA)
1478 int v = IS_VIDEO_CAPTURE ? 10 : 7;
1479 char** c = new char*[v];
1480 c[0]=new char[11]; c[0]="calibration";
1481 c[1]=new char[2]; c[1]="-w";
1482 c[2] = new char[2]; sprintf(c[2],"%d",innerCornersCount.width);
1483 c[3]=new char[2]; c[3]="-h";
1484 c[4] = new char[2]; sprintf(c[4],"%d",innerCornersCount.height);
1485 c[5] = new char[2]; c[5]="-d";
1486 c[6] = new char[5]; sprintf(c[6],"%d",VIDEO_CALIBRATION_DELAY);
1487 c[7]=new char[2]; c[7]="-o";
1489 sprintf(c[8],"%scamera.yml",OUTPUT_DIRECTORY);
1490 if (IS_VIDEO_CAPTURE)
1492 c[9]=new char[strlen(INPUT_VIDEO)+1];
1493 strcpy(c[9],INPUT_VIDEO);
1497 LoadCameraParams(c[8],&IntrinsicMatrix, &DistortionCoeffs);
1499 // Add functionality for camera calibration
1502 int boxDepthValue = IDENTITY_DEPTH_VALUE;
1503 int initialBoxDepthValue = (MAX_INITAL_DEPTH_VALUE - MIN_INITAL_DEPTH_VALUE)/2;
1504 cvNamedWindow(FRAME_WINDOW,1);
1505 cvCreateTrackbar(DEPTH_TRACKBAR,FRAME_WINDOW,&boxDepthValue,MAX_DEPTH_VALUE,NULL);
1506 cvCreateTrackbar(INITIAL_DEPTH_TRACKBAR,FRAME_WINDOW,&initialBoxDepthValue,MAX_INITAL_DEPTH_VALUE-MIN_INITAL_DEPTH_VALUE,NULL);
1509 capture = IS_VIDEO_CAPTURE ? cvCreateFileCapture(INPUT_VIDEO) : cvCreateCameraCapture(0);
1511 if (!IS_VIDEO_CAPTURE)
1513 cvSetCaptureProperty(capture,CV_CAP_PROP_FRAME_WIDTH,640);
1514 cvSetCaptureProperty(capture,CV_CAP_PROP_FRAME_HEIGHT,480);
1517 cvResizeWindow(FRAME_WINDOW,(int)cvGetCaptureProperty(capture,CV_CAP_PROP_FRAME_WIDTH),(int)cvGetCaptureProperty(capture,CV_CAP_PROP_FRAME_HEIGHT));
1519 CvPoint2D32f* corners = new CvPoint2D32f[innerCornersCount.height*innerCornersCount.width];
1524 if (IS_VIDEO_CAPTURE)
1525 cvSetCaptureProperty(capture,CV_CAP_PROP_POS_FRAMES,++currentFrame);
1526 if (workImage) cvReleaseImage(&workImage);
1527 frame = cvQueryFrame(capture);
1530 if (USE_DEINTERLACING)
1531 workImage = Deinterlace(frame);
1533 workImage = cvCloneImage(frame);
1536 if (USE_UNDISTORTION)
1539 undistortedImg = Undistort(workImage,IntrinsicMatrix,DistortionCoeffs);
1540 cvReleaseImage(&workImage);
1541 workImage = cvCloneImage(undistortedImg);
1542 cvReleaseImage(&undistortedImg);
1544 cvShowImage(FRAME_WINDOW,workImage);
1545 key = cvWaitKey(30);
1546 if (key==27) return;
1550 while ( frame && (((AUTOFIND_CHESSBOARD && IS_VIDEO_CAPTURE)|| (!IS_VIDEO_CAPTURE)) && cvFindChessboardCorners(workImage,innerCornersCount,corners,&count)==0));
1554 printf("\n Unable to load video with chessboard or connect to the camera");
1561 IplImage* firstImage=cvCloneImage(workImage);
1563 cvShowImage(FRAME_WINDOW,workImage);
1570 printf("\nSelect the quadrangle region by selecting its vertices on the frame with a mouse\nUse Space and Backspace to go forward or backward (video only)\nPress Esc key to exit");
1571 cvSetMouseCallback(FRAME_WINDOW, on_mouse, &points);
1573 // Getting initial points position
1574 for (int currPoint=0;currPoint<4;)
1576 if (points[currPoint].x != -1)
1578 cvCircle(workImage,cvPoint(points[currPoint].x,points[currPoint].y),2,cvScalar(255,255,255));
1579 cvCircle(workImage,cvPoint(points[currPoint].x,points[currPoint].y),3,cvScalar(0));
1580 cvShowImage(FRAME_WINDOW,workImage);
1583 key = cvWaitKey(30);
1584 if (IS_VIDEO_CAPTURE)
1588 case 32: // Space symbol
1589 if (ShowFrame(++currentFrame))
1602 case 8: // Backspace symbol
1605 if (ShowFrame(--currentFrame))
1625 for (int i=1;i<4;i++)
1628 if (points[i].y<points[0].y)
1632 points[0]=points[i];
1636 if (points[1].x<points[0].x)
1640 points[0]=points[1];
1644 if (points[3].x<points[2].x)
1648 points[3]=points[2];
1656 if (workImage) cvReleaseImage(&workImage);
1657 workImage = cvCloneImage(firstImage);
1658 if (USE_DEINTERLACING)
1659 workImage = Deinterlace(frame);
1661 workImage = cvCloneImage(frame);
1662 if (USE_UNDISTORTION)
1664 undistortedImg = Undistort(workImage,IntrinsicMatrix,DistortionCoeffs);
1665 cvReleaseImage(&workImage);
1666 workImage = cvCloneImage(undistortedImg);
1667 cvReleaseImage(&undistortedImg);
1669 cvReleaseImage(&firstImage);
1672 CvMat* Chessboard = CalcRelativePosition(workImage,points,&relCoords,IntrinsicMatrix, (float)(initialBoxDepthValue+MIN_INITAL_DEPTH_VALUE)/IDENTITY_INITIAL_DEPTH_VALUE);
1676 for (int i=0;i<4;i++)
1678 objectPoints[i+4].x = objectPoints[i].x = relCoords[i].x;
1679 objectPoints[i+4].y = objectPoints[i].y = relCoords[i].y;
1680 objectPoints[i].z = (float)(initialBoxDepthValue+MIN_INITAL_DEPTH_VALUE)/IDENTITY_INITIAL_DEPTH_VALUE;
1681 objectPoints[i+4].z = objectPoints[i].z + (float)(boxDepthValue)/IDENTITY_DEPTH_VALUE;
1686 delete[] objectPoints;
1687 objectPoints = NULL;
1692 printf("\n\nCheck box depth and position\nUse Space and Backspace to go forward or backward (video only)\nPress Esc key to exit and Enter to approve");
1693 if (IS_VIDEO_CAPTURE)
1695 //waiting for box depth approving
1696 IplImage* startImage = cvCloneImage(workImage);
1700 key = cvWaitKey(30);
1703 if (IS_VIDEO_CAPTURE)
1707 case 32: // Space symbol
1708 if (ShowFrame(++currentFrame))
1717 case 8: // Backspace symbol
1720 if (ShowFrame(--currentFrame))
1731 ShowFrame(currentFrame);
1737 frame = cvQueryFrame(capture);
1740 if (USE_DEINTERLACING)
1741 workImage = Deinterlace(frame);
1743 workImage = cvCloneImage(frame);
1745 if (USE_UNDISTORTION)
1747 undistortedImg = Undistort(workImage,IntrinsicMatrix,DistortionCoeffs);
1748 cvReleaseImage(&workImage);
1749 workImage = cvCloneImage(undistortedImg);
1750 cvReleaseImage(&undistortedImg);
1760 CalcRelativePosition(workImage,points,&relCoords,IntrinsicMatrix, (float)(initialBoxDepthValue+MIN_INITAL_DEPTH_VALUE)/IDENTITY_INITIAL_DEPTH_VALUE,Chessboard);
1763 for (int i=0;i<4;i++)
1765 objectPoints[i+4].x = objectPoints[i].x = relCoords[i].x;
1766 objectPoints[i+4].y = objectPoints[i].y = relCoords[i].y;
1767 objectPoints[i].z = (float)(initialBoxDepthValue+MIN_INITAL_DEPTH_VALUE)/IDENTITY_INITIAL_DEPTH_VALUE;
1768 objectPoints[i+4].z = objectPoints[i].z + (float)(boxDepthValue)/IDENTITY_DEPTH_VALUE;
1773 for (int i=0;i<4;i++)
1775 objectPoints[i].z = (float)(initialBoxDepthValue+MIN_INITAL_DEPTH_VALUE)/IDENTITY_INITIAL_DEPTH_VALUE;
1776 objectPoints[i+4].z = objectPoints[i].z +(float)(boxDepthValue)/IDENTITY_DEPTH_VALUE;
1778 newPoints = Find3DObject(workImage,objectPoints,innerCornersCount,IntrinsicMatrix,DistortionCoeffs,false);
1781 for (int i=0;i<8;i++)
1783 cvCircle(workImage,newPoints[i],2,cvScalar(255,255,255));
1784 cvCircle(workImage,newPoints[i],3,cvScalar(0));
1786 cvLine(workImage,newPoints[0],newPoints[1], cvScalar(100,255,100));
1787 cvLine(workImage,newPoints[0],newPoints[2], cvScalar(100,255,100));
1788 cvLine(workImage,newPoints[1],newPoints[3], cvScalar(100,255,100));
1789 cvLine(workImage,newPoints[2],newPoints[3], cvScalar(100,255,100));
1791 cvLine(workImage,newPoints[4],newPoints[5], cvScalar(50,150,50));
1792 cvLine(workImage,newPoints[5],newPoints[7], cvScalar(50,150,50));
1793 cvLine(workImage,newPoints[6],newPoints[7], cvScalar(50,150,50));
1794 cvLine(workImage,newPoints[4],newPoints[6], cvScalar(50,150,50));
1796 cvLine(workImage,newPoints[0],newPoints[4], cvScalar(50,150,50));
1797 cvLine(workImage,newPoints[1],newPoints[5], cvScalar(50,150,50));
1798 cvLine(workImage,newPoints[2],newPoints[6], cvScalar(50,150,50));
1799 cvLine(workImage,newPoints[3],newPoints[7], cvScalar(50,150,50));
1801 cvShowImage(FRAME_WINDOW,workImage);
1803 cvReleaseImage(&startImage);
1806 char* PATH = OUTPUT_DIRECTORY;
1809 char path_frames[100];
1810 sprintf(path_frames,"%sframes.txt",PATH);
1811 remove(path_frames);
1814 sprintf(cmd,"mkdir %s",PATH);
1816 sprintf(cmd,"del %s*.* /q",PATH);
1820 sprintf(cmd,"mkdir %s",SAMPLES_PATH);
1822 sprintf(cmd,"del %s*.* /q",SAMPLES_PATH);
1827 sprintf(cmd,"mkdir %s",PATH);
1829 sprintf(cmd,"rm -f %s*.*",PATH);
1833 sprintf(cmd,"mkdir %s",SAMPLES_PATH);
1835 sprintf(cmd,"rm -f %s*.*",SAMPLES_PATH);
1839 if (IS_VIDEO_CAPTURE)
1842 cvSetCaptureProperty(capture,CV_CAP_PROP_POS_FRAMES,currentFrame);
1846 if (workImage) cvReleaseImage(&workImage);
1847 frame = cvQueryFrame(capture);
1850 if (USE_DEINTERLACING)
1851 workImage = Deinterlace(frame);
1853 workImage = cvCloneImage(frame);
1855 if (USE_UNDISTORTION)
1857 undistortedImg = Undistort(workImage,IntrinsicMatrix,DistortionCoeffs);
1858 cvReleaseImage(&workImage);
1859 workImage = cvCloneImage(undistortedImg);
1860 cvReleaseImage(&undistortedImg);
1865 newPoints = Find3DObject(workImage,objectPoints,innerCornersCount,IntrinsicMatrix,DistortionCoeffs,false);
1869 bool areOnFrame=true; // are points on frame or not
1870 if (areOnFrame=true)
1872 f = fopen(path_frames,"a");
1873 sprintf(path,"%s%d.jpg",PATH,currentFrame+1);
1874 fprintf(f,"%s,%d,%d,%d,%d,%d,%d,%d,%d,",path,newPoints[0].x,newPoints[0].y,newPoints[1].x,newPoints[1].y,newPoints[2].x,newPoints[2].y,newPoints[3].x,newPoints[3].y);
1875 fprintf(f,"%d,%d,%d,%d,%d,%d,%d,%d\n",newPoints[4].x,newPoints[4].y,newPoints[5].x,newPoints[5].y,newPoints[6].x,newPoints[6].y,newPoints[7].x,newPoints[7].y);
1878 if (DRAW_CHESSBOARD)
1880 CvPoint2D32f* ChessboardCorners = new CvPoint2D32f[innerCornersCount.height*innerCornersCount.width];
1881 cvFindChessboardCorners(workImage,innerCornersCount,ChessboardCorners);
1882 cvDrawChessboardCorners(workImage,innerCornersCount,ChessboardCorners,innerCornersCount.height*innerCornersCount.width,1);
1883 delete[] ChessboardCorners;
1887 for (int i=0;i<8;i++)
1889 cvCircle(workImage,newPoints[i],2,cvScalar(255,255,255));
1890 cvCircle(workImage,newPoints[i],3,cvScalar(0));
1892 cvLine(workImage,newPoints[0],newPoints[1], cvScalar(100,255,100));
1893 cvLine(workImage,newPoints[0],newPoints[2], cvScalar(100,255,100));
1894 cvLine(workImage,newPoints[1],newPoints[3], cvScalar(100,255,100));
1895 cvLine(workImage,newPoints[2],newPoints[3], cvScalar(100,255,100));
1897 cvLine(workImage,newPoints[4],newPoints[5], cvScalar(50,150,50));
1898 cvLine(workImage,newPoints[5],newPoints[7], cvScalar(50,150,50));
1899 cvLine(workImage,newPoints[6],newPoints[7], cvScalar(50,150,50));
1900 cvLine(workImage,newPoints[4],newPoints[6], cvScalar(50,150,50));
1902 cvLine(workImage,newPoints[0],newPoints[4], cvScalar(50,150,50));
1903 cvLine(workImage,newPoints[1],newPoints[5], cvScalar(50,150,50));
1904 cvLine(workImage,newPoints[2],newPoints[6], cvScalar(50,150,50));
1905 cvLine(workImage,newPoints[3],newPoints[7], cvScalar(50,150,50));
1908 cvSaveImage(path,workImage);
1911 if (USE_DEINTERLACING)
1913 IplImage* tmp = Deinterlace(frame);
1914 if (USE_UNDISTORTION)
1916 undistortedImg = Undistort(tmp,IntrinsicMatrix,DistortionCoeffs);
1917 cvReleaseImage(&tmp);
1918 tmp = cvCloneImage(undistortedImg);
1919 cvReleaseImage(&undistortedImg);
1921 cvSaveImage(path,tmp);
1922 cvReleaseImage(&tmp);
1926 if (!USE_UNDISTORTION)
1927 cvSaveImage(path,frame);
1930 undistortedImg = Undistort(frame,IntrinsicMatrix,DistortionCoeffs);
1931 cvSaveImage(path,undistortedImg);
1932 cvReleaseImage(&undistortedImg);
1938 sprintf(path,"%s%d.jpg",SAMPLES_PATH,currentFrame+1);
1940 if (!USE_UNDISTORTION)
1941 tmp = GetSample3D(frame,newPoints);
1944 undistortedImg = Undistort(frame,IntrinsicMatrix,DistortionCoeffs);
1945 tmp = GetSample3D(undistortedImg,newPoints);
1946 cvReleaseImage(&undistortedImg);
1950 cvSaveImage(path,tmp);
1951 cvReleaseImage(&tmp);
1954 printf("Frame %d successfully saved to %s\n",currentFrame+1,path);
1961 if (SAVE_ALL_FRAMES)
1963 sprintf(path,"%s%d.jpg",PATH,currentFrame+1);
1964 cvSaveImage(path,workImage);
1970 cvShowImage(FRAME_WINDOW,workImage);
1971 key = cvWaitKey(30);
1975 while (frame && (key!=27));
1977 cvReleaseCapture(&capture);
1981 // Command line arguments: <config_file>
1982 int main( int argc, char** argv )
1986 printf("Usage: createsamples arguments.yml\n");
1988 if (LoadApplicationParams(argv[1]))
1991 createSamples3DObject2(argc,argv);
1993 createSamples2DObject(argc,argv);
1997 printf("\nUnable to load configuration file from %s\nClosing application...\n",argv[1]);