Как использовать warp_matrix (из cv2.findTransformECC) с cv2.transform - PullRequest
0 голосов
/ 31 января 2019

У меня есть форма, определяемая массивом точек [[x1, y1], [x2, y2], ..., [xn, yn]] и изображением (img1) с (почти) IМне нужно найти, где находится эта фигура. Я имею в виду, что если нарисовать эту фигуру в произвольном месте на изображении (img2), я обнаружу, что аффинное преобразование перейдет из img1 в img2.Мне удалось сделать это cv2.findTransformECC.Я получаю warp_matrix.

[img1] https://i.imgur.com/097V8YM.png [img2] https://i.imgur.com/dNUrgE8.png

Код:

def get_gradient(im) :
    # Calculate the x and y gradients using Sobel operator
    grad_x = cv2.Sobel(im,cv2.CV_32F,1,0,ksize=3)
    grad_y = cv2.Sobel(im,cv2.CV_32F,0,1,ksize=3)
    # Combine the two gradients
    grad = cv2.addWeighted(np.absolute(grad_x), 0.5, np.absolute(grad_y), 0.5, 0)
    return grad

img1=cv2.imread('img1.png',0)

points=np.array([[ 834,  429],
       [ 867,  419],
       [ 900,  409],
       [ 934,  400],
       [ 967,  391],
       [1001,  382],
       [1035,  375],
       [1069,  369],
       [1102,  364],
       [1136,  361],
       [1170,  361],
       [1204,  362],
       [1238,  365],
       [1272,  370],
       [1306,  376],
       [1340,  385]])

img2=np.zeros_like(img1)
cv2.polylines(img2,[points],False,255,4)
warp_mode = cv2.MOTION_AFFINE
warp_matrix = np.eye(2, 3, dtype=np.float32)
criteria = (cv2.TERM_CRITERIA_EPS | cv2.TERM_CRITERIA_COUNT, 3000,  1e-5)

(cc, warp_matrix) = cv2.findTransformECC (get_gradient(img1), get_gradient(img2),warp_matrix, warp_mode, criteria)
img3 = cv2.warpAffine(img2, warp_matrix, (img1.shape[1],img1.shape[0]), flags=cv2.INTER_LINEAR + cv2.WARP_INVERSE_MAP)

Результат: [img3] https://i.imgur.com/zCXJoyJ.png

Затем я хочу нарисовать фигуру в правильном положении. Я пытался использовать cv2.transform, но я странно работаю, как если бы угол поворота использовался с плохим знаком.

Следующий код был моей проблемой, смотрите результат в img4:

warp_points=cv2.transform(np.reshape(points,(points.shape[0],1,2)),warp_matrix)

img4=img1.copy()
cv2.polylines(img4,[warp_points],False,100,4) #100 : gray 

[img4] https://i.imgur.com/JvUHBVK.png

Заранее спасибо, (и извините за любыеанглийские ошибки, это не мой родной язык)

1 Ответ

0 голосов
/ 13 марта 2019

Попробуйте поменять порядок изображений в функции cv2.findTransformECC, которую вы использовали при преобразовании изображений, и используйте новую матрицу деформации для преобразования ваших точек.Также попробуйте изменить значения, связанные с атрибутом «criterits» в cv2.findTransformECC, после просмотра документации opencv.Я уверен, что это поможет, поскольку я сталкивался с подобной проблемой в прошлом.

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