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)
M = 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
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,131, 480,159, 493,630, 64,601 ],dtype=float)
point_src = point_src.reshape(4,2)
# 두번째 이미지.
img_dst = cv2.imread('data/images/book1.jpg')
point_dst = np.array( [ 318,256, 534,372, 316,670, 73,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점) 좌표는 각 책의 네개의 모서리로 설정하였다.
그 모서리를 가지고 이미지를 변환 시킨 것이다.
'IT 프로그래밍 관련 > OpenCV' 카테고리의 다른 글
OpenCV HSV 변경 (0) | 2021.05.25 |
---|---|
OpenCV Persperctive 2 (마우스로 좌표 찍기) (0) | 2021.04.26 |
OpenCV 이미지 Transformations ( rotation, translation ) (0) | 2021.04.22 |
OpenCV threshold, 이미지형태 변환(dilate,erode, opening, closing) (0) | 2021.04.22 |
OpenCV 비디오파일 열기, 내 캠으로 비디오파일 저장 (0) | 2021.04.21 |
댓글