
ジェームズ
それではプログラムを書いていきましょう。
前提条件ですが、宛先が西営業所か東営業所で間違えて
ラインに流れていないかのチェックプログラムとなります。

Makoto
はーい!

ジェームズ
これでほぼリアルタイムの検出ができると思います。
# ライブラリ設定
import cv2 # OpenCV
import numpy as np # OpenCV オプション
import subprocess # 音楽再生ライブラリ
from datetime import datetime # 日付ライブラリ
# OpenCV設定
cap = cv2.VideoCapture(0) #
cap.set(cv2.CAP_PROP_FPS, 5) # FPS設定 ラズパイ4の4GBでは5が上限かもしれません
cap.set(cv2.CAP_PROP_FRAME_WIDTH, 300) # 小さいほど処理は早くなります
# 検査画像1設定
nishi = cv2.imread('Nishi.png')
nishi_gray = cv2.cvtColor(nishi, cv2.COLOR_BGR2GRAY)
# 検査画像2設定
higashi = cv2.imread('Higashi.png')
higashi_gray = cv2.cvtColor(higashi, cv2.COLOR_BGR2GRAY)
#Pass/Ng設定
Pass = nishi_gray
Ng = higashi_gray
# テンプレートマッチング画像の高さ、幅を取得する
h, w = nishi_gray.shape
#初期値設定
threshold = 0.8 # テンプレート検索の同一性割合
search_flg = False # 成否判定フラグ
read_count_flg = 0 # 成否判定初回限定フラグ
sound = 0 # 成否判定音源フラグ
#ファイル名設定関数
def filename(trg):
# 日付取得
date = datetime.now().strftime("%Y%m%d_%H%M%S")
# 画像保存名
if trg == 1:
fname = 'Pass/' + date + 'image.png'
else:
fname = 'Ng/' + date + 'image.png'
return fname
#プログラム開始 このループが処理時間の主要な部分
while True:
#キャプチャ取得
ret, img = cap.read()
if not ret:
break
# グレースケール化
img_gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
##########Pass##########
# 処理対象画像に対して、テンプレート画像との類似度を算出する
res = cv2.matchTemplate(img_gray, Pass, cv2.TM_CCOEFF_NORMED)
# 類似度の高い部分を検出する
loc = np.where(res >= threshold)
# 検出した部分に赤枠をつける
for pt in zip(*loc[::-1]):
cv2.rectangle(img, pt, (pt[0] + w, pt[1] + h), (0, 0, 255), 2)
#テンプレート確認時文字入れ
cv2.putText(img, "Pass", (10, 450), cv2.FONT_HERSHEY_SIMPLEX, 2, (0, 255, 0), 8)
search_flg = True
if read_count_flg == 0:
sound = 1
read_count_flg += 1
cv2.imwrite(filename(1), img)
###########Ng###########
# 処理対象画像に対して、テンプレート画像との類似度を算出する
res = cv2.matchTemplate(img_gray, Ng, cv2.TM_CCOEFF_NORMED)
# 類似度の高い部分を検出する
loc = np.where(res >= threshold)
# 検出した部分に赤枠をつける
for pt in zip(*loc[::-1]):
cv2.rectangle(img, pt, (pt[0] + w, pt[1] + h), (0, 0, 255), 2)
#テンプレート確認時文字入れ
cv2.putText(img, "NG", (10, 450), cv2.FONT_HERSHEY_SIMPLEX, 2, (0, 0, 255), 8)
search_flg = True
if read_count_flg == 0:
sound = 2
read_count_flg += 1
cv2.imwrite(filename(2), img)
# 未検出時文字入れ
if not search_flg:
cv2.putText(img, "Scanning...", (10, 450), cv2.FONT_HERSHEY_SIMPLEX, 2, (0, 255, 0), 8)
read_count_flg = 0
# 検出フラグリセット
search_flg = False
# 画像の表示
cv2.imshow('Frame', img)
# 音源設定
if sound == 1:
subprocess.Popen(['aplay', 'OK.mp3])
if sound == 2:
subprocess.Popen(['aplay', 'NG.mp3])
sound = 0
#終了キー(なにかキーが押されたら終了)
key = cv2.waitKey(1)
if key != -1:
break
cap.release()
cv2.destroyAllWindows()

Makoto
できたぁー!
これで上司さんに怒られなくて済むよ!

ジェームズ
それは良かったですね
コメント