У меня есть форма, определяемая массивом точек [[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
Заранее спасибо, (и извините за любыеанглийские ошибки, это не мой родной язык)