示例#1
0
int StereoVision::stereoProcess(CvArr* imageSrcLeft,CvArr* imageSrcRight) {
    if(!calibrationDone) return RESULT_FAIL;
    if(!imagesRectified[0]) imagesRectified[0] = cvCreateMat( imageSize.height,imageSize.width, CV_8U );
    if(!imagesRectified[1]) imagesRectified[1] = cvCreateMat( imageSize.height,imageSize.width, CV_8U );
    if(!imageDepth) imageDepth = cvCreateMat( imageSize.height,imageSize.width, CV_16S );
    if(!imageDepthNormalized) imageDepthNormalized = cvCreateMat( imageSize.height,imageSize.width, CV_8U );

    // 2013.4.29
    // CZT
    //
    if(!imageDepthNormalized_c1) imageDepthNormalized_c1 = cvCreateMat( 512, 512, CV_8U );

    /*if(!imagesRectified[0]) imagesRectified[0] = cvCreateMat( 512, 512, CV_8U );
    if(!imagesRectified[1]) imagesRectified[1] = cvCreateMat( 512, 512, CV_8U );
    if(!imageDepth) imageDepth = cvCreateMat( 512, 512, CV_16S );
    if(!imageDepthNormalized) imageDepthNormalized = cvCreateMat( 512, 512, CV_8U );*/

    //rectify images
    cvRemap( imageSrcLeft, imagesRectified[0] , mx1, my1 );
    cvRemap( imageSrcRight, imagesRectified[1] , mx2, my2 );


    CvStereoBMState *BMState = cvCreateStereoBMState();
    BMState->preFilterSize=41;
    BMState->preFilterCap=31;
    BMState->SADWindowSize=41;
    BMState->minDisparity=-64;
    BMState->numberOfDisparities=128;
    BMState->textureThreshold=10;
    BMState->uniquenessRatio=15;

    cvFindStereoCorrespondenceBM( imagesRectified[0], imagesRectified[1], imageDepth, BMState);

    cvNormalize( imageDepth, imageDepthNormalized, 0, 255, CV_MINMAX );

    cvReleaseStereoBMState(&BMState);

    // 2013.4.29
    // CZT
    //
    cvResize(imageDepthNormalized, imageDepthNormalized_c1);
    cvFlip(imageDepthNormalized_c1, imageDepthNormalized_c1, 1); // Flip, y-axis

    return RESULT_OK;
}
示例#2
0
void remapAndDisparity(CvMat* l_remap0, CvMat* l_remap1, CvMat* r_remap0, CvMat* r_remap1)
{
    /* Variable initialization */
    CvArr *l_frame_remap = NULL;
    CvArr *r_frame_remap = NULL;
    CvArr *disparity_map = NULL;
    IplImage *l_frame = NULL;
    IplImage *r_frame = NULL;
    
    /* 
     * Open the goddamned webcams using dumbass C-API.
     * This is cv2.VideoCapture(id) in python
     */
    CvCapture *l_cap = cvCaptureFromCAM(1);
    CvCapture *r_cap = cvCaptureFromCAM(2);

    /* Time to remap the frames!!!! */
    while (1) {
        /* This is cap.read() in python */
        l_frame = cvQueryFrame(l_cap);
        r_frame = cvQueryFrame(r_cap);
    
        /* This is cv2.remap in python */
        cvRemap(l_frame, l_frame_remap, l_remap0, l_remap1, CV_INTER_LINEAR+CV_WARP_FILL_OUTLIERS, cvScalarAll(0));
        cvRemap(r_frame, r_frame_remap, r_remap0, r_remap1, CV_INTER_LINEAR+CV_WARP_FILL_OUTLIERS, cvScalarAll(0));

        /* This is cv2.stereoBM in python */
        CvStereoBMState *SBMS = cvCreateStereoBMState(CV_STEREO_BM_BASIC, 16);
        /* This is cv2.stereoBM.compute in python */
        cvFindStereoCorrespondenceBM(l_frame_remap, r_frame_remap, disparity_map, SBMS);

        /* 
         * Show the disparity map and waitkey.
         */
        cvShowImage("Image", disparity_map);
        key = cvWaitKey(10)&0xFF;
        if (key == 27 || key == 113 /* 113 is key 'q' */) {
            printf("Bye.\n");
            break;
        }
    }
    cvReleaseImage(&l_frame);
    cvReleaseImage(&r_frame);
    cvReleaseImage(&disparity_map);
}
TDV_NAMESPACE_BEGIN

StereoCorrespondenceCV::StereoCorrespondenceCV(
    MatchingMode mode, int maxDisparity, int maxIterations)
    : m_limg8U(CV_8U), m_rimg8U(CV_8U)
{
    if ( mode == LocalMatching )
    {
        m_bmState = cvCreateStereoBMState(CV_STEREO_BM_BASIC, maxDisparity);
        workName("OpenCV_BlockMatcher");
    }
    else
    {
        m_gcState = cvCreateStereoGCState(maxDisparity, maxIterations);
        workName("OpenCV_GraphCut");
    }

    m_mode = mode;
        
}
示例#4
0
void AdjustBMParam::tryParam(){

    int preFilterSz = this->ui->preFilterSz->value();
    int preFilterCap = this->ui->preFilterCap->value();
    int sadWndSz = this->ui->SADWndSz->value();
    int minDisp = this->ui->minDisp->value();
    int numDisp = 16*(this->ui->numDisp->value());
    int texture = this->ui->textureth->value();
    int uniquness = this->ui->uniq->value();
    int spkWndSz = this->ui->speckleWndSz->value();
    int spkRange = this->ui->specklerange->value();

    if(sadWndSz%2==0)
        sadWndSz++;
    if(sadWndSz<5)
        sadWndSz = 5;

    if(preFilterSz%2==0)
        preFilterSz++;
    if(preFilterSz<5)
        preFilterSz = 5;



    CvStereoBMState *BMState = cvCreateStereoBMState();
    assert(BMState != 0);
    BMState->preFilterSize=preFilterSz;
    BMState->preFilterCap=preFilterCap;
    BMState->SADWindowSize=sadWndSz;
    BMState->minDisparity= minDisp;
    BMState->numberOfDisparities=numDisp;
    BMState->textureThreshold=texture;		//reduce noise
    BMState->uniquenessRatio=uniquness;
    BMState->speckleWindowSize = spkWndSz;
    BMState->speckleRange = spkRange;

    stereoCalibration->setBMState(BMState);
    stereoCalibration->computeDisparity(leftImage, rightImage);

    CvMat* pair = cvCreateMat(leftImage->height, leftImage->width*2, CV_8UC3 );
    CvMat part;


    cvGetCols( pair, &part, 0, leftImage->width );
    cvCvtColor( stereoCalibration->leftImageRectified, &part, CV_GRAY2BGR );

    cvGetCols( pair, &part, leftImage->width,leftImage->width*2 );
    cvCvtColor( stereoCalibration->rightImageRectified, &part, CV_GRAY2BGR);

    for(int j = 0; j < leftImage->height; j += 25 )
        cvLine( pair, cvPoint(0,j),cvPoint(leftImage->width*2,j),CV_RGB(255,0,0));

    cvReleaseImage(&dispartiyImageColor);
    dispartiyImageColor = cvCreateImage (cvGetSize(leftImage),IPL_DEPTH_8U, 3);
    if (dispartiyImageColor == NULL)
    {
        fprintf(stderr,"ERROR: Could not create pseudocolor image.\n");
        exit(2);
    }

    IplImage *img, img_header;
    img = cvGetImage(stereoCalibration->imageDisparityNormalized, &img_header);

    disparityMapColor->g2cd_gray_to_chromadepth(img, this->dispartiyImageColor, this->g2cd_data);

    cvShowImage("disparity coloured", dispartiyImageColor);

    cvNamedWindow( "rectified", 1 );
    cvShowImage( "rectified", pair );

   // cvReleaseStereoBMState(&BMState);
    //cvReleaseImage(&img);


}
示例#5
0
CvMat * createDisparityMapBM(CvArr * img1, CvArr * img2,
							 int numberOfDisparities, int maxIters)
{
	CvSize imageSize = cvGetSize(img1);
	
	CvMat* disp = cvCreateMat( imageSize.height,
							   imageSize.width, CV_16S );

	//Setup for finding stereo corrrespondences
	CvStereoBMState *BMState = cvCreateStereoBMState();
	assert(BMState != 0);
	BMState->preFilterSize=41;
	BMState->preFilterCap=31;

	// window size
	BMState->SADWindowSize=41;

	// depth range 
	// BMState->minDisparity=-64;
	// BMState->numberOfDisparities=128;
	BMState->minDisparity=-16;
	BMState->numberOfDisparities=32;

	BMState->textureThreshold=10;
	BMState->uniquenessRatio=15;

	if( img1 && img2 )
	{
		// CvMat part;
		// void cvRemap( const CvArr* src, CvArr* dst,
		//               const CvArr* mapx, const CvArr* mapy)
		// FUNCTION: dst(x,y)<-src(mapx(x,y),mapy(x,y))

		// cvRemap( img1, img1r, mx1, my1 );
		// cvRemap( img2, img2r, mx2, my2 );

		// if( !isVerticalStereo || useUncalibrated != 0 )
		{
			// When the stereo camera is oriented vertically,
			// useUncalibrated==0 does not transpose the
			// image, so the epipolar lines in the rectified
			// images are vertical. Stereo correspondence
			// function does not support such a case.

			// cvFindStereoCorrespondenceBM( img1r, img2r, disp,
			// 							  BMState);
			cvFindStereoCorrespondenceBM( img1, img2, disp,
										  BMState);

			// cvNormalize( disp, vdisp, 0, 256, CV_MINMAX );
		}
		cvReleaseStereoBMState(&BMState);


		CvMat * disparity_left_visual =
			cvCreateMat( imageSize.height, imageSize.width, CV_8U );
		// because the values in the left disparity images are
		// usually negative
		cvConvertScale( disp, disparity_left_visual, 1 );
		// cvSave( "disparity.pgm", disparity_left_visual );
		return disparity_left_visual;
		//cvSaveImage( ".out/disparity.pgm", disparity_left_visual );
	}else {return 0;}
}