Почему StereoSGBM дает отрицательное число и выше числа Disparities

Я пишу функцию в OpenCV для вычисления v и u-диспропорций, поэтому мне сначала нужно изображение диспаратности. Я установил sgbm.minDisparity = 0 и numberOfDisparities = 160.

Изображение несоответствия — CV_16SC1, и мне нужны значения без знака, чтобы продолжить программирование моей функции.

Я напечатал весь Mat, и есть отрицательные значения и значения выше 160. Если я хорошо понял документацию, изображение несоответствия представляет значения несоответствия * 16. Значит ли это, что максимальное значение составляет 16 * 160 в моем случае? Если нет, то что может быть не так? И вообще, почему существуют значения меньше нуля, когда minDisparity установлен в 0? Вот код:

void Stereo_SGBM(){
int numberOfDisparities;
StereoSGBM sgbm;
Mat img1, img2;

img1=left_frame;   //left and right frames are global variables
img2=right_frame;

Size img_size = img1.size();

//I make sure the number of disparities is divisible by 16
numberOfDisparities = 160;

int cn=1;   //Grayscale

sgbm.preFilterCap = 63;
sgbm.SADWindowSize = 3;
sgbm.P1 = 8*cn*sgbm.SADWindowSize*sgbm.SADWindowSize;
sgbm.P2 = 32*cn*sgbm.SADWindowSize*sgbm.SADWindowSize;
sgbm.minDisparity = 0;
sgbm.numberOfDisparities = numberOfDisparities;
sgbm.uniquenessRatio = 10;
sgbm.speckleWindowSize = 100;
sgbm.speckleRange = 2;
sgbm.disp12MaxDiff = 1;
sgbm.fullDP = false;

Mat disp;   // CV_16SC1
Mat disp8;  //CV_8UC1 (used later in the codesgbm(img1, img2, disp);
//disp contains negative values and larger than 160!!!

//img1 and img2 are left and right channels of size 1242x375 grayscale
}

2

Решение

На мой взгляд, диспропорция должна быть плавающей, и это отражается на параметрах. Если вы преобразуете результат в число с плавающей точкой и делите его на 16, все становится немного более понятным:

Алгоритм, по-видимому, сообщает -1 (фактически minDisparity — 1), где он не может совпадать. И числоOfDisparities — это больше «максимальное несоответствие — минимальное несоответствие», а не фактическое число значений.

Например, если вы зададите minDisparity = 2 и numberOfDisparities = 144, вы получите результаты в диапазоне: 1,0 — 145,0. Количество различных значений на самом деле будет 144 * 16, потому что оно идет с шагом 1/16.

Так что да, в вашем случае, используя целые числа, это означает, что вы получите максимальное значение 16 * 160.

1

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

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

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