Я написал код, чтобы найти карту несоответствия из двух изображений «слева» и «справа»; и сохранение карты в «стерео». Код кажется мне нормальным, но почему-то я получаю исключение:
В окне терминала:
Ошибка OpenCV: неверный аргумент (неизвестный тип массива) в неизвестной функции, файл …… \ src \ opencv \ modules \ core \ src \ matrix.cpp, строка 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 Ultimate 2012, Windows 8, OpenCV 2.4.4.
Пожалуйста, объясните мне, как исправить это исключение.
Я думаю
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);
Я не знаю, будет ли это работать или нет, но API-интерфейс C ++ 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 );
Других решений пока нет …