Photonfocus 社インテリジェントカメラ
SM2 シリーズチュートリアル
目次
はじめに ... 2 1 概要 ... 3 1-1 プロジェクトウィンドウ ... 3 1-2 フレームワーク ... 4 1-2-1 ユーザークラス ... 4 2 サンプル 1 ... 5 2-1 コンストラクタ ... 5 2-2 デストラクタ ... 6 2-3 OnUserIO() ... 6 2-4 OnImage() ... 7 3 サンプル 2 ... 8 3-1 コンストラクタ ... 8 3-2 デストラクタ ... 8 3-3 OnUserIO() ... 8 3-4 OnImage() ... 9 4 サンプル 3 ... 10 4-1 コンストラクタ ... 11 4-2 デストラクタ ... 11 4-3 OnUserIO() ... 11 4-4 OnImage() ... 12 5 その他のサンプル ... 13 改定履歴 ... 14はじめに
この度は株式会社アプロリンク取り扱い製品をご使用いただき誠にありがとうございます。ご使用の前に、この資料をお読みい ただき、正しくお使い下さい。 ・ 本書は、お客様がWindows/MAC の基本操作に習熟している事を前提にしております。 ・ 本書内で使用されている表示画面、イラスト等は説明用に作成されたものです。お客様の環境により実際の表示画像と違う 場合がございます。 ・ ご使用のパソコン・周辺機器・オペーレーティングソフトなどお客様のご利用環境により正常に動作しない場合があります。 ・ 本書に使用する内容の一部、または全部は、株式会社アプロリンクによる許可なく転載することはできません。 ・ 本書の内容について、万一不審な点や記載漏れなどお気付きの点がありましたら、ご連絡下さい。 ・ 本書の内容に疑問点などが生じた場合は、メーカー発行の英文技術資料および英文マニュアルを正しい情報として下さい。 ・ 本書の内容は予告なしに変更する場合がありますのでご了承ください。1 概要
このドキュメントはPhotonfocus 社インテリジェントカメラ SM2 シリーズのソフトウェアフレームワークの基本コンセプトを 紹介するものです。Texas Instruments(TI)社 Code Composer Studio(CCS)開発キットの基礎知識(プロジェクトのオー プン、コンパイル、ターゲットDSP へのロード)は含んでおりません。
Code Composer Studio(CCS)のサポートについては、Texas Instruments(TI)社製品販売店にお問い合わせください。
1-1 プロジェクトウィンドウ
プロジェクトをオープンした後、各プロジェクトの各種ファイルはプロジェクトファイル一覧ウィンドウで表示されます。
図 1-1 プロジェクトファイル一覧 ファイルの種類:
DSP/BIOS コンフィグファイル
DSP/BIOS マルチタスクカーネルコンフィグファイルを利用して、実行時に DSP / BIOS API で使用するためのオブジェク トとプロパティを設定することができます。これらのオブジェクトは、スレッド、スレッドの優先順位、I / O ストリーム、 イベントログ、メモリ、割り込みハンドラが含まれています。 生成ファイル DSP/BIOS で自動生成されたファイルです。 インクルードファイル ビルドプロセスでプログラムが自動的にインクルードファイルを検索しますので、手動で追加する必要がありません。 プロジェクトをビルドした後、インクルードファイルがプロジェクトウィンドウで表示されます。 ライブラリ プリコンパイル関数ライブラリ ソース ユーザーソースコードファイル CMD リンカーコマンドファイル プログラムとデータセクションをメモリにマッピングするファイルです。
1-2 フレームワーク
SM2 シリーズカメラ用のソフトウェアは、ソースコード、プリコンパイルされたライブラリ(Framework.lib)として提供され ているフレームワークに構成されています。下記機能の各種C++クラスが含まれています: カメラセンサーからDSP メモリへ画像転送 カメラパラメータの変更、ロードと保存 イーサネットインターフェイスの提供 ユーザー入力の取り扱い グラフィカルユーザー·インターフェース(GUI)1-2-1
ユーザークラス
ユーザーで実装するアプリケーションのクラスは、: アプリケーションダイアログクラスCDlgApp です。 ヘッダファイルCDlgApp.hpp と実装ファイル CDLgApp.cpp で構成されており、このクラスで画面の左側にダイアログを生成 し、カメラ取得画像へのアクセスを提供します。 このクラスは以下の4 つの関数を宣言します: コンストラクタ(CDlgApp()) - クラスの構築 - ユーザー変数の初期化など デストラクタ(〜CDlgApp()) - クラスのクリーンアップ - メモリの解放など OnUserIO() - この関数は自動的にフレームワークによって呼び出されます。 - キーボードやマウス等のユーザー入力の処理に使用されます。 OnImage() - 画像取得後この関数はフレームワークによって呼び出されます。 - 画像処理に使用されます。2 サンプル 1
このサンプルはカメラのライブ画像を表示し、ユーザー入力を処理するサンプルです。 図 2-1 サンプル12-1 コンストラクタ
コンストラクタで関数ReadIcon("B_BACK.PNG", 98, 98)で micro SD カードからアイコンイメージをロードし、アプリケーシ ョンダイアログ(GUI_DlgAddIconButton())にアイコンボタンを追加しました。 このボタンが識別子DLG_ABORT を取得し、ボタンをクリックするとダイアログから出て、メインダイアログに戻ります。CDlgApp::CDlgApp(CPSApp *pHApp, int x, int y, int Width, int Height)
:CDlg(pHApp, x, y, Width, Height) {
SetID(DLG_APP); // Set Id of dialog
GUI_DlgSetTitle(&m_Dlg, "Example 1"); // Change title of dialog // Add cancel button
int iHeight = m_pA->m_Icon[ICON_BACK].Height;
GUI_DlgAddIconButton(&m_Dlg, 110, Height - (iHeight + 8),
98, 98, "_Back", &m_pA->m_Icon[ICON_BACK], DLG_ABORT);
2-2 デストラクタ
GUI_DlgFree(&m_Dlg)を利用して、ダイアログのメモリを解放します。2-3 OnUserIO()
この関数は、最初にダイアログにアプリケーションのフォーカスにあるかどうかをチェックします。即ちこのダイアログは、プ ログラムのアクティブダイアログであり、ユーザ入力を処理することを指しています。 次に関数GUI_DlgWork()が呼び出されます。 ユーザーがConstructor(ID = DLG_ABORT)で作成されたボタンを選択した場合、フォーカスはアプリケーションのメインダ イアログに戻ります。 ユーザー入力後、ダイアログはGUI_DlgRefresh()で画面上に描画されます。 CDlgApp::~CDlgApp() { GUI_DlgFree(&m_Dlg); }int CDlgApp::OnUserIO(int nKey)
{
m_Activity = 0;
if ((*m_DlgFocus == m_ID) && (*m_DlgNewFocus == m_ID))
{
// m_Activity contains an event ID of the last user input
m_Activity = GUI_DlgWork(&m_Dlg, nKey); switch (m_Activity)
{
case DLG_ABORT: // Return focus to main dialog
*m_DlgNewFocus = DLG_MAIN;
pDlgMain->Enable(1); // Enable DlgMain again
m_pA->m_View = m_pA->m_ViewOld;
m_Visible = 0; // Hide example dialog
break; }
if (m_Activity) // Update dialog after user interaction
GUI_DlgRefresh(&m_Dlg);
}
return m_Activity; }
2-4 OnImage()
カメラからのグレー画像をRGB 画像にコピー・変換します。
int CDlgApp::OnImage(YIMAGE *pSrc, CIMAGE *pDst)
{
// Copy the image from pSrc to pDst
GUI_CopyYArea2RGB(pSrc, pDst, 0, 0, pSrc->Width, pSrc->Height, 0, 0); return 0;
3 サンプル 2
このサンプルはサンプル1 をベースとしたものであり、シンプルな画像処理とより多くのユーザー入力を処理します。 図 3-1 サンプル23-1 コンストラクタ
このコンストラクタはサンプル1 をベースにしています。スライダーダイアログ項目に割り当てられている新しいメンバー変数 m_Thresh を追加しています。 … m_Thresh = 128; …// Create dialog edit slider
3-4 OnImage()
カメラ画像に二値化処理を追加します。画像の各画素を閾値と比較され、大きい値は、白(255)に、より小さい値が黒(0)に 設定されています。
注意
これはDSP 用の最速の二値化アルゴリズムではありません。
int CDlgApp::OnImage(YIMAGE *pSrc, CIMAGE *pDst)
{
unsigned char *restrict pY = pSrc->pY; // Shortcut to camera image pointer // Threshold image
for (int i=0; i<pSrc->Width*pSrc->Height; i++)
pY[i] = (pY[i]>m_Thresh) ? 255 : 0;
// Copy the image from pSrc to pDst
GUI_CopyYArea2RGB(pSrc, pDst, 0, 0, pSrc->Width, pSrc->Height, 0, 0);
return 0; }
4 サンプル 3
このサンプルもサンプル1 をベースとしたものであり、カメラのパラメータを変更するサンプルです。
4-1 コンストラクタ
このコンストラクタもサンプル1 をベースにしています。新しいメンバー変数 m_ExposureTime を追加し、編集スライダは、 露光時間の値の範囲に、より良い適応を取得するために対数モードに切り替えられます。
露出機能へのポインタは、アプリケーションのメインクラス(m_pA - > m_pExposureTime)からメンバーをアクセスするこ とで生成します。現在のカメラパラメータ値がGetValue()で、最小値と最大値が GetMin()や GetMax()で読み込まれます。 SetValue()関数は新しい値を設定します。
4-2 デストラクタ
サンプル1 と同様です。4-3 OnUserIO()
この関数はGUI_DlgWork()で、他のユーザー入力イベントを処理します。 ボタン1 又は 2 を選択して露光時間を指定します。。 スライダを移動した場合、GUI_DlgWork()の戻り値は DLG_VALUE_になります。この場合、GUI_GetSelectedID()でアクティ ブ項目の識別子を決定します。戻り値のId が一致した場合、露光時間が変更されます。 …CFeature *pExposureTime = m_pA->m_pExposureTime; // Shortcut to exposure feature
m_ExposureTime = pExposureTime->GetValue(); // Copy value of exposure into
member variable
…
// Create dialog buttons
GUI_DlgAddButton(&m_Dlg, 8, 32, Width-16, 24, "Exposure _10000", 1);
GUI_DlgAddButton(&m_Dlg, 8, 64, Width-16, 24, "Exposure _20000", 2);
// Create dialog edit slider
DLG_ITEMD *pItem = GUI_DlgAddEditSlider(&m_Dlg, 8, 96, Width-16, "_Exp",
&m_ExposureTime, pExposureTime->GetMin(), pExposureTime->GetMax(), 3);
GUI_DlgSetEditSliderType(pItem, DLG_ES_LOGARITHMIC);
4-4 OnImage()
サンプル1 と同様です。
int CDlgApp::OnUserIO(int nKey)
{
CFeature *pExposureTime = m_pA->m_pExposureTime; // Shortcut
m_Activity = 0;
if ((*m_DlgFocus == m_ID) && (*m_DlgNewFocus == m_ID))
{
m_Activity = GUI_DlgWork(&m_Dlg, nKey); // m_Activity contains an
event ID
of the last user input
switch (m_Activity) { case 1: // Button 1 pExposureTime->SetValue(10000); m_ExposureTime = 10000; break; case 2: // Button 2 pExposureTime->SetValue(20000); m_ExposureTime = 20000; break;
case DLG_VALUE_CHANGED: // Slider value has changed
if (GUI_DlgGetSelectedID(&m_Dlg) == 3) // Exposure edit slider
pExposureTime->SetValue(m_ExposureTime); break; case DLG_ABORT: *m_DlgNewFocus = DLG_MAIN; pDlgMain->Enable(1); m_pA->m_View = m_pA->m_ViewOld; m_Visible = 0; break; } if (m_Activity) GUI_DlgRefresh(&m_Dlg); } return m_Activity; }
prj_imagelib プロジェクトは、TI 社の高度に最適化された画像ライブラリの一部の機能へのアクセスを提供します。
ユーザーはSDK プロジェクトとライブラリ(IMG_thr_gt2max()、IMG_thr_le2min()、IMG_perimeter()、IMG_sobel ())から異なるエッジ検出機能の切り替え、ROI を選択することができます。
図 5-1 Image LIB と Halcon のサンプル
もう一つのサンプル(prj_halcon)が、プロジェクトに Halcon ライブラリを統合する方法を示しています。 画像処理ステップは、閾値、セグメンテーション、モフォロジと物体の特徴の検出です。
改定履歴
日 付 内 容 Revision