【C#】HALCON de 画像処理(撮像画像表示)

スポンサーリンク

前回はカメラと接続しましたので、今回は、カメラが捉えている画像を表示していきたいと思います。
流れとしては、【撮像命令→表示】になります。
表示の部分は、今までの流れでわかっているので、【撮像命令】の関数が分かれば簡単に作成できそうです。
————————————————————————————————
カメラとの接続方法については、前回の記事を参考にしてください。
【C#】HALCON de 画像処理(カメラ接続) | 育児パパの人生備忘録 (t19488sns.com)

そして、画像の表示方法が分からない方は、下記の記事を参考にしてください。
【C#】HALCON de 画像処理(画像表示) | 育児パパの人生備忘録 (t19488sns.com)
————————————————————————————————

前置きが長くなってしまいましたが、
前回まで作成しているソフトにボタンを追加していこうと思います。

撮像命令

使用する関数

■HOperatorSet.GrabImage(out HObject, HTuple)
   or
■HOperatorSet.GrabImageAsync(out HObject, HTuple, HTuple)

今回は、GrabImage関数を使って、作ってみます。

構成について

前回の構成を覚えていますか?
そして、そのカメラの前に今回は見たいものを置きます。

照明は出来るだけ明るい方がいいと思います。
自分は、キャンプ用のLED照明を購入しました。
撮像物は、小さな丸い穴が開いているガラスを使用します。

デザイン

この追加したボタンが押された時に、撮像した画像が表示できるようにします。

処理

では、ボタンをクリックされた処理を書いてみました。
前回記事のカメラ接続時に取得したカメラハンドルを使用します。
※分からない人は冒頭にあるリンクで確認して下しい。

private void btnOneShot_Click(object sender, EventArgs e)
{
    //接続したときに取得したカメラハンドルを使用し、
    //撮像命令を実施し、撮像画像を取得する。
    HOperatorSet.GrabImage(out HObject img, CameraHandle);

    //画像を表示する。
    HTuple hwndOrg = hWindowControlOrg.HalconWindow;
    HOperatorSet.DispObj(img, hwndOrg);
}

実際に動かしてみました。
何か移りましたが、ピントを合わせるのが大変で苦労します。。。

そこで、連続で撮像してみようと思います。

連続撮像

連続撮像は簡単です。
現在の処理をループで回します。
今回はわかりやすく、連続撮像(ライブ)をチェックボックスのチェックがついている間だけ実施します。

デザイン

チェックボックス[chkLive]を追加します。

処理

チェックボックスのチェックに変化があったら、イベントが実行するようなイベントを作ります。
そして、チェックがTrueの間だけ、撮像を繰り返します。
※本当はタスク処理/スレッド処理をした方がいいです。

private void chkLive_CheckedChanged(object sender, EventArgs e)
{
    if(chkLive.Checked == true)
    {
        do
        {
            //接続したときに取得したカメラハンドルを使用し、
            //撮像命令を実施し、撮像画像を取得する。
            HOperatorSet.GrabImage(out HObject img, CameraHandle);

            //画像を表示する。
            HTuple hwndOrg = hWindowControlOrg.HalconWindow;
            HOperatorSet.DispObj(img, hwndOrg);

            //画像表示の為に、Windowsに処理を預ける
            Application.DoEvents();
        } while (chkLive.Checked);
    }
}

カクカクしながら撮像が出来ました。
そして、楽にピントを合わせることに成功しました!!

ただカクカクが気に食わない!!!

カクカクを改善する。

せっかくのライブ映像なのに、カクカクだと嫌な感じがします。
そこで使用する関数を変更します。

前:HOperatorSet.GrabImage(out HObject, HTuple)
   ↓↓↓
後:HOperatorSet.GrabImageAsync(out HObject, HTuple, HTuple);
private void chkLive_CheckedChanged(object sender, EventArgs e)
{
    if(chkLive.Checked == true)
    {
        do
        {
            //接続したときに取得したカメラハンドルを使用し、
            //撮像命令を実施し、撮像画像を取得する。
            //HOperatorSet.GrabImage(out HObject img, CameraHandle);
            HOperatorSet.GrabImageAsync(out HObject img, CameraHandle, -1.0);

            //画像を表示する。
            HTuple hwndOrg = hWindowControlOrg.HalconWindow;
            HOperatorSet.DispObj(img, hwndOrg);

            //画像表示の為に、Windowsに処理を預ける
            Application.DoEvents();
        } while (chkLive.Checked);
    }
}

関数を変更する事でカクカクを無くす事が出来ました。
この関数は、撮像の処理を非同期処理で行っています。

まとめ

今回はカメラと接続した後の処理の紹介でした。
カメラと接続し、カメラに撮像命令を出し、撮像した画像を取得/表示する事でできるようになりました。
これで最小限のことは、完了したと思います。
次回は、画像処理と言えばッッ【パタンマッチング】に挑戦してみたいと思います。

コメント

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