領域検出/スコアマップ加工の結果をスクリプトタスクで判定

領域検出やスコアマップ加工で得られたブロブをスクリプト検査タスクで判定する例です。

ここでは一定以上の大きさの錠剤がいくつあるかを検査します。

入力画像

錠剤を検出した後にくっついてしまった領域をスコアマップ加工で分離するプロジェクトを例にします。
image
以下で紹介したようなプロジェクトです。
スコアマップ加工機能

スクリプト検査の基本的な使い方については以下で紹介しています。
スクリプト検査機能

今回のスクリプト検査では以下の3つを行います。

  1. 閾値の定義
  2. タスクの結果からブロブを取得
  3. ブロブを閾値で判定

幅と高さが70px以上のブロブが10個以上あったらtrueを返すようにします。
以下スクリプトです。

// 幅の閾値
const int widthTh = 70;
// 高さの閾値
const int heightTh = 70;
// カウントの閾値
const int countTh = 10;
// 検査をしない場合はnull 条件に一致する場合はtrue 条件に一致しない場合はfalse
bool? result = null;

// 全ブロブ取得 今回は使いません
// var blobs = GetBlobs("領域の分離");
// 検査を通過したブロブの取得 
// 今回はスコアマップ加工を取得していますが、領域検出も取得できます
var blobs = GetInspectedBlobs("領域の分離");

// ブロブが存在する場合
if (blobs?.Any() == true)
{
    var count = 0;
    foreach (var blob in blobs)
    {
        // ブロブの幅と高さが閾値を超えたら
        if (blob.Width >= widthTh && blob.Height >= heightTh)
        {
            count++;
            // 結果画面に表示
            AddBlob("閾値を満たしたブロブ", blob);
        }
    }
    // 閾値を満たした数が閾値を超えたらtrue
    result = count >= countTh;
}

// resultは必ず最後の行に記述してください
result

AddBlob関数を使うことで結果を画面に表示することが出来ます。

ちなみにスコアマップ加工でブロブ解析ブロックを使うことで、
一定サイズのブロブだけ残すこともできます。



この場合は検査設定で数を数えるだけで良くなると思います。

縦と横で検査する大きさが違うなど、
より細かい処理をするときはスクリプト検査を使って頂ければと思います。

「いいね!」 3