画像判別を自作する!Windows+USBカメラ+OpenCVでパターンマッチング検査をPLC出力まで構築する手順
工場の検査工程で「完成品をカメラで撮って、良品と比較して合否を判定したい」というニーズは非常に多いものです。
市販の画像処理システムは数十万円〜数百万円しますが、Windows PCとUSBカメラとOpenCV(オープンソース)を使えば、数万円で簡易的な画像検査システムを自作できます。
本記事では、パターンマッチング(テンプレートマッチング)による合否判定を、PLCへ信号出力するまでの一連の手順を解説します。
システム全体構成
- USBカメラ → Windows PC (OpenCV) → USB-IO / Arduino → PLC
- Windows PC上でテンプレート画像(良品)を比較判定
全体の流れ:
- USBカメラで検査対象を撮影
- OpenCVでテンプレートマッチングを実行
- 一致度(類似度)が閾値以上ならOK、以下ならNG
- 判定結果をUSB-I/OまたはArduino経由でPLCに出力
- 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 公式チュートリアル
あわせて読みたい
- Arduino IDE セットアップ手順書:Windowsでマイコン開発環境を構築する
- AIでコード自動生成|ChatGPT・LM Studio・OpenCodeでVBAをノーコード生成してExcel業務を自動化する方法
- OpenCode セットアップ手順書:Windowsデスクトップアプリ版
- XAMPP セットアップ手順書:WindowsでPHPとMariaDBのローカル環境を構築する
当サイトはAmazonのアソシエイトプログラムに参加しています。


コメント