В настоящее время я работаю над обработкой стерео с использованием opencv2.3 и стереокамеры Pointgrey Bumblebee2 в качестве устройства ввода. Получение изображений осуществляется через libdc1394.
Мой код для выпрямления и обработки стерео следующий:
void StereoProcessing::calculateDisparityMap(const Mat &left, const Mat &right, Mat &disparity_map)
Mat map11, map12, map21, map22, left_rectified, right_rectified, disp16;
// Computes the undistortion and rectification transformation maps
initUndistortRectifyMap(this->camera_matrix1,
this->distance_coefficients1,
this->R1,
this->P1,
this->output_image_size,
CV_16SC2,
map11,
map12);
initUndistortRectifyMap(this->camera_matrix2,
this->distance_coefficients2,
this->R2,
this->P2,
this->output_image_size,
CV_16SC2,
map21,
map22);
// creates rectified images
remap(left, left_rectified, map11, map12, INTER_LINEAR);
remap(right, right_rectified, map21, map22, INTER_LINEAR);
// calculates 16-bit disparitymap
this->stereo_bm(left_temp, right_temp, disp16);
disp16.convertTo(disparity_map, CV_8U, 255 / (this->stereo_bm.state->numberOfDisparities * 16.0));
}
Это прекрасно работает, за исключением черной левой границы на карте диспаратности, которая выглядит следующим образом:
Входными изображениями являются эти два — как вы можете не видеть;):
Итак, мой вопрос сейчас:
Это нормальное поведение? Или вы видите какую-либо ошибку, которую я сделал до сих пор?
Как другая информация, исправление работает отлично
Ширина отсутствующей области эквивалентна количеству несоответствий, используемых в stereo_bm. Это нормальный побочный продукт stereo_bm algorithm
,
Я думаю, что это происходит потому, что алгоритм вычисляет диспаратность путем сопоставления блоков вокруг пикселей от левого изображения с блоками вокруг пикселей в той же строке на правом изображении (при условии, что изображения выпрямлены). Поскольку существует область, в которой нет перекрытия между видами с левой камеры и с правой камеры, алгоритм не может найти соответствие для блоков вокруг пикселей в этой области. Ширина «отсутствующей» области равна параметру «количество различий», потому что алгоритм прекращает попытки сопоставления с данным блоком после попыток «количества различий» (в той же горизонтальной строке, что и пиксель на левом изображении). Мне жаль, если я не достаточно ясно Если вы хотите получить более подробную информацию о том, как это работает, есть код в http://siddhantahuja.wordpress.com/2010/04/11/correlation-based-similarity-measures-summary/.