備忘録

弱小院生のメモ

スコアヘッダ認識2

認識失敗時に回転させる処理を追加したら割とうまくいった。

import os
import dlib
import cv2
from scipy import ndimage

IMG_DIR = './experiment_img/'
cv2.namedWindow("img", cv2.WINDOW_NORMAL)

detector = dlib.simple_object_detector("detector.svm")
files = os.listdir(IMG_DIR)

for file in files:
    ftitle, fext = os.path.splitext(file)
    if fext != '.jpg':
        continue

    # Load image
    abspath = os.path.abspath(IMG_DIR + file)
    print(abspath)
    img = cv2.imread(abspath)
    if img is None:
        print('Failed to read image')
        break

    dets = detector(img)
    if len(dets) != 0 :
        for d in dets:
            cv2.rectangle(img, (d.left(), d.top()), (d.right(), d.bottom()), (0, 0, 255), 2)
        # Show image
        cv2.imshow("img",img)
        cv2.waitKey(0)
        continue

    # Failed to Detecting -> rotate
    rIntr = 15
    rStart = -30
    rEnd = 30
    for r in range(rStart, rEnd+1, rIntr):
        rotate_img = ndimage.rotate(img, r)
        dets = detector(rotate_img)
        if len(dets) != 0 :
            for d in dets:
                cv2.rectangle(rotate_img, (d.left(), d.top()), (d.right(), d.bottom()), (0, 0, 255), 2)
            # Show image
            cv2.imshow("img",rotate_img)
            cv2.waitKey(0)
            break

cv2.destroyAllWindows()

結果

f:id:reverent_f:20170102234301p:plain

前回失敗していた斜めのスライドも検出成功

問題点

認識すべき場所が見当たらないときに端の真っ暗な部分を誤認識してしまうことがあった (特に180度回転時?)

→ 正立で検出

→ -30° 〜 +30°で検出を行うように変更したら割と上手くいった

 (逆立ちしてリザルトを撮る人がいなければ大丈夫)

次回以降やること

  • その他のヘッダ部分用の検出器をチマチマ作成
  • スコア部分の切り出し・OCR
  • 鬼門の曲認識 ( タイトルOCRは辛そう ジャケット部分を切り出して特徴量で認識か…? )

その他

ネストが深くなるとpythonのブロック構造が分かりづらい。

何か上手い記法があったりしないか調べる