Код карты несоответствия в openCV C ++

Я откалибровал и выпрямил стерео-изображения в MATLAB с помощью набора инструментов Caltech (http://www.vision.caltech.edu/bouguetj/calib_doc/). Я пробовал использовать несовместимость в MATLAB, и теперь он не дает хороших результатов. Я хотел бы попробовать его в OPENCV. Я не смог найти образец кода OPENCV для несоответствия на их веб-сайте. так что это код, который я нашел до сих пор: (код взят из http://www.jayrambhia.com/blog/disparity-maps/)

#include "opencv2/core/core.hpp"
#include "opencv2/calib3d/calib3d.hpp"
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/imgproc/imgproc.hpp>
#include "opencv2/contrib/contrib.hpp"
#include <stdio.h>
#include <string.h>
using namespace cv;
using namespace std;

int main(int argc, char* argv[])
{
Mat img1, img2, g1, g2;
Mat disp, disp8;

//char* method = argv[3];
char* method = "SGBM";

//img1 = imread(argv[1]);
//img2 = imread(argv[2]);
img1 = imread("leftImage.jpg");
img2 = imread("rightImage.jpg");

cvtColor(img1, g1, CV_BGR2GRAY);
cvtColor(img2, g2, CV_BGR2GRAY);

if (!(strcmp(method, "BM")))
{
    StereoBM sbm;
    sbm.state->SADWindowSize = 9;
    sbm.state->numberOfDisparities = 112;
    sbm.state->preFilterSize = 5;
    sbm.state->preFilterCap = 61;
    sbm.state->minDisparity = -39;
    sbm.state->textureThreshold = 507;
    sbm.state->uniquenessRatio = 0;
    sbm.state->speckleWindowSize = 0;
    sbm.state->speckleRange = 8;
    sbm.state->disp12MaxDiff = 1;
    sbm(g1, g2, disp);
}
else if (!(strcmp(method, "SGBM")))
{
    StereoSGBM sbm;
    sbm.SADWindowSize = 3;
    sbm.numberOfDisparities = 144;
    sbm.preFilterCap = 63;
    sbm.minDisparity = -39;
    sbm.uniquenessRatio = 10;
    sbm.speckleWindowSize = 100;
    sbm.speckleRange = 32;
    sbm.disp12MaxDiff = 1;
    sbm.fullDP = false;
    sbm.P1 = 216;
    sbm.P2 = 864;
    sbm(g1, g2, disp);
}


normalize(disp, disp8, 0, 255, CV_MINMAX, CV_8U);

imshow("left", img1);
imshow("right", img2);
imshow("disp", disp8);

waitKey(0);

return(0);

}

и это ошибка, которую я получаю:

Необработанное исключение в 0x000007FEFD4D940D в OPEN_CV_TEST.exe: исключение Microsoft C ++: cv :: Exception в ячейке памяти 0x0000000000149260.

Я новичок в C ++, и нет описания процедуры запуска кода. поэтому я просто помещаю эти левые и правые изображения в папку \ x64 \ Debug моего проекта и запускаю код в MS Visual Studio 2012 Windows 7 64 бит. Я создал проект раньше, провел пробный тест, и он сработал. так что теперь я просто копирую приведенный выше код в основной исходный файл C ++. Я предполагаю, что не должно быть пропущенных файлов библиотеки или файлов заголовков. Также обратите внимание, что мне не нужно исправлять изображения, и нет необходимости в стерео сопоставлении прямо сейчас. любая помощь приветствуется.


person CV_passionate    schedule 29.07.2014    source источник
comment
Чтобы быть ясным, я нашел этот код соответствия стереозвука с веб-сайта opencv (github.com/Itseez/opencv/blob/master/samples/cpp/), но опять же, у меня нет файлов калибровки камеры, поэтому я не могу использовать этот код.   -  person CV_passionate    schedule 29.07.2014
comment
Вы предоставили все необходимые библиотеки DLL? У меня было аналогичное исключение, когда я не помещал библиотеки DLL вместе с исполняемым файлом (или не помещал их в переменную среды PATH)?   -  person marol    schedule 30.07.2014
comment
да. Я скопировал все библиотеки DLL прямо в папку \ x64 \ Debug моего проекта. Я думаю, проблема в том, как запустить код. потому что я поместил это в начало main: if (argc! = 4) {std :: cout ‹* Требуются 3 аргумента, 2 изображения для отображения и метод ‹< endl; возврат -1; } и теперь он завершается с ошибкой -1. Означает ли это, что я неправильно запускаю код?   -  person CV_passionate    schedule 31.07.2014


Ответы (1)


Я понял! это была функция imread в OPENCV, которая вызывала проблемы! Вместо этого я использовал cvLoadImage. Я также помещаю изображения в папку проекта рядом с файлами CPP, а также в папки DEBUG. Теперь он работает нормально. Очевидно, функция "IMREAD" - известная проблема в OPENCV!

person CV_passionate    schedule 14.08.2014
comment
Использование устаревшего cvLoadImage вместо нового imread не может считаться правильным решением ... - person Antonio; 05.04.2015