Основная проблема:
Восстановите объект только по 2 изображениям (по крайней мере, что можно воспринять по 2 изображениям).
О камере:
Я использую камеру iPhone 7 и делаю свои собственные снимки, что означает, что я могу откалибровать свою камеру. Я могу получить фокусное расстояние (4 мм) и ширину сенсора (3,99 мм) по адресу: https://www.anandtech.com/show/10685/the-iphone-7-and-iphone-7-plus.-review/6. Я также знаю, что могу получить свое фокусное расстояние в пикселях из этих известных значений и моих c_x и c_y из ширины и высоты. Я не уверен, что калибровка правильная.
Мой текущий подход:
Я использую очень похожий подход, который использовался в этом сообщении: 3D-реконструкция из 2 изображений с базовой линией и калибровкой одной камеры
Алгоритм:
criteria = (cv2.TERM_CRITERIA_EPS | cv2.TERM_CRITERIA_COUNT, 10, 0.03)
feature_params = dict( maxCorners = 100, qualityLevel = 0.3, minDistance = 7, blockSize = 7 )
lk_params = dict( winSize = (15,15),maxLevel = 20, criteria = (cv2.TERM_CRITERIA_EPS | cv2.TERM_CRITERIA_COUNT, 10, 0.03))
- Обнаружение углов на левом изображении с помощью
enter code here
введите код здесьcv2.goodFeaturesToTrack(gray,mask = None, **feature_params)
- Уточните углы, найденные с помощью
corners1= cv2.cornerSubPix(gray,corners1,(11,11),(-1,-1),criteria)
- Найдите углы на правом изображении с помощью оптического потока
corners_r, st, err = cv2.calcOpticalFlowPyrLK(gray, r_gray, corners1, None, **lk_params)
- Оставьте только хорошие моменты
good_left = corners1[st==1]
иgood_right = corners_r[st==1]
(Функции соответствуют изображениям) - Найдите фундаментальную матрицу из выбранных точек
F, mask = cv2.findFundamentalMat(good_left,good_right,cv2.FM_RANSAC)
- Рассчитать H1, H2 для исправления изображений с помощью
_,H1,H2=cv2.stereoRectifyUncalibrated(good_left, good_right, F, right.shape[:2], threshold=5.0)
- Исправьте изображения
new_left = cv2.warpPerspective(img5,H1,img5.shape[:2],cv2.INTER_LINEAR or cv2.INTER_NEAREST) new_right= cv2.warpPerspective(img3,H2,img3.shape[:2],cv2.INTER_LINEAR or cv2.INTER_NEAREST)
(изображения, изображенные ниже рис. 1) - Рассчитайте карту несоответствий, используя
sgbm
в opencv. - Реконструировать 3D-объект с помощью
reprojectImageTo3D
Проблемы:
- В настоящее время изображения не искажаются, так как использование моей матрицы камеры
array([[ 3.25203085e+03, 0.00000000e+00, 1.54093581e+03], [ 0.00000000e+00, 3.26746422e+03, 1.91792736e+03], [ 0.00000000e+00, 0.00000000e+00, 1.00000000e+00]])
и dist_coeffsarray([[ 0.16860882, -1.25881837, -0.01130431, -0.01046869, 2.09480747]])
искажает мои изображения. Рассчитали эти значения, используя 46 изображений шахматной доски под разными углами и перспективами. - Использование warpPerspective с H1 и H2 для соответствующих изображений немного сдвигает изображение. Посмотрите здесь обрезанные изображения (рис. 1).
Вопросы:
- Я получил
total error: 0.457120388
(я думаю, неплохо) для калибровки камеры, следуя инструкциям здесь: >https://docs.opencv.org/3.1.0/dc/dbb/tutorial_py_dication.html Это хорошая ошибка? - Является ли стрижка на моих изображениях такой, какой она должна быть на самом деле? Я думаю, что это дополнительное смещение возникает из-за сопоставления функций с использованием оптического потока, и, возможно, есть пара функций, которые на самом деле не совпадают. Каковы хорошие способы их фильтрации еще больше, чтобы быть более точным? Я слышал, что также могу использовать алгоритм Чжана для исправления этого сдвига, но не уверен, как бы я его применил. Это должно работать и для других изображений, а это означает, что я хочу иметь более надежный подход не только к этим двум изображениям, если это возможно.
Извините, если было не так точно, пожалуйста, дайте мне знать, если вам нужна дополнительная информация. Я также некоторое время искал ответы, поэтому я задаю этот вопрос только потому, что мне пока некуда обратиться.
Любая помощь очень ценится заранее. Спасибо вам, ребята!