15

過去2日間、C#を使用してWebカメラから画像をキャプチャする方法を探していました。私はc#の初心者で、外部のサードパーティライブラリを使用したくないので、2つの優れた方法を見つけましたが、どちらもほぼ同じエラーを返すようです。どれも動作させることができなかったので、そのうちの1つを実行するのを手伝ってくれるか、別の方法を見つけるのを手伝っていただければ幸いです。

したがって、私が最初に見つけた方法は、WindowsWIAを使用することです。私は次のコードを見つけました:

CommonDialogClass dialog = new CommonDialogClass();
Device camera = dialog.ShowSelectDevice(WiaDeviceType.CameraDeviceType, true, false);
        // take the photo 
Item item = camera.ExecuteCommand(CommandID.wiaCommandTakePicture);
ImageFile image = (ImageFile)item.Transfer(FormatID.wiaFormatJPEG);
        // filename and saving 
image.SaveFile("Test.jpg");

このコードは私が探しているものとまったく同じように見えますが、2行目に次のエラーが発生しているため、実行できません。

Exception from HRESULT: 0x80210015

私が見つけた2番目の方法は、次のサンプルでAvicap32.dllを使用することです。

http://www.timvw.be/wp-content/code/csharp/testavicap32.zip

しかし、私はこのコードに乗っています:

Image image = ((CaptureDevice)cboDevices.SelectedItem).Capture();
image.Save(@"c:\capture.png", ImageFormat.Png);

次の例外:NullReferenceException:オブジェクト参照がオブジェクトのインスタンスに設定されていません。

どちらの解決策も私のカメラが見つからないために問題を引き起こしていると思いますが、Skypeで問題なくカメラを使用できます。

4

3 に答える 3

19

複数のアプローチを試しましたが、最も簡単なアプローチは Emgu.cv(nuget パッケージ) でした。

        VideoCapture capture = new VideoCapture(); //create a camera capture
        Bitmap image = capture.QueryFrame().Bitmap; //take a picture

それだけです (API バージョン 3.3.0 以降)

古い API アプローチ

        Capture capture = new Capture(); //create a camera captue
        Bitmap image = capture.QueryFrame().Bitmap; //take a picture
于 2016-08-24T19:13:20.917 に答える
11
  • WIAは静止画用であり、一種の「スキャナーで動作するAPI」です。0x80210015WIA_S_NO_DEVICE_AVAILABLE
  • AVICAP32API名は「VideoforWindows」で、実際には非推奨で廃止されています。うまくいく可能性があります(互換性はまだここにあります)が、どこにも行かない可能性が高いです。

Webカメラで動作するAPIは次のとおりです。

  • DirectShow
  • Media Foundation

どちらもネイティブAPIであり、C#コードから直接インターフェースするのは難しいかもしれませんが、DirectShow.NET(特に)とMedia Foundation.NETでは、マネージコードのラッパーがあります。DirectShow.NETの使用について詳しくは、以下をご覧ください。

于 2013-02-03T22:19:22.490 に答える
1

Aforge.net フレームワークをお勧めします。

サンプル プロジェクト:スナップショット メーカーの例で使用されているvideoCaptureDevice クラスを実装して、画像キャプチャ ダイアログをすばやく作成することができました。DirectShow ライブラリよりも少し遅い - DirectShow ライブラリを使用して、PictureBox またはパネルに Web カメラのライブ画像を表​​示せずに画像をキャプチャする方法ですが、安定しており、サポートされているデバイスからビデオと画像の解像度を設定するための簡単な方法です。

私が遭遇した唯一の問題は、VideoCaptureDevice.SimulateTrigger() が bacjground スレッドを使用してビデオ フィードから画像を作成し、イベントで画像を返すことです。返された画像を UI スレッドの winform コントロールに配置する場合、クロス スレッドの問題を防ぐためにメソッドを委任する必要があります。

Aforge.net ソースSVN リンクからスナップショット メーカー プロジェクトのソースを取得します。

于 2014-12-31T21:23:36.853 に答える