Я пишу функцию в 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
}
На мой взгляд, диспропорция должна быть плавающей, и это отражается на параметрах. Если вы преобразуете результат в число с плавающей точкой и делите его на 16, все становится немного более понятным:
Алгоритм, по-видимому, сообщает -1 (фактически minDisparity — 1), где он не может совпадать. И числоOfDisparities — это больше «максимальное несоответствие — минимальное несоответствие», а не фактическое число значений.
Например, если вы зададите minDisparity = 2 и numberOfDisparities = 144, вы получите результаты в диапазоне: 1,0 — 145,0. Количество различных значений на самом деле будет 144 * 16, потому что оно идет с шагом 1/16.
Так что да, в вашем случае, используя целые числа, это означает, что вы получите максимальное значение 16 * 160.
Других решений пока нет …