본문 바로가기
IT 프로그래밍 관련/OpenCV

OpenCV AffineTransform, homography(perspective)Transform

by 지나는행인 2021. 4. 23.
728x90

AffinTransform 은 선의 평행은 유지되면서 이미지를 변환한다.

 

이동, 확대, 반전의 변환까지 포함하며 ,  3개의 매치되는 점이 필요하다.

( 원본이미지의 3개의 점과 , 변화된 이미지의 3개의 점으로 변환 행렬을 구하고 이미지를 변환시킨다 )

 

변환행렬 구하는 예제

* 변환 행렬 구하는 이미지

각기 다른 두개의 세점좌표를 만들고 , 

cv2.getAffineTransform함수에 적용하였다.

cv2.getAffineTransform 함수는 두개의 좌표로 변환행렬을 구해준다.

 

 

AffineTransform 코드예제

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
import cv2
import numpy as np
 
## Affine Transform 예제
img = cv2.imread('data/images/sample.jpg')
# print(img)
rows, cols, ch = img.shape
 
pts1 = np.float32([[200,100],[400,100],[200,200]])
pts2 = np.float32([[200,300],[400,200],[200,400]])
 
 
# pts1의 좌표를 이미지에 표시한다.변환 후 점 확인
cv2.circle(img, (200,100), 10, (255,0,0),-1)
cv2.circle(img, (400,100), 10, (0,255,0),-1)
cv2.circle(img, (200,200), 10, (0,0,255),-1)
 
 
= cv2.getAffineTransform(pts1, pts2)
 
 
dst = cv2.warpAffine(img, M, (cols,rows))
 
 
cv2.imshow('ori', img)
cv2.imshow('dst', dst)
 
cv2.waitKey()
cv2.destroyAllWindows()
cs

* cv2.getAffineTransform( pts1, pts2 )

- pts1 : 원래 좌표

- pts2 : 변환시킨 좌표

 

* cv2.warpAffine( img, M, ( cols, rows ) )

 

- img : 변환시키려는 이미지

- M : 변환행렬 ( getAffineTransform으로 받은 행렬 )

- ( cols, rows ) : image Size

* 원본이미지 , AffineTransform 후 이미지

 

 

 

Pespective(Homography) Transform은 직선의 형질만 유지시키고, 

 

선의 평행은 유지가 되지 않는 변환이다. ( 원근법 변환 )

 

4개의 input 좌표와  , 4개의 output 좌표가 필요하다.

 

변환행렬이 필요로 하고 , 변환행렬을 구하기 위해서는 

 

cv2.getAffineTransform() 함수나

cv2.findHomography() 함수가 필요하다.

 

cv2.warpPerspective()함수를 통해서는 이미지를 변환시킨다.

 

 

다음은 첫번째 이미지를 가지고, 원근이 다른 두번째 이미지와 비슷하게끔, 

homographytransform을 이용해서  

이미지를 비슷하게 맞추는 작업이다.

 

코드예제

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
import cv2
import numpy as np
 
# 두개의 사진 가지고 같은 방향으로 맞추기
# 네개의 좌표점이 필요
 
# 첫번째 이미지.
img_src = cv2.imread('data/images/book2.jpg')
 
point_src = np.array( [ 141,131480,159493,63064,601 ],dtype=float)
 
point_src = point_src.reshape(4,2)
 
 
 
# 두번째 이미지.
 
img_dst = cv2.imread('data/images/book1.jpg')
 
point_dst = np.array( [ 318,256534,372316,67073,473 ], dtype=float )
 
point_dst = point_dst.reshape(4,2)
 
 
 
# 호모그라피에서 변환된 행렬 찾기
# h가 변환에 이용된 바로, 3 X 3 의 행렬이다.
 
h, status = cv2.findHomography(point_src, point_dst)
 
img_output = cv2.warpPerspective(img_src, h, (img_src.shape[1], img_src.shape[0]))
 
cv2.imshow('SRC', img_src)
cv2.imshow('DST', img_dst)
cv2.imshow('Warp', img_output)
 
cv2.waitKey()
cv2.destroyAllWindows()
cs

* cv2.findHomography(point_src, point_dst)

- point_src : 첫번째 이미지에서의 네개의 좌표

- point_dst : 두번째 이미지에서의 네개의 좌표

 

* cv2.warpPerspective( img , M , size )

- img : 변환시킬 이미지

- M : 변환행렬

- size : 이미지 사이즈

*첫번째 이미지 , 두번째 이미지,  첫번째 이미지를 두번째처럼 변환시킨 이미지

** 위의 변환에서 설정한 2개의(4점) 좌표는 각 책의 네개의 모서리로 설정하였다.

그 모서리를 가지고 이미지를 변환 시킨 것이다.

 

댓글