end0tknr's kipple - 新web写経開発

http://d.hatena.ne.jp/end0tknr/ から移転しました

opencv.matchTemplate() によるテンプレート物体認識

テンプレートマッチングは、様々なurlで紹介されていますが、 私の場合、次のurlを参考にさせて頂きました。

Pythonでテンプレートマッチング、OpenCVサンプルコードと解説 : ネットサーフィンの壺

詳細は以下で、w1800の引違い窓の画像をテンプレートとし、同様の開口を検出しています。

で、 お手軽なものの、拡大縮小や回転には弱そう という印象。

#!/usr/local/bin/python
# -*- coding: utf-8 -*-
from PIL import Image
import cv2
from datetime import datetime
import matplotlib
matplotlib.use('Agg')
import matplotlib.pylab as plb
import numpy as np
import sys

def main():
    org_file  = sys.argv[1]
    tmpl_file = sys.argv[2]

    org_img  = cv2.imread(org_file)
    # グレースケール化
    org_gray_tmp = cv2.cvtColor(org_img, cv2.COLOR_BGR2GRAY)

    tmpl_img = cv2.imread(tmpl_file,0)
    w, h = tmpl_img.shape[::-1]
    
    res = cv2.matchTemplate(org_gray_tmp,
                            tmpl_img,
                            cv2.TM_CCOEFF_NORMED)
    # 類似度の閾値以上のものを、描画
    threshold = 0.8  #類似度の閾値
    loc = np.where( res >= threshold)
    for pt in zip(*loc[::-1]):
        cv2.rectangle(org_img, pt, (pt[0] + w, pt[1] + h), (0,0,255), 2)

    time_str = datetime.now().strftime("%Y%m%d_%H%M%S")
    new_file = 'new_' + time_str + '.png'
    cv2.imwrite(new_file, org_img)

    
if __name__ == '__main__':
    main()

↑こう書くと↓こう表示されます。 閾値(threshold)を変え、複数回、行っています。

f:id:end0tknr:20171103163626p:plain:w300  テンプレート(窓)→f:id:end0tknr:20171105200430p:plain

f:id:end0tknr:20171105200328p:plain:w270 f:id:end0tknr:20171105200331p:plain:w270