StereoBM в OpenCV 2.4.3 дает недетерминированные результаты

Я использую StereoBM для вычисления карты стерео-диспаратности с использованием OpenCV 2.4.3, и мне кажется, что я получаю разные карты диспаратности при каждом запуске. Визуально не заметно, но несколько пикселей разные, в случайном порядке.

Я попытался сохранить карту диспаратности в YML-файл, и, сравнив их с помощью WinMerge, я заметил, что несколько пикселей имеют значение -16, когда другой прогон выдает значение диспаратности. Это также легко воспроизводимо.

Этот фрагмент показывает, что я делаю:


//initialize bm
StereoBM bm(StereoBM::BASIC_PRESET, 128, 7);
bm.state->preFilterType = CV_STEREO_BM_XSOBEL;
bm.state->preFilterCap = 63;
bm.state->SADWindowSize = 7;
bm.state->minDisparity = 0;
bm.state->numberOfDisparities = 96;
bm.state->textureThreshold = 3;
bm.state->uniquenessRatio = 3;
bm.state->speckleWindowSize = 20;
bm.state->speckleRange = 32;
bm.state->disp12MaxDiff = 1;


// Get rectified images
videoOut[MASTER] = Mat(frameHeight, frameWidth, CV_8UC3, static_cast(frameBuf[MASTER]));
videoOut[SLAVE] = Mat(frameHeight, frameWidth, CV_8UC3, static_cast(frameBuf[SLAVE]));


// grayscale conversion
cvtColor(videoOut[MASTER], frame[MASTER], CV_RGB2GRAY);
cvtColor(videoOut[SLAVE], frame[SLAVE], CV_RGB2GRAY);


// Subsample
resize(frame[MASTER], frame[MASTER], cv::Size(), 0.5, 0.5, cv::INTER_LINEAR);
resize(frame[SLAVE], frame[SLAVE], cv::Size(), 0.5, 0.5, cv::INTER_LINEAR);


// stereo computation
Mat disp = cv::Mat(frame[MASTER].rows, frame[MASTER].cols, CV_16S);
bm(frame[MASTER], frame[SLAVE], disp);


// write to file
FileStorage f1;
f1.open("data.yml", FileStorage::WRITE);
f1 << "disp" << disp;

Это ошибка в OpenCV или я что-то не так делаю?
Я также попытался записать входные изображения, и они всегда были идентичны. Изменяется только карта диспаратности.

1

Решение

Задача ещё не решена.

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]