USB カメラを使用して高解像度の写真をキャプチャする C++ アプリケーションを開発しています。Windows 10 のカメラ アプリケーションと同じ動作をする必要があります。そのために DirectShow を使用しようとしています。現在、高解像度の写真を撮ることができますが、それは遅れているか、時間内に写真を撮ることができますが、解像度は低くなります。また、私はMSのドキュメントから非常に混乱しています。多くのことが非推奨であり、それらを置き換えるものについてはどこにも言及されていません。方法を教えてくれる人が現れるのを待っている私の絶望的な歩みについて説明します。
最初から始めましょう...
Windowでのビデオキャプチャについて何も知らなかったので、適切なライブラリを検索することから始めました。グーグルで調べた結果、Windows でビデオをキャプチャするための 4 つの主要なライブラリがあることがわかりました。
- Windows 用のビデオ
- DirectShow
- ウィンドウズ メディア ファンデーション
- OpenCV
観察しましょう:
Video for Windows
このライブラリは残念ながら非推奨としてマークされていますが、まだ機能しているようです。使いやすいのはこれだけだと思うので「残念」と書きました。カメラからビデオを見るために必要なコードは数行だけです。ここで見逃していると思うのは、「TakePhoto」機能だけです。VFW を使用して、ビデオまたは単一フレームを avi ファイルにキャプチャできます。または、何か不足していますか?DirectShow
これはもっと複雑なライブラリです。ビデオ プレビューを表示するには、数百行のコードが必要です。ただし、このコードは MS Docs で入手できます。さて、これでビデオ プレビューができたので、あとは写真を撮るだけです。これはただ 1 つの関数呼び出しであると予想されます。しかし、機能はどこにありますか?見つかりませんでした。
単純にGetCurrentImage
fromを使用できますIVMRWindowlessControl
が、これは低解像度でプレビューから 1 フレームしか取得しません。プレビュー用により高い解像度を設定すると、ビデオは流暢ではなくなります。
私が達成できる最善のアプローチは、https://docs.microsoft.com/en-us/windows/desktop/directshow/capturing-an-image-from-で入手できる「静止画像ピンから画像をキャプチャする」という記事からです。 a-静止画像ピン. このサイトを見つけたとき、私は勝ったと思ったし、私の仕事はほとんど終わった. しかし、そうではありませんでした。
この記事が提供する最初のアドバイスは、それを使用しないことです。 SDK ドキュメント。ただし、DirectShow を使用して画像をキャプチャすることもできます。」WIAを調べてみました。しかし、これはVistaでは機能しなくなりました。私は記事を勉強し続けました。
すべてが明確に見えますがISampleGrabberCB
、非推奨としてマークされたクラスを継承するクラスを実装する必要がありますhttps://docs.microsoft.com/en-us/windows/desktop/directshow/isamplegrabbercb。どうして????代替手段はどこにありますか?
ここで許容できる解決策を見つけましたhttps://social.msdn.microsoft.com/Forums/windowsdesktop/en-US/2ab5c212-5824-419d-b5d9-7f5db82f57cd/qedith-missing-in-current-windows-sdk-v70?forum=windowsdirectshowdevelopment . 古い SDK からヘッダー ファイルを追加する必要があります。(ところで、これはほぼ 10 年前のアドバイスです。) このヘッダーを使用してアプリケーションをコンパイルした後、高解像度の画像を読み取ることができましたが、許容できない数秒待つ必要があります。カメラアプリケーションで動作するため、問題がカメラにないことはわかっています。SampleCB
さらに、画像は代わりに関数で取得されBufferCB
、奇妙な形式になっています。jpg として保存できますが、十分に圧縮されていません。
Windows Media Foundation
MS はプログラマーを好まないので、WMF をリリースしたのだと思います。私は何もわからない。このチュートリアルを見つけましたhttps://www.dreamincode.net/forums/topic/347938-a-new-webcam-api-tutorial-in-c-for-windows/。動作しますが、プレビューから 1 フレームしか保存されず、これは私が望むものではありません。
次に、MS Docs でいくつかの WMF インターフェイスを調べました。IMFCapturePhotoSink インターフェイスが処理を行う必要があります。しかし、どのようにそれを実装します。ドキュメントは役に立たない。OpenCV
調査中に、このライブラリも見つけました。しかし、やはり高解像度の写真を撮ることができません。プレビューから 1 フレームのみを保存します。
誰かが私が何に焦点を当てるべきか教えてもらえますか? そんなに難しくないと思います。ウェブカメラ用のアプリケーションは数十から数百あります。他のプログラマーはどのようにそれらを実装できますか? 私がどうかしましたか、まずいことでもありましたか?簡単なタスクを実装する簡単な方法を見つけたいと思います。助けてくれてありがとう。