MicroEnableIII - eiichiromomma/CVMLAB GitHub Wiki
MicroEnableIII SDKの利用
SDKの入手
ドライバのインストールと同時にProgram Files以下に置かれるが、
から最新版が入手可能。 マニュアルがhtmlのみで使い難い。
環境構築
ビルド環境についてはVisualCの項を参照。 SISODIRなる環境変数が勝手にセットされる。 サンプルソースはこの変数を参照しているので、再起動しないとビルドエラーが発生する。
includeおよびlibのパスをそれぞれ登録すること。
ドキュメント通読のメモ
独自アプリの作成
"11 Compiler settings"に肝心な事が記載されている。
- "fgrab_struct.h", "fgrab_prototyp.h, "fgrab_define.h" and "menable.h" をインクルードする。
- "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の方が良いかも。