スクリプト検査機能をリリースしました。
スクリプト検査機能とは、領域検出や形状抽出で求めた対象物の位置情報(ブロブ)を入力として、
様々な検査をユーザー自身がプログラミングして記述できる機能になります。
他のタスクとは違い、タスク間の情報を自由にやりとり出来るメリットがあります。
使い方は以下のようになります。
-
ランタイム評価画面を開く
※学習が必要なタスクはすべて学習が完了している必要があります
-
スクリプト検査設定タブを選択
-
スクリプトを記述
例 : 錠剤の中心と中心の距離を測定(近いとNG)コード
// 錠剤の距離が近いときはNG
// 距離閾値
const double distanceTh = 170.0;
// 検査をしない場合はnull 条件に一致する場合はtrue 条件に一致しない場合はfalse
bool? result = null;
// 錠剤検出で得られた検査を通過したブロブリスト
var blobs = GetInspectedBlobs("錠剤検出");
// ブロブが存在する場合
if (blobs?.Any() == true)
{
// ReadOnlyCollectionからListに変換して要素にアクセス出来るようにする
var blobList = blobs.ToList();
var count = blobList.Count;
// ブロブと次のブロブをペアとして距離を算出
var distances = new List<double>();
for (var i = 0; i < count - 1; i++)
{
var blob = blobList[i];
var nextBlob = blobList[i + 1];
// ブロブの重心をdouble型に変換
var blobCentroid = CreatePointD(blob.Centroid.X, blob.Centroid.Y);
var nextBlobCentroid = CreatePointD(nextBlob.Centroid.X, nextBlob.Centroid.Y);
// 座標ペアを生成
var pointPair = CreatePointPair(blobCentroid, nextBlobCentroid);
// 追加した座標ペアはUIに表示され、レポートも出力できる
AddPointPair("座標ペア", pointPair);
distances.Add(pointPair.Distance);
}
// 距離を判定(1つでも閾値より低い距離があったらNG)
result = !distances.Where( distances => distances < distanceTh).Any();
}
// resultは必ず最後の行に記述してください
result
以下がスクリプト検査で使用できる関数、クラスの仕様書となっています。
スクリプト検査ドキュメント
スクリプト検査では、ScriptParameter(P.14)のメソッドを自由に呼び出すことが出来ます。
今回使用した関数ですと、
メソッド名 | ページ | 内容 |
---|---|---|
GetInspectedBlobs |
12 | 検査設定を通過したブロブの取得 |
CreatePointD |
19 | double型の座標を生成 |
CreatePointPair |
19 | 座標ペアの生成 |
AddPointPair |
14 | 座標ペアをデバッグ情報に追加 |
参照したプロパティは、 | ||
プロパティ名 | ページ | 内容 |
----- | ----- | ----- |
IBlob.Centroid |
1 | ブロブの重心座標 |
IPointPair.Distance |
5 | 座標間の距離 |
となります。 |
そしてint
やdouble
,List
等の基本型、Enumerable
(System.Linq
)、
またデバッグ用途にFile
(System.IO
)が使えるようになっています。
なお、検査の結果はresultに記述してください。
値 | 検査設定との関係 |
---|---|
true |
条件に一致する |
false |
条件に一致しない |
null |
検査をしない |
nullの使いどころが難しいと思いますが、 | |
検査する情報が不足していてtrue かfalse か判断できない時はnull を使い、 |
|
そもそも情報が不足している状態がNGな状態であればtrue (異常検知時)かfalse (正常検知時)を使うことになると思います。 |
最後にresultは必ず最後の行に記述してください。
return
をや;
を記述するとエラーになってしまうので気を付けてください。
-
スクリプトを保存してスクリプト検査を有効
-
スクリプト検査タブが現れるので選択
すると、あとちょっとで北斗七星になれそうな線が描かれました。
例に書いたスクリプトでは前後に並んだブロブの重心の距離を見ています。
画面には距離を求めるのに用いた情報を描画しています。
今回は距離が170pixel以下の座標ペアがある場合に異常と定義しました。
先ほどの画像の判定結果は正常となりました。
そして以下のように錠剤同士の距離の近い場合は異常となります。
他にも直線のペアを生成して角度をチェックしたり、
座標をあれこれ計算して検査することも可能です。
以下の「実例で学ぶMenou-TE」シリーズでもスクリプト検査を使っています。
実例で学ぶMenou-TE ~その4 板金編~
一般的な処理だけでは検査が難しい、
もしくは独自の検査ロジックがある場合はこのスクリプト検査を使って頂ければと思います。
また、よく使われるロジックは定型スクリプト検査として登録して、
UIからパラメータを指定するだけで検査が行える機能の開発を検討しております。
プログラミングまでするのはちょっと…という方も、
細かい検査設定が出来るよう工夫していきたいと思っています。
なお、現在入力として扱えるのはスコアマップを出力できる領域検出、異常領域検出、スコアマップ加工、そして今回追加した形状抽出の一部の形状情報です。
ご要望があれば随時追加していこうと思っています。