QA@IT
«質問へ戻る

質問を投稿

マルチスレッドでDirectShowの静止画をキャプチャしたい

DirectShow .NETライブラリ( http://sourceforge.jp/projects/sfnet_directshownet/ )を使って、
USBカメラから静止画を逐次取り込み、加工してリアルタイムで表示するアプリを作ろうとしています。

前述のライブラリのCaptureメソッドでキャプチャして表示する処理を、System.Windows.Forms.Timerで0.1秒毎に実行するプログラムを作って、うまくいったように見えたのですが、
USBカメラによっては、一秒間に3回しか処理できず、しかも、その間ウィンドウの操作が固まってしまうことが判明しました。

調べてみると、前述のライブラリのCaptureメソッドの中にあるm_VidControl.SetMode(...)の実行に300ミリ秒前後かかっていました。

そこで、カメラから静止画を取得する処理をSystem.Threading.timerを使って動かそうと思ったのですが、今度は、m_VidControl.SetMode(...)がInvalidCastException例外を発生するようになってしまいました。
この例 http://stackoverflow.com/questions/6403533/calling-a-function-in-another-thread-c-sharp と同じ現象で、マルチスレッドでは利用できないというようなことのようなのですが・・・

カメラから画像を取り込んでリアルタイムに処理するようなアプリは最近色々見かけると思うのですが、どのように実装すればよいのでしょうか?

DirectShow .NETライブラリ( http://sourceforge.jp/projects/sfnet_directshownet/ )を使って、
USBカメラから静止画を逐次取り込み、加工してリアルタイムで表示するアプリを作ろうとしています。

前述のライブラリのCaptureメソッドでキャプチャして表示する処理を、System.Windows.Forms.Timerで0.1秒毎に実行するプログラムを作って、うまくいったように見えたのですが、
USBカメラによっては、一秒間に3回しか処理できず、しかも、その間ウィンドウの操作が固まってしまうことが判明しました。

調べてみると、前述のライブラリのCaptureメソッドの中にあるm_VidControl.SetMode(...)の実行に300ミリ秒前後かかっていました。

そこで、カメラから静止画を取得する処理をSystem.Threading.timerを使って動かそうと思ったのですが、今度は、m_VidControl.SetMode(...)がInvalidCastException例外を発生するようになってしまいました。
この例 http://stackoverflow.com/questions/6403533/calling-a-function-in-another-thread-c-sharp と同じ現象で、マルチスレッドでは利用できないというようなことのようなのですが・・・

カメラから画像を取り込んでリアルタイムに処理するようなアプリは最近色々見かけると思うのですが、どのように実装すればよいのでしょうか?