전체 코드 (및 사용 된 이미지)가 100 % 재현 가능하도록하려면 아래 코드를 사용하십시오. 오버레이 된 윤곽선이 이미지 + 윤곽선 회전 후 정렬되지 않음 OpenCV에서 warpAffine 함께
다음은 코드의 단계입니다.
이미지에 윤곽선 (
[[386, 330], [398, 320], [382, 300], [370, 310], [386, 330]]
)을 겹쳐 씁니다. 괜찮습니다.- 정확히 동일한 크기와 동일한 회전 기능의 더미 화상
warpAffine
회전 형상의 각 점을 이용 세타 (= 90)에 의해 이미지를 회전.
회전 된 점의 좌표를 찾으십시오.
회전 된 이미지에 회전 된 점을 슈퍼 임 포즈합니다.
어떤 이유가있을 수 있습니까?
#! /usr/bin/env python
import numpy as np
import cv2
from shapely.geometry.polygon import LinearRing
theta = 90
image_path = 'image.tiff'
orig_image = cv2.imread(image_path)
wnd_str = 'unrotated'
cv2.namedWindow(wnd_str,cv2.WINDOW_NORMAL)
cv2.moveWindow(wnd_str, 0, 0)
rows,cols, channels = orig_image.shape
print 'Loaded image shape {}'.format(orig_image.shape)
blank_image = np.zeros((rows, cols, 3), np.uint8)
print 'Blank image shape {}'.format(blank_image.shape)
M = cv2.getRotationMatrix2D((rows/2, cols/2), theta, 1.0)
rot_image = cv2.warpAffine(orig_image, M, (rows, cols), flags=cv2.INTER_CUBIC+cv2.BORDER_CONSTANT)
print 'Rotated image shape {}'.format(rot_image.shape)
white = (255, 255, 255)
#contours overlayed on unrotated image
pts = [[386, 330], [398, 320], [382, 300], [370, 310], [386, 330]]
poly_pts = []
for p in pts: poly_pts.append(p)
poly_pts = np.array(poly_pts[0:-1], np.int32)
poly_pts = poly_pts.reshape((-1,1,2))
cv2.polylines(orig_image, [poly_pts], True, white, 1)
cv2.imshow(wnd_str, orig_image)
cv2.waitKey(0)
#generate contours for the rotated image
rot_poly_pts = []
for p in pts:
x, y = p
blank_image = np.zeros((rows, cols, 3), np.uint8)
blank_image[x,y] = (255, 255, 255)
blank_image_affine = cv2.warpAffine(blank_image, M, (rows, cols), flags=cv2.INTER_CUBIC+cv2.BORDER_CONSTANT)
rotated_y, rotated_x, rotated_z = np.unravel_index(blank_image_affine.argmax(), blank_image_affine.shape)
rot_poly_pts.append([rotated_x, rotated_y])
rot_poly_pts = np.array(rot_poly_pts[0:-1], np.int32)
rot_poly_pts = rot_poly_pts.reshape((-1,1,2))
cv2.polylines(rot_image, [rot_poly_pts], True, white, 1)
wnd_str = 'rotated {}'.format(theta)
cv2.namedWindow(wnd_str,cv2.WINDOW_NORMAL)
cv2.moveWindow(wnd_str, 0, 0)
cv2.imshow(wnd_str, rot_image)
cv2.waitKey(0)
cv2.destroyAllWindows()
[1]: https://i.stack.imgur.com/pyxmq.png