【C#】HALCON de 画像処理(テンプレート画像作成)

スポンサーリンク

今回も前回までに使用していた記事(アプリケーション)を元に手を加えていきたいと思います。
https://t19488sns.com/csharp_halconcameraimaging/1102/
[パタンマッチング]に挑戦したいと思います。(パターンマッチングなのか?)
とうとう画像処理っぽい事をやろうと思いますw
最終目標は、【切り取った画像がどこにあるかを検出する】です。
ただいきなりでは難しそうなので、
今回の目標は【切り取った画像をテンプレート画像にする】です。
「指定したものが対象のどこにあるか」を検出する事を「パタンマッチング」と呼ばれています。

今回の使用する関数

HOperatorSet.CreateNccModel(HObject,HTuple,HTuple,HTuple,HTuple,HTuple,out HTuple)

今回は[CreateNccModel()]という関数を使って行いたいと思います。
パタンマッチングをする手段(検出する手段)として、NCC[Normalized Cross Correlation]を使用します。
NCC検出では、「照明の影響を受けづらい」と言うメリットがあるからです。
しかし、「計算量が多い」と言うデメリットもあります。
※以降から「テンプレート画像 = NCCモデル」と呼びます。

NCCモデル(テンプレート画像)を作成する

今回は、画像の切り取り処理のタイミングで、NCCモデルの作成を追加したいと思います。
その為、デザインの変更は無しです。
下記、ボタンのクリック処理に追加していきます。

モデル用の変数の定義

モデルの変数をこのフォーム内で使用できるようにPrivateで定義します。

public partial class frmTrimming : Form
{
    HObject DispOrgImag = null;
    const double DEF_W = 640.0;
    const double DEF_H = 480.0;

    HTuple ModelID;

(以下、省略)
}

切り取り処理にモデル作成処理追加

切り取った画像ができたタイミングで、NCCモデルの作成を行います。

private void btnTrim_Click(object sender, EventArgs e)
{
    HTuple hwndTrim = hWindowControlTrim.HalconWindow;
    HOperatorSet.ClearWindow(hwndTrim);
    if (DispOrgImag == null) return;        //画像読込されてないなら処理しない

    // 画像の切出し
    double left = (double)nudX.Value;
    double top = (double)nudY.Value;
    double right = (double)(nudX.Value + nudW.Value);
    double bottom = (double)(nudY.Value + nudH.Value);
    HOperatorSet.CropRectangle1(DispOrgImag, out HObject trimImg, top, left, bottom, right);

    //NNCファイル作成
    HOperatorSet.CreateNccModel(trimImg, "auto", -0.39, 0.79, "auto", "use_polarity", out ModelID);

    //Zoom方式で表示
    DispZoom(hwndTrim, trimImg);
}

白黒画像に変換する

グレースケールの画像に対してのみNCCモデルが作成可能なようなので、追加で処理を変更しました。
グレースケールの画像への変換は下記関数を使用します。

HOperatorSet.Rgb1ToGray(HObject, out HObject)

では、その関数を追加してみましょう!

private void btnTrim_Click(object sender, EventArgs e)
{
    HTuple hwndTrim = hWindowControlTrim.HalconWindow;
    HOperatorSet.ClearWindow(hwndTrim);
    if (DispOrgImag == null) return;        //画像読込されてないなら処理しない

    // 画像の切出し
    double left = (double)nudX.Value;
    double top = (double)nudY.Value;
    double right = (double)(nudX.Value + nudW.Value);
    double bottom = (double)(nudY.Value + nudH.Value);
    HOperatorSet.CropRectangle1(DispOrgImag, out HObject trimImg, top, left, bottom, right);

    //白黒画像に変換する
    HOperatorSet.Rgb1ToGray(trimImg, out HObject grayImg);

    //NNCファイル作成
    HOperatorSet.CreateNccModel(grayImg, "auto", -0.39, 0.79, "auto", "use_polarity", out ModelID);

    //Zoom方式で表示
    DispZoom(hwndTrim, trimImg);
}

NCCモデル作成時にエラーが発生(#3359)

カラー画像のままNCCモデルを作成すると、下記エラーが発生します。

【HALCON error #3359】です。
簡単に言うと、「カラー画像は出来ないよ!」って書いてあると思います。
NCCモデル作成時には、白黒画像に変換する処理が必要になりますね。

NCCモデル作成時にエラーが発生(#8506)

マスターにする画像が小さすぎると下記エラーが発生します。

【HALCON error #8506】です。
簡単に言うと「画像が小さすぎて、モデル作れないよ」って書いてあると思われます。
ある程度の画像サイズが必要な事がわかりました。

まとめ

今回は、パタンマッチングを行う為のテンプレート画像を作成しました。
マッチングの手法として、NCCを使用しました。
NCCでマッチングする為に、NCCモデルを作成する手順でした。
NCCモデルを作成には、グレースケールの画像である事が必須の為、グレースケールに変換してNCCモデルを作成しました。
次回は(自分がw)お楽しみにしていたパタンマッチングを実行して、切り取った画像がどこにあるか検出してみましょう。

コメント

タイトルとURLをコピーしました