前回作ったソフトに【切り取り範囲の見えるか】を追加していきたいと思います。
下記記事を参考にしてください。
【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)
業務でプログラミング(C#/VB/Python)を作っている。
挫折を何回も繰り返し、幾度の壁を乗り越えてきた。
乗り越えてきた事を忘れないように記録に残す。
同じ思いをしている人への情報提供になれたらと思う。
基本は初心者に向けたプログラムの情報を提供する。
コメント