今回も前回までに使用していた記事(アプリケーション)を元に手を加えていきたいと思います。
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)お楽しみにしていたパタンマッチングを実行して、切り取った画像がどこにあるか検出してみましょう。
業務でプログラミング(C#/VB/Python)を作っている。
挫折を何回も繰り返し、幾度の壁を乗り越えてきた。
乗り越えてきた事を忘れないように記録に残す。
同じ思いをしている人への情報提供になれたらと思う。
基本は初心者に向けたプログラムの情報を提供する。
コメント