【C#】HALCON de 画像処理(描画)

スポンサーリンク

前回作ったソフトに【切り取り範囲の見えるか】を追加していきたいと思います。
下記記事を参考にしてください。

【C#】HALCON de 画像処理(画像切り取り) | 育児パパの人生備忘録 (t19488sns.com)

今回したい事は、【切り取り範囲の見えるか】です。
前回、数値をいじりながら頑張って目標の位置を切り取りました。。。
切り取りの設定値を変更した際に、【切り取り範囲が描画】されるようにしたいと思います。

やりたい事

やりたい事を整理します。

フォーム右上に作った「切り取り設定」の数値(NumericUpDown.Value)が変化したら、表示しているコントロール(hWindowControlOrg)に四角を描画します。

今回使用するのは、

■NumericUpDown.Valueが変化する時に発生するイベント[ValueChanged]の作成
  ※今回は使用してるNumericUpDownは同じイベントで処理します
   (イベント名:nudParam_ValueChanged)

■Halconの関数では、下記を使っていきます。
  塗りつぶし無し設定:HOperatorSet.SetDraw(HTuple, HTuple)
  線の色指定:HOperatorSet.SetColor(HTuple, HTuple)
  四角の描画:HOperatorSet.DispRectangle1(HTuple, HTuple, HTuple, HTuple, HTuple)

イベントの作成

イベントの作成は、デザイン画面でイベントを作りたいコントロールをダブルクリックしてください。
NumericUpDownの場合は、デフォルトでValueChangedのイベントが作成されます。

ダブルクリックすると、コードの画面に行き、イベントが作成されています。

ちょっと関数名を変えます。※直接変更するとデザイナが開かなくなるので注意です。
今回は[nudX_ValueChanged]→[nudParam_ValueChanged]に変更します。
残りの三つは、下記方法で同じイベントとして処理できるように登録します。

コントロールを選択し、⚡マークをクリックして、イベント一覧を表示させる。
そこから、ValueChangedを探し、コンボボックスの一覧から先ほど作ったイベントを選択する。

イベントの処理(線を描画する)

流れとしては下記の流れで行う。

■画像を再描画
■切り取り範囲の設定値取得
■塗りつぶし無し設定[HOperatorSet.SetDraw(HTuple, HTuple)]
■色指定(赤)[HOperatorSet.SetColor(HTuple, HTuple)]
■四角を描画[HOperatorSet.DispRectangle1(HTuple, HTuple, HTuple, HTuple, HTuple)]
■切り取り範囲のサイズの最大値変更(入力制限)

流れが決まったので、処理を書いていく。

private void nudParam_ValueChanged(object sender, EventArgs e)
{
    if (DispOrgImag == null) return;        //画像読込されてないなら処理しない

    //再描画
    HTuple hwndOrg = hWindowControlOrg.HalconWindow;
    DispZoom(hwndOrg, DispOrgImag);     //毎回書くのが面倒なので関数化

    //切り取り範囲の取得
    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.SetDraw(hwndOrg, "margin");        //塗りつぶし無し設定
    HOperatorSet.SetColor(hwndOrg, "red");          //線は赤色
    HOperatorSet.DispRectangle1(hwndOrg, top, left, bottom, right);     //四角を描画

    //最大値変更(Width)
    if (nudX.Maximum - nudX.Value < nudW.Value) nudW.Value = nudX.Maximum - nudX.Value;
    nudW.Maximum = nudX.Maximum - nudX.Value;

    //最大値変更(Height)
    if (nudY.Maximum - nudY.Value < nudH.Value) nudH.Value = nudY.Maximum - nudY.Value;
    nudH.Maximum = nudY.Maximum - nudY.Value;
}

毎回ズーム方式で表示するのが面倒になってしまい、関数を作ってしまった。。。
最後の補足で内容を紹介します。
とりあえず、実行してみる。

切り取り設定の数値が変更されるたびに描画されることが分かる。
このガイドのおかげで切り取り範囲が簡単に決まる!!

まとめ

コントロールのイベントを利用して、四角を描画しました。
初めて作ってにしてはいい感じなのではないでしょうか?
調べるとユーザーがマウスで切り取り範囲をすることが出来るようなので、
次回は【マウスで切り取り範囲を決める】をテーマに紹介していきたいと思います。

補足:関数名を変える時のリファクタリング名の変更[名前の変更]について

ちょっと覚えていると楽になるショートカット!
それは名前を変更したい変数名や関数名やをクリックして、「F2キー」を押す。
もしくは「Ctrl + R → Ctrl + R」を押す。

対象の変数名/関数名が青くなっている状態で、
変更したい名前に変更するとコード内の全てに展開される。
一括で変更したい時に便利です。

補足:ズーム表示を関数化[DispZoom(HTuple, HObject)]

いままでの記事では、見やすいように書いていましたが、同じことを書くのは面倒なので関数にしましたので紹介します。

private void DispZoom(HTuple windowhandle,HObject img)
{
    //Zoom方式で表示
    HOperatorSet.GetImageSize(img, out HTuple w, out HTuple h);
    double rateR = DEF_H / h, rateC = DEF_W / w;
    double rate = (rateR < rateC) ? rateR : rateC;

    double c1 = -((DEF_W / rate) - w) / 2;
    double c2 = c1 + (DEF_W / rate);
    double r1 = -((DEF_H / rate) - h) / 2;
    double r2 = r1 + (DEF_H / rate);
    HOperatorSet.SetPart(windowhandle, r1, c1, r2, c2);
    HOperatorSet.DispObj(img, windowhandle);
}

補足:塗りつぶしありにしたい

塗りつぶしたい場合は、下記のようにしてください。

HOperatorSet.SetDraw(hwndOrg, "fill");

下記サイトを参考にして下しさい。
set_draw [HALCON Operator Reference / Version 13.0.4] (mvtec.com)

補足:他の色を指定したい

今回は、赤を指定しましたが、他にも色を指定できるので、参考にしてください。
set_color [HALCON Operator Reference / Version 13.0.4] (mvtec.com)

コメント

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