Python/파이썬 OpenCV 공부

[파이썬 OpenCV] 어파인 변환과 투시 변환 - cv2.getAffineTransform, cv2.getPerspectiveTransform, cv2.warpPerspectivee

AI 꿈나무 2020. 10. 7. 19:33
반응형

황선규 박사님의 <OpenCV 4로 배우는 컴퓨터 비전과 머신 러닝>, 패스트 캠퍼스 OpenCV 강의를 공부한 내용을 정리해 보았습니다.

 


어파인 변환과 투시 변환

1. 어파인 변환 - Affine Transform

 어파인 변환은 영상의 이동, 전단, 확대, 회전을 조합할 때 직사각형이 평행사변형으로 변화하게 됩니다.

 이것을 통들어서 어파인 변환이라고 합니다.

 

 

 어파인 변환을 표현하는 방법은 2 X 3 행렬의 실수형에 회전, 크기, 이동 정보가 들어가 있습니다.

 

 

 어파인 변환은 미지수가 6개이기 때문에 6개의 식이 필요하며 점 3개가 어디로 이동했는지 알면 행렬로 표시할 수 있습니다.

 

 

 점 세개의 이동정보를 알면 어파인 행렬로 표시가 가능하며 세개의 이동정보로 마지막 점의 위치를 유추할 수 있습니다.

 

2. 투시 변환 - Perspective transform

 어파인 변환보다 자유도가 높은 것이 투시변환입니다.

 

 직사각형보다 자유도가 높은 사다리꼴, 임의의 사각형으로 표현할 수 있습니다.

 

 

 투시변환을 표현하는 행렬은 3X3 행렬이며, 이 중 하나는 비례상수 역할을 하기 때문에 실제 미지수는 8개가 됩니다.

 

 

 투시 변환은 8개 미지수를 계산하기 위해 식 8개가 필요하며 점 4개가 어떻게 이동했는지 알고 있어야 합니다.

 

 

 즉, 점 4개의 이동관계를 알면 펄스펙티브 행렬을 구할 수 있습니다.

 

3. 어파인 변환 행렬 구하기 - cv2.getAffineTransform

 OpenCV에서 점 3개의 이동 전, 이동 후 좌표를 입력하면 어파인 변환 행렬을 반환하는 함수를 제공합니다.

 

cv2.getAffineTransform(src, dst) -> retval

• src: 3개의 원본 좌표점. numpy.ndarray. shape=(3, 2) e.g) np.array([[x1 , y1 ], [x2 , y2 ], [x3 , y3 ]], np.float32)
• dst: 3개의 결과 좌표점. numpy.ndarray. shape=(3, 2)
• dst: 3개의 결과 좌표점. numpy.ndarray. shape=(3, 2)

 

 주의할 점은 넘파이 행렬로 입력해줘야 합니다.

 3 X 2 행렬을 반환합니다.

 

4. 어파인 변환 함수 - cv2.warpAffine

 어파인 행렬을 입력으로 받느 어파인 변환 함수는 여기에서 자세히 확인할 수 있습니다.

 

 

[파이썬 OpenCV] 영상의 기하학적 변환 - 전단 변환 - cv2.warpAffine

황선규 박사님의 , 패스트 캠퍼스 OpenCV 강의를 공부한 내용을 정리해 보았습니다. [파이썬 OpenCV] 영상의 기하학적 변환 - 이동 변환 - cv2.warpAffine 황선규 박사님의 , 패스트 캠퍼스 OpenCV 강의를 공

deep-learning-study.tistory.com

 

 

[파이썬 OpenCV] 영상의 기하학적 변환 - 이동 변환 - cv2.warpAffine

황선규 박사님의 , 패스트 캠퍼스 OpenCV 강의를 공부한 내용을 정리해 보았습니다. 영상의 기하학적 변환(geometric transformation)이란?  영상을 구성하는 픽셀의 배치 구조를 변경함으로써 전체 영상

deep-learning-study.tistory.com

 

5. 투시 변환 행렬 구하기 - cv2.getPerspectiveTransform

 OpenCV에서 점 4개의 이동 전, 이동 후 좌표를 입력하면 투시 변환 행렬을 반환하는 함수를 제공합니다.

 

cv2.getPerspectiveTransform(src, dst, solveMethod=None) -> retval

• src: 4개의 원본 좌표점. numpy.ndarray. shape=(4, 2) e.g) np.array([[x1 , y1 ], [x2 , y2 ], [x3 , y3 ], [x4 , y4 ]], np.float32)
• dst: 4개의 결과 좌표점. numpy.ndarray. shape=(4, 2)
• retval: 3x3 투시 변환 행렬

 

6. 영상의 투시 변환 함수 - cv2.warpPerspective

 투시 변환 함수에 투시 변환 행렬을 입력하면 투시 변환 행렬이 적용된 영항을 출력할 수 있습니다.

 

cv2.warpPerspective(src, M, dsize, dst=None, flags=None, borderMode=None, borderValue=None) -> dst

• src: 입력 영상
• M: 3x3 투시 변환 행렬. 실수형.
• dsize: 결과 영상 크기. (w, h) 튜플. (0, 0)이면 src와 같은 크기로 설정
• dst: 출력 영상
• flags: 보간법. 기본값은 cv2.INTER_LINEAR
• borderMode: 가장자리 픽셀 확장 방식. 기본값은 cv2.BORDER_CONSTANT
• borderValue: cv2.BORDER_CONSTANT일 때 사용할 상수 값. 기본값은 0.

 

7. 투시 변환의 적용

 투시 변환을 통해서 사다리꼴 모양의 객체를 직사각형으로 나타낼 수 있습니다.

 

 또한 cv2.getPerspectiveTransform 함수로 영상에 있는 객체를 얼만큼 회전하고 크기 확대하고 싶은지 정보를 넣어주면 어파인 행렬을 반환할 수 있습니다.

 

반응형