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

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
できたぁー!
これで上司さんに怒られなくて済むよ!

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