Обрезать только действительные пиксели после переназначения с помощью стерео выпрямления «рыбий глаз»? - PullRequest
0 голосов
/ 12 октября 2019

У меня есть две камеры со смещением по горизонтали, и я получил их параметры калибровки (матрица камеры и коэффициенты искажения, а также преобразование между ними) с использованием Kalibr в рамках модели эквидистантного отверстия (коэффициенты искажения k1, k2, k3, k4).

Я хочу использовать openCVs cv.fisheye.stereoRectify для создания новых проекционных матриц для каждой камеры, которую я могу подать в cv.fisheye.initUndistortRectifyMap, а затем в cv.remapвыпрямить и удалить все изображения.

К сожалению, даже если для параметра fisheye.stereoRectify, установленного в 0, установлено значение balance, в remap редактируемых изображениях по-прежнему присутствуют черные пиксели. Я хочу обрезать каждое изображение так, чтобы ни в одном из неискаженных изображений с камеры не было недопустимых пикселей.

Я вижу, что стандартная функция cv.stereoRectify имеет параметр alpha, который точно выполняетэто. Но похоже, что cv.fisheye.stereoRectify не имеет этого параметра. Поэтому я хочу воспроизвести его особенности.

cv.stereoRectify, похоже, использует модель искажений Радтана (параметры искажения k1, k2, p1, p2), поэтому я не думаю, что смогу легко поменять эту функцию, поскольку у меня нет p1 иФрагмент p2.

из моего конвейера, приведенный ниже:

R1, R2, P1, P2, Q = cv2.fisheye.stereoRectify(mtx_right, dist_right, 
                                              mtx_left, dist_left, 
                                              (960,1280), R, tvec, 
                                              flags=cv2.CALIB_ZERO_DISPARITY,
                                              balance= 0.0, fov_scale=1)

map1_right, map2_right = cv2.fisheye.initUndistortRectifyMap(mtx_right, dist_right, 
                                                             R1, P1[0:3, 0:3], 
                                                             (1280, 960), cv2.CV_16SC2)  

map1_left, map2_left = cv2.fisheye.initUndistortRectifyMap(mtx_left, dist_left,
                                                           R2, P2[0:3, 0:3],
                                                           (1280, 960), cv2.CV_16SC2)

undistorted_right = cv2.remap(img_rgb_right, map1_right, map2_right, 
                             interpolation=cv2.INTER_LINEAR,
                             borderMode=cv2.BORDER_CONSTANT)
undistorted_left = cv2.remap(img_rgb_left, map1_left, map2_left, 
                            interpolation=cv2.INTER_LINEAR,
                            borderMode=cv2.BORDER_CONSTANT)

Есть ли простой способ получить ту же функциональность, которую alpha производит в традиционном cv.stereoRectify? balance=0 кажется близким, но не полностью обрезает недопустимые пиксели.

ТЕКУЩИЙ ВЫХОД (balance=0.5, чтобы немного уменьшить масштаб) fisheye.stereoRectify

ЦЕЛЬДЛЯ ОБОИХ ИЗОБРАЖЕНИЙ, ЧТОБЫ ТОЛЬКО ПОКАЗАТЬ ЧТО В ЗЕЛЕНОМ КОРОБКЕ (те же размеры, если неясно, какой из них имеет меньший действительный пиксельный прямоугольник):

goal

1 Ответ

1 голос
/ 13 октября 2019

Вот как я бы сделал это в Imagemagick, используя -trim. Я отмечаю, что -trim может отслеживать смещения верхнего левого угла после обрезки относительно того, где он был до обрезки (оставляя off + repage, который очищает эту информацию о геометрии). Поэтому я обрезаю каждое изображение и отслеживаю его. Затем я помещаю обрезанные изображения на черный фон отдельно, а затем добавляю два результата рядом друг с другом, а затем снова обрезаю черный.

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

Слева:

enter image description here

Справа:

enter image description here

magick left.png -format "%wx%h" -write info: -fuzz 15% -trim \
-fuzz 5% -define trim:percent-background=0 \
-define trim:background-color=black -trim left_im_trim.png

magick right.png -format "%wx%h" -write info: -fuzz 15% -trim \
-fuzz 5% -define trim:percent-background=0 \
-define trim:background-color=black -trim right_im_trim.png


magick \
\( left_im_trim.png -set page "%wx+0+%Y" -background black -flatten \)  \
\( right_im_trim.png -set page "%wx+0+%Y" -background black -flatten \) \
-background black +append \
-define trim:percent-background=0 \
-define trim:background-color=black \
-trim +repage left_right_trim_append.png


Обрезка влево:

enter image description here

Обрезка вправо:

enter image description here

Добавлены и подрезаны снова:

enter image description here

Я оставил вышеупомянутые 3 команды отдельно, чтобы можно было увидеть результаты. Но все они могут быть объединены в одну длинную командную строку.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...