工場などで使える画像診断装置を自作してみよう! その3

RaspberryPi
ジェームズ
ジェームズ

それではプログラムを書いていきましょう。

前提条件ですが、宛先が西営業所か東営業所で間違えて

ラインに流れていないかのチェックプログラムとなります。

Makoto
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
Makoto

できたぁー!

これで上司さんに怒られなくて済むよ!

ジェームズ
ジェームズ

それは良かったですね

コメント

Ads Blocker Image Powered by Code Help Pro

広告ブロックを検知しました!

広告ブロック解除をお願い致します!

このサイトは広告収入だけで成り立っているため

ご協力をお願い致します!

タイトルとURLをコピーしました