スクリプト検査タスクで任意の領域の重なりの面積を算出

スクリプト検査タスクで任意の領域の重なりの面積を算出する機能を追加しました。
この機能では、領域検出で算出した領域同士の重なり、もしくは形状抽出で算出した輪郭の重なり合う面積を求めることが出来ます。

今回は石の上にリングを置きましたので、石に乗っかっているリングの面積を求めたいと思います。

スクリプト検査で領域検出の結果から石の上にリングがかぶっている時の面積を算出

  1. 石検出とリング検出の領域検出タスクを作成してそれぞれ学習
    image

  2. ランタイム評価画面を開く

  3. スクリプト検査設定を開いてスクリプトを記述

以下がスクリプトとなります。

// 検査をしない場合はnull 条件に一致する場合はtrue 条件に一致しない場合はfalse
bool? result = null;

// 領域検出の結果を取得
var p1 = GetPredictionTaskResult("石領域検出");
var p2 = GetPredictionTaskResult("リング領域検出");
// 取得した結果が領域検出であった時
if (p1 is ISegmentationTaskResult s1 && p2 is ISegmentationTaskResult s2)
{
    // 各タスクの結果に領域が存在する時    
    if (s1.Blobs.Any() && s2.Blobs.Any())
    {
        // スコアマップ全体の重なり合った面積を算出
        var area = AndScoreArea(s1, s2);
        // 以下は領域を指定して重なりを見たい時に有効にしてください
//        var blob1 = s1.Blobs.First();
//        var blob2 = s2.Blobs.First();
//        var area1 = AndScoreArea(s1, s2, blob1, blob2);
        // 画面に値を表示
        AddBlob("area:" + area, CreateBlob(CreatePointD(50,50), 50,50));
        // 算出した面積をチェック(ここでは10より大きいかをチェック)
        if (area > 10)
        {
            result = true;
        }
        else
        {
            result = false;
        }
    }
}

// resultは必ず最後の行に記述してください
result
  1. スクリプトを保存した後にスクリプト検査をチェック

すると面積が3738と表示され、10以上なので異常と判定されました。

このケースでは以下の画像のようにリングの部分の面積を算出しています。

この計算は画像サイズが大きい場合は少し時間がかかることがあるのでご注意ください。

スクリプト検査で 形状抽出の結果から石の上にリングがかぶっている時の面積を算出

  1. 領域検出の例の石領域検出の下に領域結合用のスコアマップ加工を追加

  2. 処理の高速化用にリサイズを追加してクロージングで領域を結合

  3. リング領域検出と領域結合の下にそれぞれ形状抽出を追加

  4. 追加した形状抽出の入力輪郭のタイプを入力タイプをスコアマップに変更

  5. ランタイム評価画面を開く

  6. スクリプト検査設定を開いてスクリプトを記述

以下がスクリプトとなります。

// 検査をしない場合はnull 条件に一致する場合はtrue 条件に一致しない場合はfalse
bool? result = null;

// 形状抽出の結果を取得
var c1 = GetContourOutputs("石形状抽出");
var c2 = GetContourOutputs("リング形状抽出");

// 各タスクの結果に輪郭が存在する時
if (c1?.Any() == true && c2?.Any() == true)
{
    // 最初の輪郭を取得
    var o1 = c1.First();
    var o2 = c2.First();
    // 輪郭の重なり合う面積の算出(輪郭は塗りつぶされます)
    var area = AndContourArea(o1, o2);
    // 画面に値を表示
    AddBlob("area:" + area, CreateBlob(CreatePointD(50,50), 50,50));
    // 算出した面積をチェック(ここでは10より大きいかをチェック)
    if (area > 10)
    {
        result = true;
    }
    else
    {
        result = false;
    }
}

// resultは必ず最後の行に記述してください
result
  1. スクリプトを保存した後にスクリプト検査をチェック

    すると面積が48822と表示され、10以上なので異常と判定されました。

このケースでは以下の画像のようにリングの部分の面積を算出しています。

画像が大きい場合は輪郭抽出の方が処理が速いケースが多くなると思います。
時間に余裕がない場合はこちらを使って頂ければと思います。

「いいね!」 1