Почитал информацию на этой ветке форума, спасибо, кое в чем помогла.
Карта глубины, например для изображения:
у меня уже получается хотя и далекая от идеала:
однако когда использую cvReprojectImageTo3D, то получается http://www.4shared.com/download/IZs-VLCL/pict3.JPG?tsid=20130609-143805-5a2a3a37. Причем цвета никак не изменяются при приближении или удалении объектов. Может
кто-нибудь с таким сталкивался?
int nStereoPreFilterSize;
int nStereoPreFilterCap;
int nStereoSADWindowSize;
int nStereoMinDisparity;
int nStereoNumDisparities;
int nStereoTextureThreshold;
int nStereoUniquenessRatio;
CvMat *Q = (CvMat *)cvLoad("Q.xml",NULL,NULL,NULL);
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);
void depthMap(IplImage *img0, IplImage *img1, IplImage *Image3D){
CvStereoBMState *state = cvCreateStereoBMState();
state->preFilterSize=nStereoPreFilterSize;
state->preFilterCap=nStereoPreFilterCap;
state->SADWindowSize=nStereoSADWindowSize;
state->minDisparity= nStereoMinDisparity*-16;
state->numberOfDisparities=nStereoNumDisparities*16;
state->textureThreshold=nStereoTextureThreshold;
state->uniquenessRatio=nStereoUniquenessRatio;
//double Q[] = { 1., 0., 0., -327.73883438110352,
//0., 1., 0.,-239.84486865997314,
//0., 0., 0., 524.04542174159019,
//0.,0., -0.30009508961926923, 1.2438668093184739 };
//CvMat _Q;
//cvInitMatHeader(&_Q,4,4,CV_32FC1,Q);
CvSize size = cvGetSize(img0);
IplImage *img0_g = cvCreateImage(size, IPL_DEPTH_8U,1);
IplImage *img1_g = cvCreateImage(size, IPL_DEPTH_8U,1);
CvMat* disp = cvCreateMat( size.height, size.width, CV_16S);
IplImage *img0r = cvCreateImage(size, IPL_DEPTH_8U,1);
IplImage *img1r = cvCreateImage(size, IPL_DEPTH_8U,1);
cvCvtColor( img0, img0_g, CV_BGR2GRAY );
cvCvtColor( img1, img1_g, CV_BGR2GRAY );
//cvRemap( img0_g, img0r, mx1, my1);
//cvRemap( img1_g, img1r, mx2, my2);
cvFindStereoCorrespondenceBM( img0_g, img1_g,/*img0r, img1r,*/ disp, state );
CvMat* disp_visual = cvCreateMat( size.height, size.width, CV_8U );
cvNormalize( disp, disp_visual, 0, 256, CV_MINMAX );
//double min_val, max_val;
//cvMinMaxLoc(disp, &min_val, &max_val);
//if(min_val!=max_val)
//{
//cvConvertScale(disp, disp_visual, 255.0/(max_val-min_val),-min_val/(max_val-min_val));
//}
cvShowImage("difmap", disp_visual);
cvReprojectImageTo3D(disp_visual, Image3D, Q/*&_Q*/);
cvReleaseMat(&disp);
cvReleaseStereoBMState(&state);
cvReleaseMat (&disp_visual);
cvReleaseImage (&img0r);
cvReleaseImage (&img1r);
cvReleaseImage(&img0_g);
cvReleaseImage(&img1_g);
}
void myStereoPreFilterSize(int pos) {
nStereoPreFilterSize = pos;
if( nStereoPreFilterSize % 2 == 0 ) {nStereoPreFilterSize++; pos++;}
if( nStereoPreFilterSize < 5 ) nStereoPreFilterSize = 5;
}
void myStereoPreFilterCap(int pos) {
nStereoPreFilterCap = pos;
if( nStereoPreFilterCap < 1 ) nStereoPreFilterCap = 1;
}
void myStereoSADWindowSize(int pos) {
nStereoSADWindowSize = pos;
if( nStereoSADWindowSize % 2 == 0 ) {nStereoSADWindowSize++; pos++;}
if( nStereoSADWindowSize < 5 ) nStereoSADWindowSize = 5;
}
void myStereoMinDisparity(int pos) {
nStereoMinDisparity = pos;
if( nStereoMinDisparity < 0) nStereoMinDisparity=0;
}
void myStereoNumDisparities(int pos) {
nStereoNumDisparities = pos;
if( nStereoNumDisparities <1 ) nStereoNumDisparities=1;
}
void myStereoTextureThreshold(int pos) {
nStereoTextureThreshold = pos;
if( nStereoTextureThreshold < 0 ) nStereoTextureThreshold = 1;
}
void myStereoUniquenessRatio(int pos) {
nStereoUniquenessRatio = pos;
if( nStereoUniquenessRatio < 0 ) nStereoUniquenessRatio = 0;
}
int main(int argc, char* argv[])
{
nStereoPreFilterSize = 5;
nStereoPreFilterCap = 1;
nStereoSADWindowSize = 5;
nStereoMinDisparity = 0;
nStereoNumDisparities = 1;
nStereoTextureThreshold = 1;
nStereoUniquenessRatio = 0;
CvCapture *capture0 = 0, *capture1 = 0;
IplImage *frame0 = 0, *frame1 = 0;
IplImage *img = 0, *img1 = 0, *imgContours = 0;
capture0 = cvCreateCameraCapture(0);
capture1 = cvCreateCameraCapture(1);
cvSetCaptureProperty(capture0, CV_CAP_PROP_FRAME_WIDTH, 640);//1280);
cvSetCaptureProperty(capture1, CV_CAP_PROP_FRAME_HEIGHT, 480);//960);
cvNamedWindow("capture0", CV_WINDOW_AUTOSIZE);
cvNamedWindow("capture1", CV_WINDOW_AUTOSIZE);
cvNamedWindow("depthmap",CV_WINDOW_AUTOSIZE);
cvNamedWindow("difmap",CV_WINDOW_AUTOSIZE);
cvNamedWindow("trackBars",CV_WINDOW_AUTOSIZE);
cvCreateTrackbar("nStereoPreFilterSize", "trackBars", &nStereoPreFilterSize, 255, myStereoPreFilterSize);
cvCreateTrackbar("nStereoPreFilterCa", "trackBars", &nStereoPreFilterCap, 63, myStereoPreFilterCap);
cvCreateTrackbar("nStereoSADWindowSize", "trackBars", &nStereoSADWindowSize, 255, myStereoSADWindowSize);
cvCreateTrackbar("nStereoMinDisparity", "trackBars", &nStereoMinDisparity, 255, myStereoMinDisparity);
cvCreateTrackbar("nStereoNumDisparities", "trackBars", &nStereoNumDisparities, 255, myStereoNumDisparities);
cvCreateTrackbar("nStereoTextureThreshold", "trackBars", &nStereoTextureThreshold, 255, myStereoTextureThreshold);
cvCreateTrackbar("nStereoUniquenessRatio", "trackBars", &nStereoUniquenessRatio, 255, myStereoUniquenessRatio);
int counter = 0;
char filename0[512];
char filename1[512];
while(true){
frame0 = cvQueryFrame(capture0);
frame1 = cvQueryFrame(capture1);
imgContours = cvCreateImage( cvGetSize(frame0), IPL_DEPTH_32F, 3 );
cvShowImage("capture0", frame0);
cvShowImage("capture1", frame1);
depthMap (frame0, frame1, imgContours);
cvShowImage("depthmap", imgContours);
char c = cvWaitKey(33);
if (c == 27) { // нажата ESC
cvReleaseImage(&img);
cvReleaseImage(&imgContours);
break;
}
cvReleaseImage(&img);
cvReleaseImage(&imgContours);
}
cvDestroyAllWindows();
cvReleaseCapture(&capture0);
cvReleaseCapture(&capture1);
return 0;
}