0

전체 코드 (및 사용 된 이미지)가 100 % 재현 가능하도록하려면 아래 코드를 사용하십시오. enter image description here오버레이 된 윤곽선이 이미지 + 윤곽선 회전 후 정렬되지 않음 OpenCV에서 warpAffine 함께

다음은 코드의 단계입니다.

  1. 이미지에 윤곽선 ([[386, 330], [398, 320], [382, 300], [370, 310], [386, 330]])을 겹쳐 씁니다. 괜찮습니다.

  2. 정확히 동일한 크기와 동일한 회전 기능의 더미 화상 warpAffine

  3. 회전 형상의 각 점을 이용 세타 (= 90)에 의해 이미지를 회전.

  4. 회전 된 점의 좌표를 찾으십시오.

  5. 회전 된 이미지에 회전 된 점을 슈퍼 임 포즈합니다.

나는 라인업을 예상하지만 그들은하지을 .

어떤 이유가있을 수 있습니까?

#! /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 

여기 여기 회전 후의 화상과 중첩의 정렬 형상 enter image description here

원래 이미지이다. enter image description here

답변

1

wrapAffine은 양쪽에 잘린 픽셀이있는 이미지를 생성합니다. 이 절차의 효과적인 대안은 전치 후 뒤집기입니다. 우리는 행과 안부를 트랜스와의 손길이 닿지 않은 채널을 유지하려는 때문에

dst = cv2.flip(img.transpose(1,0,2),0) 

dst = destination image; 
img = source image; 

img.transpose(col,row,channel) = 1,0,2는,이 순서에 해당합니다.

cv2.flip = 조 변경 작업 중에 발생하는 미러링 효과에 대응합니다. 원본 이미지 (가로 또는 세로)에 따라 플래그를 0 또는 1으로 변경하십시오.