2020년 9월 20일 일요일

책장 사진 분류

 

전체 책장에서 사진에 찍힌 책장의 한 부분이 어디에 위치하는지 찾는 프로그램입니다. 책장에 있는 책들을 자동 정리하는 프로젝트의 일환입니다.  아래 전체 책장 사진에서



아래 부분 사진이 어디에 위치하는지를 찾습니다.




여기에 사용한 알고리즘은 feature matching에 사용되는 Brute-Force Matcher입니다. Opencv 프로그램으로 간단하게 만들 수 있습니다.


import numpy as np
import cv2
from matplotlib import pyplot as plt

img1 = cv2.imread('s.jpg',0)
img2 = cv2.imread('t.jpg',0)

sift = cv2.xfeatures2d.SIFT_create()
kp1, des1 = sift.detectAndCompute(img1,None)
kp2, des2 = sift.detectAndCompute(img2,None)
bf = cv2.BFMatcher()
matches = bf.knnMatch(des1,des2,k=2)
good = []
for m,n in matches:
    if m.distance < 0.3*n.distance:
        good.append([m])

for g in good:
    print(kp1[g[0].queryIdx].pt, kp2[g[0].trainIdx].pt)
draw_params = dict(matchColor = (0,255,0), singlePointColor = (255, 0, 0), flags = 2)
img3 = cv2.drawMatchesKnn(img1,kp1,img2,kp2,good,None,**draw_params)
plt.imshow(img3),plt.show()

인터넷 검색으로 위 프로그램을 쉽게 볼 수 있습니다.  t.jpg 파일 안에서 s.jpg 특징을 찾는데 결과는 이렇게 나옵니다.

책장에서 21개의 사진을 찍어 실행해보았는데 6개는 전혀 찾지 못했고 나머지는 특징 1개에서 9개까지 찾습니다. 아래는 이를 정리한 사진인데

 


오른쪽 하단의 숫자가 찾은 feature(특징)의 수를 뜻합니다.  너무 규칙을 엄격하게 적용한 탓인지 틀린 feature는 없고 못 찾는 부분 사진은 적지 않습니다. 프로그램의 패러미터를 조정해서 다시 해봐야겠습니다.

댓글 없음:

댓글 쓰기