C ++ / OpenCV — проблема с картой глубины: элементы в Cloud Point имеют некоторые искажения

Я хочу создать карту глубины, чтобы получить 3D-положение каждого пикселя, чтобы у меня была 3D-позиция выбранного элемента на моем изображении. Чтобы убедиться, что мои данные о глубине верны, я визуализирую их с помощью MeshLab.

Я использую стерео данные набора данных KITTI, поэтому изображения выпрямленный и предусмотрена калибровка для каждой камеры.

Процесс следующий:

Изображение слева + изображение справа -> Вычислить несоответствие, используя Stereo Semi Global Matching (SGBM) -> Вычислить карту глубины, используя cv :: reprojectImageTo3D () с Q, инициализированным благодаря параметрам калибровки и благодаря этой функции:

 cv::stereoRectify(cameraMatrix1, distCoeffs1, cameraMatrix2, distCoeffs2, imgSize, R, T, R1, R2, P1, P2, Q);

Моя проблема заключается в следующем:
введите описание изображения здесь
введите описание изображения здесь
введите описание изображения здесь

Дорога хорошо, но вывеска есть некоторые искажения. Я не понимаю, и я пытался изменить параметры, но безуспешно. У меня всегда есть это искажение. Это раздражает, потому что я не могу рассчитать хорошее 3D-положение вывески.
Я пробовал также с классическим сопоставлением блоков, но это то же самое, и результаты не так хороши по сравнению с полуглобальным.

Однако мое несоответствие выглядит так (что мне кажется хорошим):
введите описание изображения здесь

Параметры вычисления диспаратности следующие:

    StereoSGBM sgbm;
sgbm.SADWindowSize = 3;
sgbm.numberOfDisparities = 128;
sgbm.preFilterCap = 10;
sgbm.minDisparity = 0;
sgbm.uniquenessRatio = 10.0;
sgbm.speckleWindowSize = 100;
sgbm.speckleRange = 32;
sgbm.disp12MaxDiff = 1;
sgbm.fullDP = 1;
sgbm.P1 = sgbm.SADWindowSize*sgbm.SADWindowSize*4;
sgbm.P2 = sgbm.SADWindowSize*sgbm.SADWindowSize*32;

sgbm(gray1, gray2, disp);

У вас есть идея, почему это произошло? Как я могу решить это? Я хотел бы иметь плоскую поверхность вывески.

2

Решение

Возможно, вы могли бы немного улучшить ситуацию, поиграв с параметрами SGBM, но реальность такова стерео данные шумят и вы не должны ожидать, что в вашем облаке точек появится совершенно плоский знак.

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

0

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


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