int main(int argc, char** argv) { CommandlineUtils ArgList(argc, argv); // Get input image names int InputImPairSize = 0; char** InputImName = ArgList.GetArgsByOption("-i", InputImPairSize); // Get output image names int OutputImPairSize = 0; char** OutputImName = ArgList.GetArgsByOption("-o", OutputImPairSize); // Get calibration file name int CalibSize = 0; char** CalibFile = ArgList.GetArgsByOption("-c", CalibSize); // Get input image size // int SizeDim = 0; // char** ImSize = ArgList.GetArgsByOption("-s", SizeDim); // int ImWidth = atoi(ImSize[0]); // int ImHeight = atoi(ImSize[1]); char* lInput = InputImName[0]; char* rInput = InputImName[1]; char* lOutput = OutputImName[0]; char* rOutput = OutputImName[1]; if( lInput==NULL || rInput==NULL ) { std::cerr << "Empty input images!" << std::endl; return 0; } if( lOutput==NULL || rOutput==NULL ) { std::cerr << "Empty output images!" << std::endl; return 0; } StereoVision sv; sv.calibrationLoad(CalibFile[0]); sv.undistortImage(lInput, rInput, lOutput, rOutput); return 0; }
int main(int argc, char** argv) { enum LEFT_RIGHT { LEFT=0, RIGHT=1 }; CommandlineUtils ArgList(argc, argv); // Get left image set int ImSetSizeL = 0; char** ImNameL = ArgList.GetArgsByOption("-l", ImSetSizeL); // Get right image set int ImSetSizeR = 0; char** ImNameR = ArgList.GetArgsByOption("-r", ImSetSizeR); // Get square size int size_len; char** squareSizeStr = ArgList.GetArgsByOption("-d", size_len); float squareSize = atof(squareSizeStr[0]); // Get output name int NameSize; char** OutputName = ArgList.GetArgsByOption("-o", NameSize); if(ImNameL == NULL) { std::cerr << "Empty left image set!" << std::endl; return 0; } if(ImNameR == NULL) { std::cerr << "Empty right image set!" << std::endl; return 0; } if(ImSetSizeL != ImSetSizeR) { std::cerr << "Unmatched number of images in left and right set" << std::endl; return 0; } // int NumOfIm = ImSetSizeL; // Get board size int BoardDimension = 0; char** BoardSize = ArgList.GetArgsByOption("-s", BoardDimension); if(BoardDimension != 2) { std::cerr << "Only two dimensional checkerboard is supported!" << std::endl; return 0; } int CornersX = atoi(BoardSize[0]); int CornersY = atoi(BoardSize[1]); // Load images IplImage** ImSetL = LoadImages(ImNameL, ImSetSizeL); IplImage** ImSetR = LoadImages(ImNameR, ImSetSizeR); int ImWidth = ImSetL[0]->width; int ImHeight = ImSetL[1]->height; StereoVision sv; // Initialize calibration sv.calibrationInit(ImWidth, ImHeight, CornersX, CornersY); // Calibrate left image set sv.monoCalibrate(ImSetSizeL, ImSetL, LEFT); sv.monoCalibrate(ImSetSizeR, ImSetR, RIGHT); // Calibrate stereo pair sv.stereoCalibrate(squareSize, ImSetSizeL, ImSetL, ImSetR); // Output calibration result sv.calibrationSave(OutputName[0]); // Release images ReleaseImages(ImSetL, ImSetSizeL); ReleaseImages(ImSetR, ImSetSizeR); return 0; }
void MainWindow::stereoVisionTest(QString image_path,int cornersX,int cornersY){ trace("stereoVisionTest ... "); StereoVision* sv = new StereoVision(CAM_WIDTH,CAM_HEIGHT); IplImage* images[2]; //perform calibration based on sets of 2 images (chessboard) sv->calibrationStart(cornersX,cornersY); // READ IN THE LIST OF CHESSBOARDS: QString file_name; for(int i=0;;i++){ for(int lr=0;lr<2;lr++){ file_name = tr("%1%2%3.jpg").arg(image_path).arg(i).arg(lr ? 'L' : 'R'); trace(file_name); images[lr] = cvLoadImage( file_name.toLatin1(), 0 ); } if(images[0] && images[1]){ trace(file_name); sv->calibrationAddSample(images[0],images[1]); for(int lr=0;lr<2;lr++) cvReleaseImage(&images[lr]); }else{ break; } } sv->calibrationEnd(); sv->calibrationSave("stereovisiontest.dat"); //Once saved calibartion data can be loaded later with: //sv->calibrationLoad("stereovisiontest.dat"); //test our calibartion with first image set: CvSize imageSize = sv->getImageSize(); for(int lr=0;lr<2;lr++){ QString file_name = tr("%1%2%3.jpg").arg(image_path).arg(0).arg(lr ? 'L' : 'R'); images[lr] = cvLoadImage( file_name.toLatin1(), 0 ); } //this method will compute sv->imagesRectified[0],sv->imagesRectified[1],sv->imageDepth,sv->imageDepthNormalized sv->stereoProcess(images[0],images[1]); //merge 2 rectified images in one image (pair) and display horizontal lines //to evaluate rectification. CvMat* pair = cvCreateMat( imageSize.height, imageSize.width*2,CV_8UC3 ); CvMat part; cvGetCols( pair, &part, 0, imageSize.width ); cvCvtColor( sv->imagesRectified[0], &part, CV_GRAY2BGR ); cvGetCols( pair, &part, imageSize.width,imageSize.width*2 ); cvCvtColor( sv->imagesRectified[1], &part, CV_GRAY2BGR ); for(int j = 0; j < imageSize.height; j += 16 ) cvLine( pair, cvPoint(0,j),cvPoint(imageSize.width*2,j),CV_RGB(0,255,0)); //display the results cvNamedWindow( "rectified", 1 ); cvShowImage( "rectified", pair ); cvNamedWindow( "depth", 1 ); cvShowImage( "depth", sv->imageDepthNormalized); //free up memory cvReleaseImage(&images[0]); cvReleaseImage(&images[1]); cvReleaseMat(&pair); }