반응형


warpAffine 함수를 사용하여 아핀 변환(Affine Transformation)을 구현합니다.



아핀 변환에서 원본 이미지의 모든 평행선은 출력 이미지에서 여전히 평행합니다.

아핀 변환 행렬을 찾으려면 입력 이미지의 3점과 대응하는 출력 이미지의 3점이 필요합니다.


getAffineTransform 함수를 사용하면 대응하는 3점 쌍에 대한  변환 행렬을 구할 수 있습니다.

warpAffine함수를 사용하여 변환을 실행합니다.




마지막 업데이트 - 2018. 10. 5




다음 OpenCV Python 튜토리얼을 참고하여 강좌를 비정기적로 포스팅하고 있습니다.


https://docs.opencv.org/3.4.3/d6/d00/tutorial_py_root.html




왼쪽 위, 오른쪽 위, 왼쪽 아래 순으로 마우스로 클릭합니다.




클릭한 위치에 빨간점이 표시됩니다.




스페이스바를 클릭하면  오른쪽 위 점이 아래로 밀린 이미지가 보입니다.




다시 스페이스바를 클릭하면 왼쪽아래 점이 오른쪽으로 밀린 이미지가 보입니다.




다시 스페이스바를 누르면 오른쪽 위점이 아래로,  왼쪽 아래점이 오른쪽으로 이동한 이미지가 보입니다.




테스트에 사용한 원본 이미지와 전체 코드입니다.





import numpy as np
import cv2


point_list = []
count = 0

def mouse_callback(event, x, y, flags, param):
    global point_list, count, img_original


    # 마우스 왼쪽 버튼 누를 때마다 좌표를 리스트에 저장
    if event == cv2.EVENT_LBUTTONDOWN:
        print("(%d, %d)" % (x, y))
        point_list.append((x, y))

        print(point_list)
        cv2.circle(img_original, (x, y), 3, (0, 0, 255), -1)



cv2.namedWindow('original')
cv2.setMouseCallback('original', mouse_callback)

# 원본 이미지
img_original = cv2.imread('test.png')


while(True):

    cv2.imshow("original", img_original)


    height, width= img_original.shape[:2]


    if cv2.waitKey(1)&0xFF == 32: # spacebar를 누르면 루프에서 빠져나옵니다.
        break



pts1 = np.float32([list(point_list[0]),list(point_list[1]),list(point_list[2])])
pts2 = np.float32([list(point_list[0]),list(point_list[1]),list(point_list[2])])

pts2[1][1] += 100 # 두번째 점의 Y 좌표를 아래로 이동


M = cv2.getAffineTransform(pts1,pts2)

img_result = cv2.warpAffine(img_original, M, (width,height))


cv2.imshow("result1", img_result)
cv2.waitKey(0)



pts1 = np.float32([list(point_list[0]),list(point_list[1]),list(point_list[2])])
pts2 = np.float32([list(point_list[0]),list(point_list[1]),list(point_list[2])])

pts2[2][0] += 100 # 세번째 점의 X 좌료를 오른쪽으로 이동


M = cv2.getAffineTransform(pts1,pts2)

img_result = cv2.warpAffine(img_original, M, (width,height))


cv2.imshow("result2", img_result)
cv2.waitKey(0)



pts1 = np.float32([list(point_list[0]),list(point_list[1]),list(point_list[2])])
pts2 = np.float32([list(point_list[0]),list(point_list[1]),list(point_list[2])])

pts2[1][1] += 100 # 두번째 점의 Y 좌표를 아래로 이동
pts2[2][0] += 50  # 세번째 점의 X 좌료를 오른쪽으로 이동


M = cv2.getAffineTransform(pts1,pts2)

img_result = cv2.warpAffine(img_original, M, (width,height))


cv2.imshow("result3", img_result)
cv2.waitKey(0)


cv2.destroyAllWindows()


반응형

문제 발생시 지나치지 마시고 댓글 남겨주시면 가능한 빨리 답장드립니다.


제가 쓴 책도 한번 검토해보세요 ^^

+ Recent posts