web-dev-qa-db-ja.com

C#でのWebカメラの使用

Webカメラに接続して画像操作を行うプログラムをC#で作成しています。 win32 api(avicap32.dll)を使用してWebカメラに接続し、メッセージを送信してクリップボードに送信するアプリケーションが動作しています。問題は、Paintからはアクセス可能ですが、プログラムから読み取るとnullポインタが生成されることです。

これは私がウェブカメラを接続するために使用するコードです:

mCapHwnd = capCreateCaptureWindowA("WebCap", 0, 0, 0, 320, 240, 1024, 0);

SendMessage(mCapHwnd, WM_CAP_CONNECT, 0, 0);
SendMessage(mCapHwnd, WM_CAP_SET_PREVIEW, 0, 0);

そして、これは私が画像をクリップボードにコピーするために使用するものです:

SendMessage(mCapHwnd, WM_CAP_GET_FRAME, 0, 0);

SendMessage(mCapHwnd, WM_CAP_COPY, 0, 0);
tempObj = Clipboard.GetDataObject();
tempImg = (System.Drawing.Bitmap)tempObj.GetData(System.Windows.Forms.DataFormats.Bitmap);

コードを短くするためにコードから削除したエラーチェックがいくつかあります。

前もって感謝します :)

22
Elva

最近、この分野で趣味の仕事を始めました。

OpenCV ライブラリを opencvdotnet ラッパーとともに使用することにしました。 Webカメラからのフレームのキャプチャをサポートしています。

using (var cv = new OpenCVDotNet.CVCapture(0))
{
    var image = cv.CreateCompatibleImage();
    // ...
    cv.Release();
}

また、画像操作を行っている場合、OpenCVの画像処理アルゴリズムはOpenCVDotNet.Algsアセンブリ内にラップされています。

このルートを使用する場合は、必ずOpenCVバージョン1.0をインストールしてください(Vista 64ビットを使用している場合は「c:\ programfiles\opencv」にインストールするか、「mklink OpenCV'c:\ program files(x86)」にインストールしてください)正しいディレクトリからの\ OpenCV` "を指定しないと、opencvdotnetがインストールされません)。

17
cfeduke

カメラデータをアプリケーションに取り込むには、DirectShowとWIAの2つの方法があります。マイクロソフトでは、 [〜#〜] wia [〜#〜] を使用することをお勧めします。また、WIAのインターフェイスは、頭を包み込むのに非常に簡単です。しばらく前に行った作業に基づいて、オープンソースを作成して公開しました WIAデスクトップライブラリ

WIAの問題は、単純すぎることです。たとえば、カメラのプロパティ(フレームレート、解像度など)を調整する場合、WIAは機能しなくなります。 MicrosoftはDirectShowを非推奨にしましたが、すべての機能を備えた代替品は実際には提供されませんでした。既存のすべてのプラットフォームで引き続き正常に機能することがわかりました(非常に定着しているため、サポートがなくなることは想像できません。近いうちに)。

非常に良いものがあります SourceForgeのDirectShowライブラリ 。それに関する唯一の「問題」は、それが本当に複雑であり、それは、DShowがそもそも非常に複雑で混乱しているという事実に起因しています。ラッパーが実行できることはたくさんありますが、簡単に解決することはできませんが、ビデオの表示やフレームのキャプチャなど、多くの一般的な使用例のサンプルを提供します。オーバーレイを追加したり、他のフィルターを挿入したりする場合は、それを行うことができますが、それはまったく簡単ではないことに注意してください。

7
ctacke

この記事を見てください: http://www.codeproject.com/KB/miscctrl/webcam_c_sharp.aspx

OpenCVNetWrapperをインストールして使用するよりも簡単すぎます。

2
nikib3ro

これは C#でWebカメラ画像を取得する方法? でも質問され、次のことが役立つ場合があります(スパムについては申し訳ありませんが、これは質問への回答に役立ちます)。

WindowsアプリCamTimer(.NET/C#で記述)の完全なソースコードをリリースしました。 https://github.com/johanssonrobotics/CamTimer で完全なコードをダウンロード/表示します(実際のWebカメラの例を含む)

ハッピーコーディング!

0

Clipboard.GetImage()を試しましたか?さまざまなClipboard.Contains *()メソッドを試して、データがクリップボードに保存されている形式を確認することもできます。

0
Rob Prouse

OpenCVキャプチャ、EMGUキャプチャ、および私が試した他のすべてのキャプチャライブラリ
すべて同じ問題があります:プログラムで640x480より高くすることはできません
(Windowsビデオソースウィンドウを開かずに)。

私はこれを使用することをお勧めします(これは機能します):
https://github.com/ofTheo/videoInput

0
Shachar Weis