VC++(Win32)とDirectXを使ってキャプチャしたときのメモ。
環境
- WindowsXP Pro SP3
- Visual C++ 2008 SP1
- DirectX SDK (June 2008)
- Windows SDK(Microsoft Windows SDK 6.0A)
- DirectX対応の(USB)カメラ
ソース
- dxcap-0.0.1.zip 表示のみ
- dxcap-0.0.2.zip 表示とAVI保存
- dxcap-0.0.3.zip 表示とAVI保存
- dxcap-0.0.4.zip BMP保存を追加
- dxcap-0.0.5.zip キャプチャサイズ指定を追加
プロジェクトの設定
文字コード設定を行う。
- 「プロジェクト」→「プロパティ」→「構成プロパティ」→「全般」→「文字セット」
- 「マルチバイト文字セットに設定する」、又は「設定なし」に設定する。
dxtrans.hが存在しない件
Bitmapの保存にSampleGrabberを使うが、現在のDirectX SDKには「dxtrans.h」が無く、コンパイル出来ないので対策する。
「qedit.h」を以下のように編集する。
私の環境では
「C:\Program Files\Microsoft SDKs\Windows\v6.0A\Include\qedit.h」。
http://d.hatena.ne.jp/nokturnalmortum/20080901
/* #include "dxtrans.h" */ #define __IDxtCompositor_INTERFACE_DEFINED__ #define __IDxtAlphaSetter_INTERFACE_DEFINED__ #define __IDxtJpeg_INTERFACE_DEFINED__ #define __IDxtKey_INTERFACE_DEFINED__
その他
・「GetCurrentBuffer」は2回呼び出す必要がある。
・http://msdn.microsoft.com/ja-jp/library/cc369551.aspx
・DirectXの関数に渡すAVIファイル名(LPCOLESTR)はUnicodeなのでMultiByteToWideChar関数による変換が必要。
・上記に付随して、strlen関数の戻り値は終端文字を含まないので文字の長さを「1」増やして渡す。
・mbstowcs関数の場合はsetlocale関数を忘れないこと。
・MultiByteToWideChar関数(Win32 API)よりもmbstowcs関数の方が好きかも。
・AvgTimePerFrameは1フレームの平均処理時間をナノ秒で指定する。ゼロを指定したらWindowsが真っ青になった。
・「sn9c102」のデータシートが見つからないが(昔はあったのに・・・)、12~15fpsが限界っぽい。
・コントラスト、色相、彩度、ガンマ、鮮明度など、受信するビデオ信号の品質を調整する場合は「IAMVideoProcAmp」を使う。
・ズーム、パン、絞り、シャッター スピードなどのカメラ設定を制御する場合は「IAMCameraControl」を使う。
Comments