我正在开发一个 C++ 应用程序,它应该使用 USB 相机来捕捉高分辨率照片。它应该与 Windows 10 中的相机应用程序具有相同的行为。我正在尝试使用 DirectShow 来执行此操作。现在我只能拍摄延迟的高分辨率照片或及时但低分辨率的照片。此外,我对 MS 文档感到非常困惑,很多东西都被弃用了,也没有提到替代它们的东西。我将描述我绝望的步骤,等待有人能够告诉我一条路。
让我们从头开始...
我从搜索合适的库开始,对 Window 中的视频捕获一无所知。经过一番谷歌搜索后,我发现有四个主要的库用于在 Windows 中捕获视频。
- 适用于 Windows 的视频
- 直接秀
- 视窗媒体基金会
- 开放式CV
让我们观察:
Video for Windows
不幸的是,这个库被标记为已弃用,但它似乎仍然有效。我写了“不幸的是”,因为我认为这是唯一易于使用的。从摄像头查看视频只需要几行代码。我在这里唯一想念的是“TakePhoto”功能。您可以使用 VFW 将视频或单帧捕获到 avi 文件。还是我错过了什么?DirectShow
这是一个复杂得多的库。您需要数百行代码才能看到视频预览。但是您可以在 MS Docs 上获得此代码。好的,现在我有一个视频预览,我只需要拍照。人们会期望这应该只是一个函数调用。但是功能在哪里?我没有找到它。
您可以简单地使用GetCurrentImage
from ,IVMRWindowlessControl
但这仅需要从低分辨率预览中提取一帧。如果您为预览设置更高的分辨率,则视频不流畅。
我可以实现的最佳方法来自一篇名为“从静止图像引脚捕获图像”的文章,可在此处https://docs.microsoft.com/en-us/windows/desktop/directshow/capturing-an-image-from-静止图像针。当我找到这个网站时,我以为我赢了,我的任务也快完成了。但事实并非如此。
本文给您的第一个建议是不要使用它:“从设备获取静止图像的推荐方法是使用 Windows Image Acquisition (WIA) API。有关更多信息,请参阅平台中的“Windows Image Acquisition” 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 的头文件。(顺便说一句,这是一个近十年前的建议。)在我用这个标题编译应用程序后,我能够阅读高分辨率图片,但我需要等待几秒钟,这是不可接受的。我知道问题不在相机中,因为它在相机应用程序中有效。此外,图像是在函数中获得的,SampleCB
而不是BufferCB
在某种奇怪的格式中。我可以将其保存为 jpg,但压缩得不够。
Windows Media Foundation
我认为 MS 不喜欢程序员,这就是它发布 WMF 的原因。我完全不懂。我找到了本教程https://www.dreamincode.net/forums/topic/347938-a-new-webcam-api-tutorial-in-c-for-windows/。它可以工作,但它只存储预览中的一帧,这不是我想要的。
接下来我在 MS Docs 上探索了一些 WMF 接口。IMFCapturePhotoSink 接口应该做的事情。但是如何实现它。文档没用。OpenCV
在我的研究过程中,我还发现了这个库。但同样我无法拍摄高分辨率照片。它只存储预览中的一帧。
有人能告诉我我应该关注什么吗?我相信这不会那么困难。网络摄像头有成千上万的应用程序。其他程序员如何实现它们?我怎么了?我想找到一种简单的方法来实现一项简单的任务。非常感谢您的帮助。