質問

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

これはウェブカメラの接続に使用するコードです。

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);

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

前もって感謝します :)

役に立ちましたか?

解決

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

OpenCV ライブラリと opencvdotnet ラッパー。ウェブカメラからのフレームのキャプチャをサポートしています:

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

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

このルートを選択する場合は、必ずOpenCVバージョン1.0をインストールしてください(Vista 64ビットの場合は" c:\ program files \ opencv"に、または" mklink OpenCV 'c:\にインストールしてください)プログラムファイル(x86)\ OpenCV`"が正しいディレクトリにない場合、opencvdotnetはインストールされません)。

他のヒント

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

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

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

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

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

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

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

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

これは、 C#でWebカム画像を取得する方法でも尋ねられました。 次の情報が役立つ場合があります(スパム送信については申し訳ありませんが、これは本当に質問への回答に役立ちます):

WindowsアプリCamTimer(.NET / C#で記述)の完全なソースコードをリリースしました。 https://github.com/johanssonrobotics/CamTimer < a>

ハッピーコーディング!

scroll top