Вот код, который я написал, чтобы получить фид от двух веб-камер и получить текущую карту диспаратности. code::blocks
возвращает -1 для этого, мои веб-камеры мигают, но ничего не происходит.
Мне нужно это зациклить, пока я не нажму 'q'
,
// Live depthmap
#include "cv.h"#include "cxmisc.h"#include "highgui.h"#include "cvaux.h"#include <vector>
#include <string>
#include <algorithm>
#include <stdio.h>
#include <ctype.h>
using namespace std;
int main(void) {
//Setup for finding stereo correspondences
CvStereoBMState *BMState = cvCreateStereoBMState();
assert(BMState != 0);
BMState->preFilterSize=41;
BMState->preFilterCap=31;
BMState->SADWindowSize=41;
BMState->minDisparity=-64;
BMState->numberOfDisparities=128;
BMState->textureThreshold=10;
BMState->uniquenessRatio=15;
IplImage *frameL = 0;
IplImage *frameR = 0;
CvCapture *captureL = 0;
CvCapture *captureR = 0;
char key = 's';
//Initialize left and right camera
captureL = cvCaptureFromCAM(0);
captureR = cvCaptureFromCAM(1);
CvSize imageSize = {640,480};
// preparing matrices
CvMat* img1r = cvCreateMat( imageSize.height,
imageSize.width, CV_8UC1 );
CvMat* img2r = cvCreateMat( imageSize.height,
imageSize.width, CV_8UC1 );
CvMat* disp = cvCreateMat( imageSize.height,
imageSize.width, CV_16S );
CvMat* vdisp = cvCreateMat( imageSize.height,
imageSize.width, CV_8U );
CvMat* img1rnew = cvCreateMat( imageSize.height,
imageSize.width, CV_8UC1 );
CvMat* img2rnew = cvCreateMat( imageSize.height,
imageSize.width, CV_8UC1 );
//loading in mapx and mapy xml
CvMat *mx1 = (CvMat *)cvLoad("mx1.xml",NULL,NULL,NULL);
CvMat *my1 = (CvMat *)cvLoad("my1.xml",NULL,NULL,NULL);
CvMat *mx2 = (CvMat *)cvLoad("mx2.xml",NULL,NULL,NULL);
CvMat *my2 = (CvMat *)cvLoad("my2.xml",NULL,NULL,NULL);
//loop till 'q' is entered
while( key != 'q' ){
frameL = cvQueryFrame(captureL);
frameR = cvQueryFrame(captureR);
IplImage* img1=frameL;
IplImage* img2=frameR;
// cloning img for remap
img1r=(CvMat *)cvCloneImage(img1);
img2r=(CvMat *)cvCloneImage(img2);
// remapping
cvRemap( img1, img1r, mx1, my1 );
cvRemap( img2, img2r, mx2, my2 );
// bm needs mat of type CV_8UC1
cvConvertImage(img1r, img1rnew, 0);
cvConvertImage(img2r, img2rnew, 0);
//block matching
cvFindStereoCorrespondenceBM( img1rnew, img2rnew, disp,
BMState);
cvNormalize( disp, vdisp, 0, 256, CV_MINMAX );
// show disparity map live from cam
cvNamedWindow( "disparity" );
cvShowImage( "disparity", vdisp );
// housekeeping
cvReleaseImage( &img1 );
cvReleaseImage( &img2 );
}
// housekeeping
cvReleaseStereoBMState(&BMState);
cvReleaseMat( &mx1 );
cvReleaseMat( &my1 );
cvReleaseMat( &mx2 );
cvReleaseMat( &my2 );
cvReleaseMat( &img1r );
cvReleaseMat( &img2r );
cvReleaseMat( &disp );
cvReleaseCapture(&captureL);
cvReleaseCapture(&captureR);
return(0);
}
Задача ещё не решена.
Других решений пока нет …