実例で学ぶMenou-TE ~その4 板金編~

第4回目の実例紹介になります。

今回はちょっと難しい板金の識別にチャレンジしたいと思います。

一度に様々な板金が映るというのが思ったよりだいぶ難しかったので、
奥の手のスクリプト検査を使います :sweat_drops:

領域検出と形状抽出とスクリプト検査で様々な板金を検出

  1. 板金検出用の領域検出を追加
    image

  2. 板金検出のアノテーション及び学習
    ここでは結果だけ表示します。

  3. 穴検出用の領域検出を追加
    image

  4. 穴検出のアノテーション及び学習
    ここでは結果だけ表示します。

  5. 大穴検出用の形状抽出を追加

  6. 大穴検出用の形状抽出の設定
    入力輪郭をスコアマップに切り替えます。


    面積をみて大穴のみを検出します。

  7. 小穴検出用の形状抽出を追加

  8. 小穴検出用の形状抽出の設定
    入力輪郭をスコアマップに切り替えてから面積をみて小穴のみを検出します。

  9. 楕円穴検出用の形状抽出を追加

  10. 楕円穴検出用の形状抽出の設定
    入力輪郭をスコアマップに切り替えてから真円度をみて楕円穴のみを検出します。

  11. スクリプト検査の設定
    ランタイム評価画面を開きます。
    image
    スクリプト検査設定タブを開いてスクリプト検査を記述し、
    スクリプト検査にチェックを入れます。


    スクリプトでは板金領域内に大穴、小穴、楕円穴の数を見て振り分けを行っています。

以下が今回使用したコードです。

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

var blobs = GetInspectedBlobs("板金検出");
var largeHoles = GetContourOutputs("大穴検出");
var smallHoles = GetContourOutputs("小穴検出");
var ellipseHoles = GetContourOutputs("楕円穴検出");

// 全ての結果が存在する時
if (blobs?.Any() == true && largeHoles?.Any() == true &&
     smallHoles?.Any() == true && ellipseHoles?.Any() == true )
 {
    foreach (var blob in blobs)
    {
        // 大穴判定
        var largeHoleCount = 0;
        foreach (var largeHole in largeHoles)
        {
            // 無効な輪郭は見ない
            if (!largeHole.IsEnabled)
            {
                continue;
            }
            // 領域内判定
            if (blob.Rect.Contains(largeHole.Blob.Centroid))
            {
                largeHoleCount++;
            }
        }
        if (largeHoleCount == 3)
        {
            AddBlob("大穴3", blob);
            result = true;
            continue;
        }
        else if (largeHoleCount == 4)
        {
            AddBlob("大穴4", blob);
            result = true;
            continue;
        }
        // 小穴判定
        var smallHoleCount = 0;
        foreach (var smallHole in smallHoles)
        {
          // 無効な輪郭は見ない
            if (!smallHole.IsEnabled)
            {
                continue;
            }
            // 領域内判定
            if (blob.Rect.Contains(smallHole.Blob.Centroid))
            {
                smallHoleCount++;
            }
        }
        if (smallHoleCount == 4)
        {
            AddBlob("小穴4", blob);
            result = true;
            continue;
        }
        // 楕円判定
        var ellipseHoleCount = 0;
        foreach (var ellipseHole in ellipseHoles)
        {
          // 無効な輪郭は見ない
            if (!ellipseHole.IsEnabled)
            {
                continue;
            }
            // 領域内判定
            if (blob.Rect.Contains(ellipseHole.Blob.Centroid))
            {
                ellipseHoleCount++;
            }
        }
        if (smallHoleCount == 2 && ellipseHoleCount == 1)
        {
            AddBlob("楕円穴1小穴2", blob);
            result = true;
        }
    }
    // 1つも見つからなかったらNG
    if (result == null)
    {
        result = false;
    }
 }

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

スクリプト検査の結果です。


全ての板金を見つけることが出来ました。

今回は領域抽出、形状抽出で得られた結果から
スクリプトを用いて様々な板金を検出しました。

動画版もあります。

板金の例は以上となります。

「いいね!」 2