Возврат неискаженных координат пикселей, а не изображения - PullRequest
0 голосов
/ 11 июня 2019

Мне нужно не искажать пиксельные координаты изображения - и нужно вернуть исправленные координаты. Я не хочу возвращать неискаженное изображение - только исправленные координаты пикселей. Камера откалибрована, и у меня есть внутренние параметры камеры и матрица искажений. Я использую OpenCV в Python 3

Я прочитал столько теории, сколько смогу найти и вопросы здесь. Ключевая информация: https://docs.opencv.org/2.4/doc/tutorials/calib3d/camera_calibration/camera_calibration.html

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

x_ {corrected} = x (1 + k_1 r ^ 2 + k_2 r ^ 4 + k_3 r ^ 6) y_ {исправлено} = y (1 + k_1 r ^ 2 + k_2 r ^ 4 + k_3 r ^ 6)

Тангенциальный:

x_ {corrected} = x + [2p_1xy + p_2 (r ^ 2 + 2x ^ 2)] y_ {исправлено} = y + [p_1 (r ^ 2 + 2y ^ 2) + 2p_2xy]

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

Я не могу просто использовать обычную процедуру удаления искажений на изображении, так как я пытаюсь применить коррекцию искажения ИК-камеры к данным глубины с той же камеры. Если вы искажаете изображение глубины, как это - вы разделяете пиксели по координатам, и ответ не имеет смысла. Надеюсь, я на правильном пути с этим.

Код на данный момент:

import numpy as np
import cv2
imgIR = cv2.imread("/20190529-150017-305-1235-depth.png",0)
#you could try this on any image...

h,  w = imgIR.shape[:2]

X = np.array([i for i in range(0,w)]*(h))
X = X.reshape(h, w)

Y = np.array([[i]*(w) for i in range(0,h)])

fx =    483.0 #x focal length
fy =    490.2
CentreX = 361.4 #optical centre of the image - x axis
CentreY = 275.6

#Relative to the optical centre, it is possible to determine the `#coordinates of each pixel in the image` 
#then do the above operation without loops using a scalar subtraction
Xref = X - CentreX
Yref = Y - CentreY

#"scaling factor" refers to the relation between depth units and meters;
scalingFactor = 18.0/36.0 # 18pixels / 36 mm;
# I'm not sure what should be yet -- whether [pixels at the shelf]/mm
#or mm/[pixels at the shelf]

Z = imgIR / scalingFactor


#using numpy
Xcoord = np.multiply(Xref,Z/fx)
Ycoord = np.multiply(Yref,Z/fy)

#how to correct these coords for the radial and tangential distortion?
#parameters as returned for the distortion matrix using 
cv2.calibrateCamera
dstvec = array([[-0.1225, -0.0159, 0.001616, -0.0018924,-0.00120696]]) 

То, что я ищу, - это новая матрица неискаженных (радиальные и тангенциальные искажения удалены) координат X и матрица неискаженных координат Y - с каждым элементом матрицы, представляющим один из исходных пикселей.

Спасибо за вашу помощь!

...