画像判別を自作する!Windows+USBカメラ+OpenCVでパターンマッチング検査をPLC出力まで構築する手順

製造・FAツール

画像判別を自作する!Windows+USBカメラ+OpenCVでパターンマッチング検査をPLC出力まで構築する手順

工場の検査工程で「完成品をカメラで撮って、良品と比較して合否を判定したい」というニーズは非常に多いものです。

市販の画像処理システムは数十万円〜数百万円しますが、Windows PCとUSBカメラとOpenCV(オープンソース)を使えば、数万円で簡易的な画像検査システムを自作できます。

本記事では、パターンマッチング(テンプレートマッチング)による合否判定を、PLCへ信号出力するまでの一連の手順を解説します。

システム全体構成

  • USBカメラ → Windows PC (OpenCV) → USB-IO / Arduino → PLC
  • Windows PC上でテンプレート画像(良品)を比較判定

全体の流れ:

  1. USBカメラで検査対象を撮影
  2. OpenCVでテンプレートマッチングを実行
  3. 一致度(類似度)が閾値以上ならOK、以下ならNG
  4. 判定結果をUSB-I/OまたはArduino経由でPLCに出力
  5. PLCがその信号を元にライン制御(良品は通過、不良はリジェクト)

必要なもの

  • Windows PC:画像処理ソフトを動作させる(既存のものでOK)
  • USBカメラ(UVC対応):検査対象を撮影(3,000円〜15,000円)
  • カメラ固定用スタンド:カメラ位置を固定(2,000円〜)
  • 照明(LEDリングライト等):安定した明るさを確保(3,000円〜10,000円)
  • Arduino UNO(またはUSB-IO):PCからPLCへ信号を出力(3,000円〜)
  • フォトカプラ付きリレー:PCとPLCの絶縁(1,000円〜)

合計:15,000円〜30,000円(PC除く)

USBカメラ(UVC対応)やArduino UNO、フォトカプラ付きリレー、LEDリングライトなどの機材は Amazon でも入手できます。

ソフトウェア準備

Python + OpenCV のインストール:

pip install opencv-python
pip install numpy
pip install pyserial  # Arduinoとのシリアル通信用

Step 1:テンプレート画像の準備

良品をカメラで撮影し、その画像をテンプレートとして保存します。

import cv2

# カメラを起動
cap = cv2.VideoCapture(0)

while True:
    ret, frame = cap.read()
    cv2.imshow("Preview", frame)
    key = cv2.waitKey(1)
    if key == ord("s"):  # Sキーで保存
        cv2.imwrite("template.png", frame)
        print("Template saved!")
        break
    elif key == ord("q"):
        break

cap.release()
cv2.destroyAllWindows()

Step 2:テンプレートマッチングで合否判定

import cv2
import numpy as np

# テンプレート画像を読み込み
template = cv2.imread("template.png", 0)
tw, th = template.shape[::-1]

# カメラを起動
cap = cv2.VideoCapture(0)

# マッチングの閾値(0.7 = 70%以上の一致でOK)
THRESHOLD = 0.7

while True:
    ret, frame = cap.read()
    gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)

    # テンプレートマッチング実行
    result = cv2.matchTemplate(gray, template, cv2.TM_CCOEFF_NORMED)
    min_val, max_val, min_loc, max_loc = cv2.minMaxLoc(result)

    # 結果を表示
    if max_val >= THRESHOLD:
        cv2.rectangle(frame, max_loc, (max_loc[0]+tw, max_loc[1]+th), (0, 255, 0), 3)
        cv2.putText(frame, f"OK ({max_val:.2f})", (10, 30),
                    cv2.FONT_HERSHEY_SIMPLEX, 1, (0, 255, 0), 2)
        result_code = 1  # OK = 1
    else:
        cv2.putText(frame, f"NG ({max_val:.2f})", (10, 30),
                    cv2.FONT_HERSHEY_SIMPLEX, 1, (0, 0, 255), 2)
        result_code = 0  # NG = 0

    cv2.imshow("Inspection", frame)

    # PLCへの出力処理
    send_to_plc(result_code)

    if cv2.waitKey(1) & 0xFF == ord("q"):
        break

cap.release()
cv2.destroyAllWindows()

Step 3:判定結果をPLCへ出力する

PCからPLCへ信号を送る方法はいくつかありますが、最も簡単なのはArduinoをシリアル通信経由で制御し、そのデジタル出力をPLCの入力につなぐ方法です。

Arduino側のスケッチ

const int OUTPUT_PIN = 8;  // PLC接続用出力ピン

void setup() {
  Serial.begin(9600);
  pinMode(OUTPUT_PIN, OUTPUT);
  digitalWrite(OUTPUT_PIN, LOW);
}

void loop() {
  if (Serial.available() > 0) {
    char cmd = Serial.read();
    if (cmd == '1') {
      digitalWrite(OUTPUT_PIN, HIGH);  // OK信号を出力
    } else if (cmd == '0') {
      digitalWrite(OUTPUT_PIN, LOW);   // NG信号を出力
    }
  }
}

Python側のシリアル送信関数

import serial

# Arduinoとシリアル接続(ポート番号は環境に合わせて変更)
arduino = serial.Serial('COM3', 9600, timeout=1)

def send_to_plc(result):
    if result == 1:
        arduino.write(b'1')  # OK
    else:
        arduino.write(b'0')  # NG

Arduinoの出力ピン(8番)をPLCのDC入力ユニット(24V系ならフォトカプラ経由)に接続します。

実際の工場適用例:樹脂成型品の外観検査

  • 検査内容:成型品に欠けやバリがないか、正しい向きでコンベアに載っているか
  • カメラ:500万画素USBカメラ(UVC対応)
  • 照明:拡散LEDリングライト(影を防止)
  • テンプレート:良品の成型品を50枚撮影し、平均的なテンプレートを作成
  • 閾値:類似度0.75以上でOK
  • サイクルタイム:約0.3秒/個(OpenCVのテンプレートマッチングは非常に高速)

精度を上げるためのポイント

照明が最も重要

画像検査の成否は照明で決まると言っても過言ではありません。

  • 蛍光灯(50Hz/60Hzのフリッタあり)は避ける → LED照明が安定
  • 拡散照明を使うと表面のテカリを抑えられる
  • 同軸落射照明は鏡面仕上げのワークに有効
  • 必ず照明の電源は安定化電源から取る

カメラを固定する

検査ごとにカメラの位置がずれると、テンプレートと検査画像の位置が合わず誤判定の原因になります。アルミフレームなどでしっかり固定しましょう。

マニュアルフォーカスにする

オートフォーカスカメラは検査中にピントが変わる可能性があるため、テープで固定するかマニュアルフォーカスモードのあるカメラを使います。

トリガー撮影

連続撮影ではなく、ワークがカメラ前に来た時にだけ撮影するようにします。Arduinoのフォトセンサーでワークを検知し、PCに信号を送って撮影する方式が簡単です。

拡張アイデア

  • 複数テンプレート:複数の品種に対応するため、品番ごとにテンプレートを切り替える
  • NG画像保存:NGと判定した画像をフォルダに保存し、後で確認できるようにする
  • 結果のログ出力:検査結果をCSVに記録し、日報や品質管理に活用する
  • AI異常検知への発展:テンプレートマッチングでは難しい複雑な傷の判定は、後日AI(CNN)に置き換えることも可能

まとめ

Windows PC + USBカメラ + OpenCV + Arduino という組み合わせで、数万円の投資で簡易画像検査システムが自作できます。

実現できること:

  • テンプレートマッチングによる良品/不良品の判定
  • 判定結果のPLCへの信号出力
  • 検査結果のログ保存

市販の画像処理システムと比較すると精度や速度では劣りますが、「試しに自動化してみたい」「PoC(概念検証)をしたい」という目的には十分な性能です。


実際にやってみると——マッチング精度はとても悪い

正直に書くと、OpenCVのテンプレートマッチングは、現場で使うと期待外れになることが多い。

なぜか?

  • 照明の微妙な変化:時間帯による自然光の変化、蛍光灯の明るさ変動で、同じワークでも画像が大きく変わる
  • 個体差:良品でも微妙に色が違う、バリの寸法が違う、位置が数ピズずれるだけで一致度が下がる
  • 照明のむら:LEDリングライトでも中心と端部で明るさが違い、正しい照明設定が難しい

キーエンスのIVシリーズ等の産業用画像処理システムは、AIを搭載し、こうした個体差・照明変化を「許容」する。しかし、OpenCVのテンプレートマッチングは「画素単位で一致を求める」ため、現実の現場では使い物にならないことが多い。

この記事はあくまで「手作りで画像検査の原理を学ぶ」「PoC段階で試す」目的に留めるべきだ。本格的な導入を検討する場合は、キーエンスIV2シリーズ、またはCV-Xシリーズのような産業用システムを検討することをおすすめする。


出典・参考

  • OpenCV 公式ドキュメント
  • Arduino 公式リファレンス
  • Python 公式チュートリアル

あわせて読みたい

当サイトはAmazonのアソシエイトプログラムに参加しています。

コメント

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