[파이썬] opencv-python 이미지의 특징점 기반 정합

이미지 정합은 동일한 장면을 다른 시점에서 촬영한 이미지를 겹쳐 놓는 작업입니다. 정합된 이미지는 장면의 변화를 추적하고, 이미지 간의 비교와 분석에 유용합니다. OpenCV-Python은 특징점 기반의 이미지 정합을 위한 강력한 도구를 제공합니다.

특징점 검출과 기술자 추출

특징점은 이미지에서 주요한 지점을 나타내는 것으로, 이미지 사이에 공통된 특징점을 찾아내는 것이 중요합니다. OpenCV-Python의 cv2 모듈은 다양한 알고리즘을 제공하여 특징점을 검출하고 기술자를 추출할 수 있습니다. 일반적으로 SIFT, SURF, ORB 등의 알고리즘이 사용됩니다.

이미지에서 특징점을 검출하는 코드는 다음과 같습니다:

import cv2

# 이미지 불러오기
img1 = cv2.imread('image1.jpg')
img2 = cv2.imread('image2.jpg')

# SIFT 검출기 생성
sift = cv2.xfeatures2d.SIFT_create()

# 특징점 검출과 기술자 추출
kp1, des1 = sift.detectAndCompute(img1, None)
kp2, des2 = sift.detectAndCompute(img2, None)

특징점 매칭과 정합

특징점을 검출하고 기술자를 추출한 다음에는, 이미지 간의 특징점을 매칭하여 이미지 정합을 수행할 수 있습니다. OpenCV-Python의 cv2 모듈은 다양한 알고리즘을 제공하여 매칭을 수행할 수 있습니다. 대표적인 알고리즘으로는 BFMatcher, FlannBasedMatcher 등이 있습니다.

특징점 매칭과 이미지 정합을 수행하는 코드는 다음과 같습니다:

import cv2

# 이미지 불러오기
img1 = cv2.imread('image1.jpg')
img2 = cv2.imread('image2.jpg')

# SIFT 검출기 생성
sift = cv2.xfeatures2d.SIFT_create()

# 특징점 검출과 기술자 추출
kp1, des1 = sift.detectAndCompute(img1, None)
kp2, des2 = sift.detectAndCompute(img2, None)

# 특징점 매칭
matcher = cv2.BFMatcher()
matches = matcher.knnMatch(des1, des2, k=2)

# 좋은 매칭점 선별
good_matches = []
for m, n in matches:
    if m.distance < 0.75 * n.distance:
        good_matches.append(m)

# 매칭점 기반 정합
if len(good_matches) > 10:
    src_pts = np.float32([kp1[m.queryIdx].pt for m in good_matches]).reshape(-1, 1, 2)
    dst_pts = np.float32([kp2[m.trainIdx].pt for m in good_matches]).reshape(-1, 1, 2)
    M, mask = cv2.findHomography(src_pts, dst_pts, cv2.RANSAC, 5.0)
    aligned_img = cv2.warpPerspective(img2, M, (img1.shape[1], img1.shape[0]))
else:
    aligned_img = None

정합된 이미지는 aligned_img 변수에 저장되며, cv2.warpPerspective() 함수를 사용하여 이미지를 정합합니다.

이미지의 특징점 기반 정합은 영상처리, 컴퓨터 비전, 로봇학 등 다양한 분야에서 활용되는 중요한 기술입니다. OpenCV-Python을 사용하면 효과적으로 이미지 정합 작업을 수행할 수 있습니다. 자세한 정보는 OpenCV 공식 문서를 참조하세요.

Happy coding!