MicroEnableIII - eiichiromomma/CVMLAB GitHub Wiki

MicroEnableIII SDKの利用

SDKの入手

ドライバのインストールと同時にProgram Files以下に置かれるが、

から最新版が入手可能。 マニュアルがhtmlのみで使い難い。

環境構築

ビルド環境についてはVisualCの項を参照。 SISODIRなる環境変数が勝手にセットされる。 サンプルソースはこの変数を参照しているので、再起動しないとビルドエラーが発生する。

includeおよびlibのパスをそれぞれ登録すること。

ドキュメント通読のメモ

独自アプリの作成

"11 Compiler settings"に肝心な事が記載されている。

  1. "fgrab_struct.h", "fgrab_prototyp.h, "fgrab_define.h" and "menable.h" をインクルードする。
  2. "fglib3.1.lib" "display_lib.lib" をリンカの入力ファイルに指定する。

↑ドキュメントだと2.1.libだが3.1の間違い。

Hello World的ソース

ビルドが通らない。

Fg_stopAcquireの引数を修正。

// stop of the grabbing an release of all resources
Fg_stopAcquire(fg,nCamPort);
Fg_FreeGrabber(fg);

2.2 初期化および終了

Fg_Init() 初期化

Fg_Struct* Fg_Init(char *Name,int Nr)
  • Name:フレームグラバ用DLLのパス
  • Nr:何番目のグラバ

成功ならFg_Structのポインタが返る。失敗ならNULL

Fg_InitConfig() 設定ファイルを使った初期化

Fg_Struct* Fg_InitConfig(char *Name,int Nr)
  • Name:設定ファイルのパス
  • Nr:何番目のグラバ

成功ならFg_Structのポインタが返る。失敗ならNULL

Fg_FreeGrabber() 終了処理

int Fg_FreeGrabber (Fg_Struct* Fg);
  • Fg:Initで取得したFg_Struct

成功ならFG_OK、正しく初期化されてない(あるいは動いてない?)ならFG_NOT_INITが返る。

2.3 パラメータの設定

Fg_loadConfig() カメラの設定ファイルの読み込み

int Fg_loadConfig (Fg_Struct *Fg,const char * Filename);
  • Fg:Initで取得したFg_Struct
  • Filename:読み込む拡張子.mcfファイルのパス(.mcfは不要)

返り値

  • FG_OK:成功
  • FG_NOT_INIT:初期化してない
  • FG_INVALID_FILENAME:ファイルがない
  • FG_INVALID_CONFIGFILE:ファイルがおかしい

Fg_saveConfig() カメラの設定ファイルの保存

int Fg_saveConfig(Fg_Struct *Fg,const char * Filename);
  • Fg:Initで取得したFg_Struct
  • Filename:保存する拡張子.mcfファイルのパス(.mcfは不要) 返り値
  • FG_OK:成功
  • FG_NOT_INIT:初期化してない
  • FG_INVALID_FILENAME:ファイル書き込み失敗

2.4 パラメータの設定

Fg_setParameter() パラメータの設定

int Fg_setParameter(Fg_Struct *Fg,int Param, void  *Value,int CamPort);
  • Fg:Initで取得したFg_Struct

  • Param:下で定義

  • Value:設定値への任意のポインタ(キャストが必要かも)。通常は&でアドレス指定になる。

  • CamPort:ポート(microDisplayを使うと分かる)camera port A = 0、camera port B = 1 返り値

  • FG_OK:成功

  • FG_NOT_INIT:初期化してない

  • FG_INVALID_PARAMETER:パラメータ指定がおかしい

  • FG_VALUE_OUT_OF_RANGE:値がおかしい

パラメータ

パラメータ 利用可能な値 説明 デフォルト
FG_PORT PORT_A = 0,PORT_B = 1 使うポート int デバイス依存
FG_WIDTH デバイス依存 画像の幅 int デバイス依存
FG_HEIGHT デバイス依存 画像の高さ int デバイス依存
FG_XOFFSET デバイス依存 X-offset(キャプチャの原点の左上)のx int デバイス依存
FG_YOFFSET デバイス依存 Y-offset(キャプチャの原点の左上)のy int デバイス依存
FG_XSHIFT デバイス依存 たぶんモジュロ int デバイス依存
FG_TIMEOUT 1-1000000[s] タイムアウト int 5秒
FG_FRAMESPERSEC デバイス依存 秒間何枚取り込むか (FPS) double デバイス依存
FG_FORMAT FG_GRAY =8-Bit, FG_GRAY16=16-Bit, FG_COL24=25-Bit, FG_COL32=32-Bit 画像の色数 int 誤植のため不明
FG_EXPOSURE 0 -(1000000)/(f/s)[us] FPSごとの露光時間[us] int デバイス依存
FG_TRIGGERMODE 五種のトリガモード int FREE_RUN
FG_STROBPULSEDELAY 0-2^10[us] ストロボのディレイ int 0
FG_GLOBAL_ACCESS Auto=0,Read=1,Read Write=3,Read Write Change=7 アクセス int 0

※FREE_RUN,GRABBER_CONTROLLED,GRABBER_CONTROLLED_SYNC [3],ASYNC_SOFTWARE_TIGGER,ASYNC_TRIGGER

Fg_getParameter() パラメータの取得

int Fg_getParameter(Fg_Struct *Fg,int Param,void *Value,int CamPort);
  • Fg:Initで取得したFg_Struct
  • Param:下で定義
  • Value:設定値への任意のポインタ(キャストが必要かも)。通常は&でアドレス指定になる。
  • CamPort:ポート(microDisplayを使うと分かる)camera port A = 0、camera port B = 1 返り値
  • FG_OK:成功
  • FG_NOT_INIT:初期化してない
  • FG_INVALID_PARAMETER:パラメータ指定がおかしい

パラメータ

パラメータ 説明
FG_CAMSTAUS int カメラが使える状態なら1,ダメなら0
FG_REVNR double DLLのバージョン
FG_TIMEOUT int 設定されているタイムアウト[s]
FG_WIDTH int 画像の幅
FG_MAXWIDTH int 取得可能な最大幅
FG_HEIGHT int 画像の高さ
FG_MAXHEIGHT int 取得可能な最大高さ
FG_XSHIFT int モジュロ(幅はこの数で割り切れないといけない)
FG_XOFFSET int 取り込みの原点のx座標
FG_YOFFSET int 取り込みの原点のy座標
FG_FRAMESPERSEC double FPS
FG_EXPOSURE int 露光時間[us]
FG_FORMAT int 色数。上の表参照
FG_PORT int ポート。上の表参照
FG_PIXELDEPTH int 画素の階調
FG_LINEALIGNMENT int 何bitの列か
FG_TRANSFER_LEN unsigned long 最新のDMA転送長
FG_TRIGGERMODE int 上の表参照
FG_STROBPULSEDELAY int 上の表参照
FG_TWOCAMMODEL int Dualなら1。Singleなら0
FG_HDSYNC double HDSYNCの値(わからん)
FG_GLOBAL_ACCESS int 上の表参照

フレームバッファの確保と開放

ドライバで確保する方法とユーザが確保する方法の2種類がある。 リングバッファ構造になっているので、オーバーすると一番古いのが上書きされるのに注意。 面倒なので新式のみ。

確保可能なバッファはPCのメインメモリ次第だが、2.4Gが限度。 バッファは256個まで分けて確保できる。

Fg_AllocMemEx() バッファの確保

void* Fg_AllocMemEx(Fg_Struct *Fg, int Size, int Nr_Of_Buf);
  • Fg: 確保したFg_Struct
  • Size : トータルで何byte使うか(通常だと幅高さ枚数)
  • Nr_Of_Buf: 何枚で使うか(1,000,000枚まで設定可)

失敗したらNULL。成功ならバッファのハンドラへのポインタが返る。ポインタはvoid *で宣言してよい。

Fg_FreeMemEx() バッファの開放

Int Fg_FreeMemEx(Fg_Struct *Fg, void *pMem);
  • Fg:省略
  • pMem: 開放するバッファのハンドラへのポインタ

返り値

  • FG_OK:成功
  • FG_NOT_INIT:初期化してない
  • FG_STILL_ACTIVE:まだキャプチャ中

4 トリガ

FreeRunとSoftwareTriggerのみ

FreeRun

ダダ流し

SoftwareTrigger

int Fg_sendSoftwareTrigger(Fg_Struct *Fg,int nCamPort);

がトリガ。ソフトで時間制御してこの関数で1枚キャプチャのループといった感じか。

5 キャプチャ

5.2 モード

ACQ_STANDARDしか使わない

5.3 開始と終了

異常な時は画像枚数がGRAB_INFINITEになる

Fg_AcquireEx() 開始

int Fg_AcquireEx(Fg_Struct *Fg,   int  Port  , int PicCount, int nFlag, void *memHandle);
  • Fg:省略
  • Port:ポート
  • PicCount: 取り込む最大数。GRAB_INFINITEだとダダ流しでキャプチャ
  • nFlag:ACQ_STANDARDにしとく。他はドキュメント参照
  • memHandle: バッファのハンドルへのポインタ 返り値
  • FG_OK:
  • FG_NOT_INIT:
  • FG_NO_VALID_DESIGN:
  • FG_INVALID_MEMORY:
  • FG_NOT_ENOUGH_MEMORY:
  • FG_ALREADY_STARTED:
  • FG_INVALID_PARAMETER:

Fg_stopAcquire() 停止

Int Fg_stopAcquire(Fg_Struct *Fg, int CamPort);

この命令が送られた時に実行中のキャプチャが終わってからキャプチャを終了

Fg_getLastPicNumberEx() 最後に撮った画像が何番目か

int Fg_getLastPicNumberEx(Fg_Struct *Fg,int CamPort,void *pMem) ;

Fg_getImagePtrEx() 画像のポインタを取得

unsigned long *Fg_getImagePtrEx(Fg_Struct *Fg,int PicNr,int CamPort, void *pMem);

Fg_getParameter() 画像のタイムスタンプを取得

uint64 nTimeStamp = imNr;
Int Fg_getParameter(Fg_Struct *Fg,int nParameter,&nTimeStampLong, int nCamPort)

6 シェーディングの補正

7 シリアルインターフェイス

カメラ固有の設定はこっちで

8 エラー処理

9 ハードのバージョン

10 画像の表示

8ビットグレーか24ビットカラーのみ表示可。 ここら辺の処理はOpenCVの方が良いかも。