VC++5.0によるGUI作成手順 ここではVisual C++ 5.xのGUIで操作画面を作成しHalconのプログラムを実行する方法を説明 します。例として、ワイヤボンディングの基盤検査「Ball.dev」の改良版[Ball3.dev](以下Ball3) を利用します。 GUIのプッシュボタンを押すことで、Ballの元画像とHalconの解析結果及び直径を表示しましょ う。 ****************************************************************************************** HalconとVisual C++ 5.x以上が正常にインストールされている事。 Visual C++のパスの設定でHALCONに必要なヘッダとライブラリのディレクトリが指定されている事。 ことを前提条件と致します。 詳しくは操作手順書を参照下さい。 ****************************************************************************************** (1) 操作手順書に従い、「Ball.dev」を元に「Ball3.dev」を作成します(添付リスト参照)。 (2) 「Ball3.dev」からC++コードを「Ball3.cpp」として自動生成します。 (3) Visual C++5.xを起動します。 (4) メニューから「ファイル」->「新規作成」を選択します。 (5) プロジェクトとして「MFC AppWizard(exe)」を選択します。 (6) プロジェクト名として「BallDialog」(任意に指定)を入力します。 (7) 位置として任意のディレクトリを入力します。 (8) その他は変更せず「OK」を選択します。 (9) 「ダイアログベース」を選択します。 (10) 「次へ」を選択します。 (11) 「アプリケーションへ組み込む機能」で「3Dコントロール」を選択します。その他は選択しません。 (任意に指定) (12) 「次へ」を選択します。 (13) 「ソースファイルのコメントを生成しますか?」で「する」を選択します。(任意に指定) (14) 「MFCライブラリとのリンク」で「MFCの共有DLLを使用」を選択します。 (15) 「次へ」を選択します。 (16) 「AppWizardで作成される新規アプリケーションクラス」で変更せずに「終了」を選択します。 (17) 「新規プロジェクト情報」で選択内容を確認の後「OK」を選択します。 (18) プロジェクト「BallDailog」が生成されました。 (19) 「Resource View」->「Dialog」->「IDD_BALLDIALOG_DIALOG」を選択します。 (20) 「ダイアログ」が表示されます。 (21) 「テキストボックス」と「プッシュボタン」を任意の位置に配置します。 (22) 「コントロール」メニューの「ボタン」を選択し、ダイアログ上にプッシュボタンを1つ追加しま す。 (23) 「テキストボックス」上で右クリックし「プロパティ」を選択します。 (24) 「一般」の「キャプション」に表示文字「BallDialog Visual C++5.x」(任意)を入力します。その他 は変更しません。 (25) 「OKのプッシュボタン」上で右クリックし「プロパティ」を選択します。 (26) 「一般」の「ID」に「ID_Original」(任意)を入力します。 (27) 「キャプション」に表示文字「初期画面」(任意)を入力します。その他は変更しません。 (28) 同様に「キャンセルのプッシュボタン」上で右クリックし「プロパティ」を選択します。 (29) 「一般」の「ID」に「ID_Final」(任意)を入力します。 (30) 「キャプション」に表示文字「Halcon処理画面」(任意)を入力します。その他は変更しません。 (31) 同様に追加した「プッシュボタン」上で右クリックし「プロパティ」を選択します。 (32) 「一般」の「ID」に「ID_Close」(任意)を入力します。 (33) 「キャプション」に表示文字「閉じる」(任意)を入力します。その他は変更しません。 (34) 「ダイアログ」上で右クリックし「プロパティ」を選択します。 (35) 「一般」の「ID」に「ID_BALLDIALOG_DIALOG」(任意)を入力します。 (36) 「キャプション」に表示文字「BallDialog画面」(任意)を入力します。その他は変更しません。 (37) 「ダイアログ」上で右クリックし「ClassWizerd」を選択します。 (38) 「メッセージマップ」の「オブジェクトID」で「ID_Original」を選択します。 (39) 「メッセージ」で「BN_CLICKED」を選択します。 (40) 「関数の追加」を選択します。 (41) 「メンバ関数の追加」の「メンバ関数名」で「OnOriginal」のままで「OK」を選択します。 (42) 同様に「メッセージマップ」の「オブジェクトID」で「ID_Final」を選択します。 (43) 「メッセージ」で「BN_CLICKED」を選択します。 (44) 「関数の追加」を選択します。 (45) 「メンバ関数の追加」の「メンバ関数名」で「OnFinal」のままで「OK」を選択します。 (46) 同様に「メッセージマップ」の「オブジェクトID」で「ID_Close」を選択します。 (47) 「メッセージ」で「BN_CLICKED」を選択します。 (48) 「関数の追加」を選択します。 (49) 「メンバ関数の追加」の「メンバ関数名」で「OnClose」のままで「OK」を選択します。 (50) 「コード編集」を選択します。「BallDialogDlg.cpp」の追加された3つの関数部分が表示されます。 (51) これらの関数と先に作成した「プッシュボタン」が関連しています。それぞれの「プッシュボタン」 に対応した (52) プログラムを関数に入力します。 (53) Halconで作成した「Ball3.cpp」を適当なテキストエディタで開きます。このファイルは関数main()と action()で構成されています。 (54) 「Ball3.cpp」の「#include "HalconCpp.h"」をコピーし関数「void CBallDialogDlg::OnOriginal()」の上 に張り付けます。 (55) 同様に「Ball3.cpp」の変数「HTuple」と「Hobject」を全てコピーし関数「void CBallDialogDlg::OnOriginal()」の上に張り付けます。グローバルで定義します。 (56) 「Ball3.cpp」の「::set_window_attr("background_color","black");」から 「::disp_obj(Bond,WindowIDOriginal);」を全てコピーし関数「void CBallDialogDlg::OnOriginal()」の 中に張り付けます。 (57) 「Ball3.cpp」の「::threshold(Bond,&Bright,100,255);」から関数action()の最後までを全てコピーし関 数「void CBallDialogDlg::OnFinal()」の中に張り付けます。 (58) 関数「CBallDialogDlg::OnClose()」の中に「CDialog::OnCancel();」を入力します。 (59) これでプログラムは完成です。 (60) さあ、「ビルド」して実行してみましょう! (61) 「プロジェクト」−>「リンク」−>「オブジェクト/ライブラリモジュール」に「halconcpp.lib」 を入力します。(VC++のパスの指定がきちんとされていなければいけません) (62) 「ビルド」を実行します。「BallDialog.exe - エラー 0、警告 0」と表示されます。 (63) 実行ファイルが作成されました。 (64) 作業ディレクトリの「\BallDialog\Debug」から「BallDialog.exe」を実行します。 (65) 先ほど作成したダイアログボックスが表示されます。 (66) 「初期画面」を選択して下さい。ワイヤボンディングの基盤検査の初期画面が表示されます。 (67) 「Halcon処理画面」を選択して下さい。Halconの処理によって抽出された6つのボンディングボ ールが表示されます。また、その直径の数値が表として表示されます。 (68) 「閉じる」を選択して下さい。ダイアログボックス及び全ての画面が閉じます。 <添付:Ball3.devサンプルプログラム> * ball.dev: Inspection of Ball Bonding * Visual C++ 5.x GUI dev_update_window ('off') dev_close_window () dev_open_window (0, 0, 400, 250, 'black', WindowIDOriginal) read_image (Bond, 'die3') dev_display (Bond) threshold (Bond, Bright, 100, 255) shape_trans (Bright, Die, 'rectangle2') reduce_domain (Bond, Die, DieGrey) threshold (DieGrey, Wires, 0, 50) fill_up_shape (Wires, WiresFilled, 'area', 1, 100) opening_circle (WiresFilled, Balls, 15.5) connection (Balls, SingleBalls) select_shape (SingleBalls, IntermediateBalls, 'circularity', 'and', 0.85, 1.0) sort_region (IntermediateBalls, FinalBalls, 'first_point', 'true', 'column') smallest_circle (FinalBalls, Row, Column, Radius) dev_open_window (30, 30, 400, 250, 'black', WindowIDFinal) dev_set_colored (12) disp_circle (WindowIDFinal, Row, Column, Radius) NumBalls := |Radius| Diameter := 2*Radius meanDiameter := sum(Diameter)/NumBalls mimDiameter := min(Diameter) dev_open_window (60, 60, 180, 200, 'black', WindowIDText) dev_set_color ('white') set_tposition (WindowIDText, 30, 30) write_string (WindowIDText, '** Ball Diameter **') for i := 1 to NumBalls by 1 set_tposition (WindowIDText, 50*i+60, 150) write_string (WindowIDText, 'D'+i+': '+Diameter[i-1]) endfor