cv2를 통한 이미지의 이동은 행렬식으로 표현이 된다.
아주 기본적인 원리만 설명하겠다.
이는 translation matrix이다. tx와 ty의 값을 이용하여 이동을 한다.
행렬곱을 모르는 사람을 위해 그냥 결과만 끄적여본다면
x' = (1*x)+0*y+t_x*1 = t_x+x이다. 기본적으로 알 것이라 생각한다.
코드를 통해 이미지 이동을 알아보겠다.
img = cv2.imread('img/input.jpg')
num_rows,num_cols = img.shape[:2]
translation_matrix = np.float32([[1,0,70],[0,1,110]])
img_translation = cv2.warpAffine(img,translation_matrix,(num_cols,num_rows),cv2.INTER_LINEAR) # 열,행 순서로
# 열(열이 있는 방향은 가로)
# 행(행이 있는 방향은 세로)
# warpAffine : 영상에 적용하기 위한 함수(이동 matrix를)
cv2.imshow('Trans',img_translation)
cv2.waitKey()
cv2.destroyAllWindows()
translation_matrix에서 알 수 있듯이 tx = 70, ty = 110 이다. 헷갈릴 수 있는 것이 왜 ty가 아래쪽으로 움직이는 가에 대한 것이다.
위는 세미나 발표 자료인데 이를 직관적으로 설명한 것이다. 사진의 맨 왼쪽 위의 좌표는 (0,0)이고 이를 기준으로 x로 70만큼 y로 110 만큼 모서리가 이동한 것이다.
- 이미지의 회전
img = cv2.imread('img/input.jpg')
num_rows,num_cols = img.shape[:2]
rotation_matrix = cv2.getRotationMatrix2D((num_cols/2,num_rows/2),30,0.7) # 가운데를 중심점으로 30도 돌리고 스케일 요소 0.7
img_rotation = cv2.warpAffine(img,rotation_matrix,(num_cols,num_rows))
plt.imshow(cv2.cvtColor(img_rotation,cv2.COLOR_BGR2RGB))
plt.show()
이미지의 행과 열의 길이를 저장한 다음에 getRotationMatrix2D로 가운데를 중심점(col/2,row/2)으로 30도를 돌리는 것이다. scale은 회전하는 이미지의 크기를 배수 만큼 보이게 한다. scale = 0.7 이므로 원래 크기의 0.7배의 크기이다.
- 이미지의 이동 + 회전
지금까지 소개한 함수를 이용하여 이동과 회전을 동시에 적용해보자.
img = cv2.imread('img/input.jpg')
num_rows,num_cols = img.shape[:2]
translation_matrix = np.float32([[1,0,int(0.5*num_cols)],[0,1,(0.5*num_rows)]]) # 이동 matrix
rotation_matrix = cv2.getRotationMatrix2D((num_cols/2,num_rows/2),30,1) # 회전 matrix
img_translation = cv2.warpAffine(img,translation_matrix,(2*num_cols,2*num_rows)) # 이동 적용
img_rotation = cv2.warpAffine(img_translation,rotation_matrix,(2*num_cols,2*num_rows)) # 이동한 사진 회전
plt.imshow(cv2.cvtColor(img_rotation,cv2.COLOR_BGR2RGB))
plt.show()
translation_matrix : 이미지의 가운데로 중심점 이동
rotation_matrix : 가운데 중심점에서 30도 이동
img_translation : 이동 적용
img_rotation : 이동 적용한 이미지에 rotation 적용
Full-code = github.com/winston1214/OpenCV/tree/master/prac_opencv
-> 스타 한번씩 부탁드립니다.
'OpenCV' 카테고리의 다른 글
OpenCV - 어파인 변환 및 투상 변환 (0) | 2020.10.10 |
---|---|
OpenCV - 이미지 사이즈 변환 및 보간법 (0) | 2020.10.10 |
cv2.imshow를 matplotlib로 구현 (0) | 2020.09.03 |
OpenCV - 색 변경 (0) | 2020.09.03 |
OpenCV - 이미지 불러오기,저장하기 (0) | 2020.09.03 |
댓글