[파이썬] opencv-python 이미지에서 특징점 매칭

이미지 처리와 컴퓨터 비전을 위한 라이브러리인 OpenCV는 Python에서도 사용할 수 있습니다. OpenCV를 사용하면 이미지에서 특징점을 감지하고 매칭하는 작업을 간편하게 수행할 수 있습니다. 이번 블로그 포스트에서는 OpenCV-Python을 사용하여 이미지에서 특징점을 매칭하는 방법에 대해 알아보겠습니다.

1. OpenCV-Python 설치하기

OpenCV-Python을 사용하기 위해서는 우선 OpenCV와 Python 환경을 설정해야 합니다. 다음 명령어를 사용하여 OpenCV-Python을 설치할 수 있습니다.

pip install opencv-python

2. 이미지에서 특징점 추출하기

특징점 매칭을 수행하려면 먼저 이미지에서 특징점을 추출해야 합니다. 이를 위해 cv2 모듈의 SIFT 또는 ORB 메서드를 사용할 수 있습니다.

import cv2

# 이미지 로드
img1 = cv2.imread("image1.jpg")
img2 = cv2.imread("image2.jpg")

# SIFT로 특징점 추출
sift = cv2.SIFT_create()
kp1, desc1 = sift.detectAndCompute(img1, None)
kp2, desc2 = sift.detectAndCompute(img2, None)

위 코드에서는 image1.jpgimage2.jpg 파일에서 이미지를 로드하고, SIFT(Scale-Invariant Feature Transform) 알고리즘을 사용하여 특징점을 추출합니다. kp1kp2는 각각 이미지 1과 이미지 2에서 추출된 특징점의 위치 정보를 담은 KeyPoint 객체의 리스트입니다. desc1desc2는 각각 이미지 1과 이미지 2에서 추출된 특징점의 디스크립터를 담은 배열입니다.

3. 특징점 매칭하기

특징점을 추출한 후에는 매칭을 수행할 수 있습니다. cv2 모듈의 FlannBasedMatcher 또는 BFMatcher를 사용하여 특징점을 매칭할 수 있습니다.

import cv2

# BFMatcher로 특징점 매칭
bf = cv2.BFMatcher(cv2.NORM_L2)  # or cv2.FlannBasedMatcher()
matches = bf.match(desc1, desc2)

# 거리에 따라 매칭된 특징점 정렬
matches = sorted(matches, key=lambda x: x.distance)

# 상위 N개의 매칭된 특징점 선택
N = 20
top_matches = matches[:N]

위 코드에서는 BFMatcher를 사용하여 특징점을 매칭하고, 거리에 따라 매칭된 특징점을 정렬합니다. matches는 모든 매칭된 특징점의 리스트입니다. top_matches는 상위 N개의 매칭된 특징점을 담은 리스트입니다.

4. 결과 시각화하기

매칭 결과를 시각화하여 확인할 수 있습니다. cv2 모듈의 drawMatches 메서드를 사용하면 이미지에 매칭된 특징점을 그릴 수 있습니다.

import cv2
import matplotlib.pyplot as plt

# 매칭 결과 시각화
img_match = cv2.drawMatches(img1, kp1, img2, kp2, top_matches, None, flags=cv2.DrawMatchesFlags_NOT_DRAW_SINGLE_POINTS)
plt.imshow(cv2.cvtColor(img_match, cv2.COLOR_BGR2RGB))
plt.axis("off")
plt.show()

위 코드에서는 drawMatches 메서드를 사용하여 매칭 결과를 시각화하고, matplotlib.pyplot 모듈을 사용하여 이미지를 표시합니다.

이제 이미지에서 특징점을 매칭하는 방법을 알게 되었습니다. OpenCV-Python을 사용하여 다른 이미지 처리 작업도 간편하게 수행할 수 있습니다. OpenCV의 다양한 기능과 메서드를 활용하여 이미지 처리에 대한 창의적인 프로젝트를 만들어보세요!