Exemplo n.º 1
0
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();
}