레이블이 자동인 게시물을 표시합니다. 모든 게시물 표시
레이블이 자동인 게시물을 표시합니다. 모든 게시물 표시

2020년 11월 7일 토요일

책장 속의 책 제목과 저자 자동 인식

 

작은 도서관이나 책이 많은 개인 서고의 책을 정리하는데 도움이 되는 프로그램입니다. 책장 속의 있는 책을 휴대폰으로 찍은 사진을 대상으로 프로그램을 실행하면 사진 속에 있는 책의 제목, 저자, 출판사 등을 자동으로 인식해서 출력합니다.

구글 OCR를 사용한 예제 https://blog.naver.com/yoojchul/222007575531 를 따라 하면




















....

를 얻습니다.  대상으로 한 그림은 아래에 있습니다.  출력 앞 부분에 그림 중간에 있는 내용이 나오기는 하지만 전반적으로 오른쪽부터 시작해서 아래로 갔다가 다시 왼쪽으로 옮겨 가는 순서로 한글, 영문 그리고 한자까지 인식합니다.  



광학 문자에 대한 인식률이 완벽하지는 않지만 각 책에 대한 구별이 없다는 불편함도 있습니다. 책으로 구분되는 선을 근거로 opencv를 응용해서 책을 구분합니다.



인식된 글자 사이에 붉은 선이 없다면 같은 책으로 간주하고 제목, 저자 그리고 출판사를 한 줄에 출력하여 좀 더 근사한 결과를 얻을 수 있습니다. 



















....


부족한 인식률과 책 구분은 사람의 눈과 손을 아직 필요로 합니다.  전체 프로그램은 깃허브  https://github.com/yoojchul/book-title 에 있습니다.

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는 없고 못 찾는 부분 사진은 적지 않습니다. 프로그램의 패러미터를 조정해서 다시 해봐야겠습니다.