読者です 読者をやめる 読者になる 読者になる

Qstairs

起業に向けた活動、およびAndroid・画像認識(人工知能、Deep Learning等)の技術を紹介します

広告

【画像認識】Pythonで画像認識とか(テンプレートマッチング:正規化相互相関)

IT OpenCV 画像認識 python

f:id:qstairs:20161220213708j:plain

はじめに

最近はDeep Learningを使った画像認識ばかりでしたので、
画像認識の初歩に立ち返ってテンプレートマッチング処理をpythonOpenCVで実装しました。
楽しみながらやりたかったので、
今回テンプレートマッチには麻雀牌を選びました。
また、いくつかあるテンプレートマッチングの中で正規化相互相関を使っています。
この正規化相互相関は画像の全体的な輝度変化に頑健なアルゴリズムです。

※各牌の画像は天鳳さんでお借りしてます。
 オンライン対戦麻雀 天鳳 / 牌画

テンプレート画像一覧

f:id:qstairs:20161220212547p:plain

ターゲット画像

f:id:qstairs:20161220212609p:plain

出力結果

同じ画像に対してマッチング処理しているので当然スコアは1.0ですね。

f:id:qstairs:20161220212627j:plain

ソースコード

各テンプレート画像に対してターゲット画像とテンプレートマッチングを行っています。
ちょっと無駄が多いですが、一番簡単に実装するならこの方法かと...
今後いろいろ改良を加えていきたいと思います。

# -*- coding:utf-8 -*-
import os
import os.path
import cv2
import argparse

# 引数指定
parser = argparse.ArgumentParser(description='Train Sample')
parser.add_argument('--target', '-t', default='', type=str, help='Target Image')
parser.add_argument('--template', '-temp', default='unit', type=str, help='Template Folder')
parser.add_argument('--out', '-o', type=str, default='out', help='Output File')
args = parser.parse_args()

template_list = os.listdir(args.template)
template_images = []

# テンプレート一覧画像取得
for template_name in template_list:
    image = cv2.imread(args.template+"/"+template_name)
    template_images.append(image)

# マッチング対象
target_image = cv2.imread(args.target)
# 出力用
target_out_image = cv2.imread(args.target)

# 各テンプレート画像でマッチング
for template_image in template_images:

    # TM_CCOEFF_NORMED ゼロ正規化相互相関
    res = cv2.matchTemplate(target_image, template_image, cv2.TM_CCOEFF_NORMED)

    # 一番小さいスコアとその座標、一番高いスコアとその座標を取得する
    min_val, max_val, min_loc, max_loc = cv2.minMaxLoc(res)
    top_left = max_loc
    print max_val

    if max_val > 0.9:
        h, w = template_image.shape[:2]
        bottom_right = (top_left[0] + w, top_left[1] + h)

        # cv2.rectangle(out, pt1, pt2, color, thickness)
        cv2.rectangle(target_out_image, top_left, bottom_right, 255, 2)

        # image[y,x] = roi
        target_out_image[top_left[1]-h:top_left[1], top_left[0]:top_left[0]+w,:] = template_image

        # スコアを出力
        cv2.putText(target_out_image, "%0.2lf"%max_val, (top_left[0],top_left[1]-h), cv2.FONT_HERSHEY_PLAIN, 1, (0,0,255), thickness=2)

        cv2.imshow("out", target_out_image)
        cv2.imshow("template", template_image)
        cv2.waitKey(100)

# 出力
cv2.imwrite(args.out, target_out_image)
広告