過去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:オブジェクト参照がオブジェクトのインスタンスに設定されていません。
カメラが見つからないため、両方のソリューションが問題を引き起こしていると思いますが、スカイプでカメラを問題なく使用できます。
複数のアプローチを試しましたが、私にとって最も簡単なアプローチは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
0x80210015
は WIA_S_NO_DEVICE_AVAILABLE
Webカメラで動作するAPIは次のとおりです。
どちらもネイティブAPIであり、C#コードから直接インターフェイスするのは難しいかもしれませんが、 DirectShow.NET (特に)およびMedia Foundation.NETを使用すると、マネージコードのラッパーがあります。 DirectShow.NETの使用に関する詳細については、こちらをご覧ください。
Aforge.net framework をお勧めします。
サンプルプロジェクトで使用される videoCaptureDeviceクラス を実装できました: Snapshot Makerの例 画像キャプチャダイアログをすばやく作成します。 DirectShow Library-PictureBoxまたはPanelにWebカメラのライブ画像を表示せずにdirectshowライブラリを使用して画像をキャプチャする方法 より遅いですが、安定しており、ビデオおよび画像の解像度を簡単に設定できますサポートされているデバイス。
私が遭遇した唯一の問題は、VideoCaptureDevice.SimulateTrigger()がbacjgroundスレッドを使用してビデオフィードから画像を作成し、イベントで画像を返すことです。返された画像をUIスレッドのwinformコントロールに配置する場合、スレッド間の問題を防ぐためにメソッドを委任する必要があります。
Aforge.netソースからスナップショットメーカープロジェクトからソースを取得します SVNリンク 。