2013-03-19 4 views
0

Я написал код, чтобы найти карту несоответствия с двух изображений «слева» и «справа»; и сохранение карты в «стерео». Код кажется, хорошо для меня, но как-то я получаю исключение:opencv дает исключение с cvFindStereoCorrespondenceBM

На окне терминала:

OpenCV Error: Bad argument (Unknown array type) in unknown function, file ......\src\opencv\modules\core\src\matrix.cpp, line 698

код

Mat left = imread("files\\left.jpg"); 
Mat right = imread("files\\right.jpg"); 
Size size = left.size(); 
namedWindow("left", CV_WINDOW_AUTOSIZE); 
imshow("left", left); 
cvNamedWindow("right", CV_WINDOW_AUTOSIZE); 
imshow("right", right); 

Mat left_C1; 
cvtColor(left, left_C1, CV_RGB2GRAY); 
Mat right_C1; 
cvtColor(right, right_C1, CV_RGB2GRAY); 

Mat stereo = Mat(size, CV_16SC1); 
CvStereoBMState* state = cvCreateStereoBMState(); 

state->preFilterSize=5; 
state->preFilterCap=1; 
state->SADWindowSize=5; 
state->minDisparity=0; 
state->numberOfDisparities=64; 
state->textureThreshold=0; 
state->uniquenessRatio=0; 

cvFindStereoCorrespondenceBM(&left_C1, &right_C1, &stereo, state); 

namedWindow("stereo", CV_WINDOW_AUTOSIZE); 
imshow("stereo",stereo); 
waitKey(0); 

Я использую VS конечной 2012, Windows 8 , OpenCV 2.4.4. Пожалуйста, объясните, как исправить это исключение.

ответ

3

Я думаю, cvFindStereoCorrespondenceBM требуется IplImage или cvMat. Поскольку вы используете Mat, вы должны использовать C++ API OpenCV.

StereoBM sbm; 
sbm.state->SADWindowSize = 23; 
sbm.state->numberOfDisparities = 96; 
sbm.state->preFilterSize = 25; 
sbm.state->preFilterCap = 63; 
sbm.state->minDisparity = 0; 
sbm.state->textureThreshold = 20; 
sbm.state->uniquenessRatio = 10; 
sbm.state->speckleWindowSize = 25; 
sbm.state->speckleRange = 8; 
sbm.state->disp12MaxDiff = 1; 
// change the parameters 

sbm(left_c1, right_c1, stereo); 

Поскольку вы используете Mat, вы должны попробовать это и проверить, работает оно или нет.

cvFindStereoCorrespondenceBM(left_C1, right_C1, stereo, state); 

Я не знаю, будет ли это работать или нет, но C++ API StereoBM, безусловно, будет работать.

Попробуйте это и посмотрите, работает ли оно.

#define WIDTH 426 
#define HEIGHT 320 

Определить размер можно.

CvSize imageSize = {WIDTH,HEIGHT}; 
CvMat* frame1r = cvCreateMat(imageSize.height,imageSize.width, CV_8U); 
CvMat* frame2r = cvCreateMat(imageSize.height,imageSize.width, CV_8U); 
CvMat* disp = cvCreateMat(imageSize.height, imageSize.width, CV_16S); 
CvMat* vdisp = cvCreateMat(imageSize.height,imageSize.width, CV_8U); 

// Load image in frame1r and frame2r 

cvFindStereoCorrespondenceBM(frame1r, frame2r, disp, state); 
cvNormalize(disp, vdisp, 0, 256, CV_MINMAX);     
cvShowImage("disparity", vdisp); 
+1

+1 Я собирался предложить использовать 'недействительной StereoBM :: оператор()' из C++ – Alexey

+0

C++ API StereoBM работала как шарм! Спасибо. – Jekin