こんにちは、ゆたんぽです。
本日は引き続きHALCONの記事を書いていきます。
今回は、よく利用する2次元変換(アフィン変換)について書いていきます。
2次元変換のやり方
サンプルプログラムを利用して説明していきます。
以下は、HALCONを使用して2次元変換を行うサンプルプログラムです。
このプログラムは、画像を拡大して回転させ、その結果を表示します。
using HalconDotNet;
class Program
{
static void Main(string[] args)
{
// 画像ファイルの読み込み
HImage image = new HImage("image.jpg");
// 画像のサイズを取得
int width = image.GetWidth();
int height = image.GetHeight();
// 2次元変換のパラメータを設定
double scale = 2.0;
double angle = 45.0;
double centerX = width / 2.0;
double centerY = height / 2.0;
HTuple homMat2D;
HOperatorSet.HomMat2dIdentity(out homMat2D);
HOperatorSet.HomMat2dScale(homMat2D, centerX, centerY, scale, scale, out homMat2D);
HOperatorSet.HomMat2dRotate(homMat2D, centerX, centerY, angle, out homMat2D);
// 画像の2次元変換を実行
HImage transformedImage = image.AffineTransImage(homMat2D, "bilinear", "false");
// 変換後の画像を表示
transformedImage.Disp();
// 後処理
image.Dispose();
transformedImage.Dispose();
}
}
このプログラムでは、HALCONの「HImage」クラスを使用して、画像ファイルを読み込んでいます。次に、画像のサイズを取得し、2次元変換のパラメータを設定しています。
変換のパラメータとして、拡大率、回転角度、変換の中心座標が設定されています。
また、「HomMat2dIdentity」関数を使用して、単位行列を作成し、これに「HomMat2dScale」と「HomMat2dRotate」関数を適用して、2次元変換の行列を作成しています。
「HomMat2dScale」関数は、HALCONで2次元の拡大縮小変換を行うために使用される関数の一つです。HomMat2dScale(homMat2D, centerX, centerY, scale1, scale2, out homMat2D)のように指定でき、scale1,2にそれぞれX,Y軸の縮尺率を指定できます。例えば2倍にしたい場合は、sx,syにそれぞれ2をしてすればよいわけです。centerX,Yは変換後の画像の位置を指定します。今回は、画像中心を事前に出して、その位置を指定しています。outで2次元変換を受け取れます。
「HomMat2dRotate」関数は、 HALCONで2次元の回転を行うために使用される関数の一つです。HomMat2dRotate(homMat2D, centerX, centerY, angle, out homMat2D)のように指定でき、angleに回転角度を入れることで、指定の角度に画像を回転できます。今回は、45度を指定しています。 centerX, centerYは前述と同じです。outで2次元変換を受け取れます。
注意:角度はそのままだとエラーが出る可能性があります。ラジアン形式に変換が必要な場合は.TupleRad()関数などを利用して変換しましょう。
次に、「AffineTransImage」メソッドを使用して、画像の2次元変換を実行しています。このメソッドは、変換行列を適用して画像を変換します。このサンプルでは、変換方法として「bilinear」を指定しています。この指定により、画像が拡大された場合でも、滑らかなエッジが得られます。
最後に、変換後の画像を「Disp」メソッドを使用して表示しています。このメソッドは、HALCONの画像ビューアーを開き、画像を表示します。
まとめ
本記事では、HALCONを使用して2次元変換を行うサンプルプログラムを紹介しました。
2次元変換は多くの方が利用するので身に着けておくと便利です。