Я хочу создать карту глубины, чтобы получить 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);
У вас есть идея, почему это произошло? Как я могу решить это? Я хотел бы иметь плоскую поверхность вывески.
Возможно, вы могли бы немного улучшить ситуацию, поиграв с параметрами SGBM, но реальность такова стерео данные шумят и вы не должны ожидать, что в вашем облаке точек появится совершенно плоский знак.
Если вы заинтересованы в поиске трехмерного местоположения знака, сегментирование знака по изображению RGB и усреднение соответствующих точек в облаке точек должно дать разумные результаты.