CvMat * createDisparityMapGC(CvArr * img1, CvArr * img2, int numberOfDisparities, int maxIters) { CvSize imageSize = cvGetSize(img1); // image_left and image_right are the input 8-bit single-channel images // from the left and the right cameras, respectively // CvSize size = cvGetSize(image_left); CvMat* disparity_left = cvCreateMat( imageSize.height, imageSize.width, CV_16S ); CvMat* disparity_right = cvCreateMat( imageSize.height, imageSize.width, CV_16S ); // (int numberOfDisparities, int maxIters) CvStereoGCState* state = cvCreateStereoGCState( 16, // numberOfDisparities 2 //maxIters ); cvFindStereoCorrespondenceGC( img1, img2, disparity_left, disparity_right, state, 0 ); cvReleaseStereoGCState( &state ); CvMat* disparity_left_visual = cvCreateMat( imageSize.height, imageSize.width, CV_8U ); // because the values in the left disparity images are usually negative cvConvertScale( disparity_left, disparity_left_visual, -16 ); // cvSave( "disparity.pgm", disparity_left_visual ); //cvSaveImage( "disparity.pgm", disparity_left_visual ); return disparity_left_visual; }
bool StereoCorrespondenceCV::update() { WriteGuard<ReadWritePipe<FloatImage> > wguard(m_wpipe); FloatImage limg, rimg; if ( m_lrpipe->read(&limg) && m_rrpipe->read(&rimg) ) { CvMat *limg_c = limg.cpuMem(); CvMat *rimg_c = rimg.cpuMem(); CvMat *limg8u_c = m_limg8U.getImage(cvGetSize(limg_c)); CvMat *rimg8u_c = m_rimg8U.getImage(cvGetSize(rimg_c)); cvConvertScale(limg_c, limg8u_c, 255.0); cvConvertScale(rimg_c, rimg8u_c, 255.0); FloatImage output = FloatImage::CreateCPU( Dim::minDim(limg.dim(), rimg.dim())); CvMat *out_c = output.cpuMem(); CudaBenchmarker bMarker; bMarker.begin(); if ( m_mode == LocalMatching ) cvFindStereoCorrespondenceBM(limg8u_c, rimg8u_c, out_c, m_bmState); else cvFindStereoCorrespondenceGC(limg8u_c, rimg8u_c, out_c, NULL, m_gcState); bMarker.end(); m_mark.addProbe(bMarker.elapsedTime()); wguard.write(output); FloatImageSinkPol::sink(limg); FloatImageSinkPol::sink(rimg); } return wguard.wasWrite(); }