Python/OpenCV

뒤틀기

ddingz 2023. 5. 5. 19:00

어핀 변환

어핀 변환(affine transform)은 사실 이동, 확대/축소, 회전을 포함하는 변환으로 직선, 길이의 비율, 평행성을 보존하는 변환을 말한다. (어핀 변환 링크)
어핀 변환의 이런 성질 때문에 변환 전과 후의 3개의 점을 짝 지어 매핑할 수 있다면 변환행렬을 거꾸로 계산할 수 있는데, OpenCV는 cv2.getAffineTransform() 함수로 이 기능을 제공한다.

  • matrix = cv2.getAffineTransform(pts1, pts2)
    • pts1 : 변환 전 영상의 좌표 3개, 3 × 2 NumPy 배열(float32)
    • pts2 : 변환 후 영상의 좌표 3개, pts1과 동일
    • matrix : 변환행렬 반환, 2 × 3 행렬

원근 변환

OpenCV는 변환 전과 후를 짝짓는 4개의 매핑 좌표만 지정해 주면 원근 변환에 필요한 3 × 3 변환행렬을 계산해 주는 cv2.getPerspectiveTransform() 함수를 제공한다.

  • mtrx = cv2.getPerspectiveTransform(pts1, pts2)
    • pts1 : 변환 이전 영상의 좌표 4개, 4 × 2 NumPy 배열(float32)
    • pts2 : 변환 이전 영상의 좌표 4개, pts1과 동일
    • mtrx : 변환행렬 반환, 3 × 3 행렬

또한, OpenCV는 원근 변환을 수행하는 함수로 지금까지 사용해 온 cv2.warpAffine() 함수가 아닌 별도의 함수 cv2.warpPerspective() 함수를 제공한다.

  • dst = cv2.warpPerspective(src, mtrx, dsize [, dst, flags, borderMode, borderValue])
    • src : 원본 영상, NumPy 배열
    • mtrx : 2×3 변환행렬, NumPy 배열, dtype = float32
    • dsize : 결과 이미지 크기, tuple(width, height)
    • flags : 보간법 알고리즘 선택 플래그
      • cv2.INTER_LINEAR : 기본 값, 인접한 4개 픽셀 값에 거리 가중치 사용
      • cv2.INTER_NEAREST : 가장 가까운 픽셀 값 사용
      • cv2.INTER_AREA : 픽셀 영역 관계를 이용한 재샘플링
      • cv2.INTER_CUBIC : 인접한 16개 픽셀 값에 거리 가중치 사용
      • cv2.INTER_LANCZOS4 : 인접한 8개 픽셀을 이용한 란초의 알고리즘$^1$
    • borderMode : 외곽 영역 보정 플래그
      • cv2.BORDER_CONSTANT : 고정 색상 값(999|12345|999)
      • cv2.BORDER_REPLICATE : 가장 자리 복제(111|12345|555)
      • cv2.BORDER_WARP : 반복(345|12345|123)
      • cv2.BORDER_REFLECT : 반사(321|12345|543)
    • borderValue : cv2.BORDER_CONSTANT의 경우 사용할 색상 값(기본 값 = 0)
    • dst : 결과 이미지, NumPy 배열