web-dev-qa-db-ja.com

Webカメラから画像をキャプチャするC#

過去2日間、C#を使用してWebカメラから画像をキャプチャする方法を探していました。私はc#でかなり新しく、外部のサードパーティのライブラリを使用したくないので、2つの素敵な方法を見つけましたが、どちらもほぼ同じエラーを返すようです。私は彼らを働かせることができなかったので、あなたが彼らの1人を走らせるのを手伝うか、私が代わりを見つけるのを手伝ってくれたら本当に素晴らしいでしょう。

だから私が見つけた最初の方法は、Windows WIAを使用することです。私は次のコードを見つけました:

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:オブジェクト参照がオブジェクトのインスタンスに設定されていません。

カメラが見つからないため、両方のソリューションが問題を引き起こしていると思いますが、スカイプでカメラを問題なく使用できます。

10
Viktor Kirilov

複数のアプローチを試しましたが、私にとって最も簡単なアプローチはEmgu.cv(nuget package)でした。

        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
12
Ashitakalax
  • WIAは静止画用で、一種の「スキャナーで動作するAPI」です。 0x80210015WIA_S_NO_DEVICE_AVAILABLE
  • AVICAP32 API名は「Video for Windows」であり、これは実際には非推奨で廃止されており、うまくいくかもしれません(互換性はまだここにあります)が、どこにも行かない可能性が高い

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

  • DirectShow
  • メディア財団

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

11
Roman R.

Aforge.net framework をお勧めします。

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

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

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

1
Gary Kindel