另请参见
概况
OpenCV 视频 I/O 模块是一组用于读写视频或图像序列的类和函数。
基本上,该模块提供了 cv::VideoCapture 和 cv::VideoWriter 类作为许多视频 I/O API 的 2 层接口,用作后端。
一些后端,如 Direct Show (DSHOW)、Microsoft Media Foundation (MSMF)、Video 4 Linux (V4L) 等,是操作系统提供的视频 I/O 库接口。
其他一些后端,如用于 Kinect 的 OpenNI2、Intel Perceptual Computing SDK、GStreamer、XIMEA Camera API 等,则是专有驱动程序或外部库的接口。
点击此处查看支持的后端列表:cv::VideoCaptureAPIs
警告
某些后端是试验性的,请自行承担使用风险
注意事项
每个后端支持设备属性(cv::VideoCaptureProperties)的方式不同,也可能完全不支持任何属性。
运行时选择后端
OpenCV 会自动选择并使用第一个可用的后端(apiPreference=cv::CAP_ANY
)。
作为高级用法,您可以在运行时选择要使用的后端。
例如,使用 Microsoft Media Foundation (MSMF) 作为后端从默认摄像机抓取数据
//声明捕获对象
cv::VideoCapture cap(0, cv::CAP_MSMF);
//或使用 open 指定 apiPreference
cap.open(0, cv::CAP_MSMF);
如果要使用 Microsoft Media Foundation (MSMF) 作为后端从文件中抓取:
//声明捕获对象
cv::VideoCapture cap(filename, cv::CAP_MSMF);
//或使用 open 指定 apiPreference
cap.open(filename, cv::CAP_MSMF);
另请参见
cv::VideoCapture::open() , cv::VideoCapture::VideoCapture()
如何启用后端
videoio 后端有两种:内置后端和运行时加载的插件(自 OpenCV 4.1.0 起)。使用函数 cv::videoio_registry::getBackends、cv::videoio_registry::hasBackend 和 cv::videoio_registry::getBackendName 可在运行时检查后端是否实际存在。
启用内置 videoio 后端:
- 启用相应的 CMake 选项,例如
-DWITH_GSTREAMER=ON
- 重建 OpenCV
要启用动态加载的视频后端(目前支持 Linux 上的 GStreamer 和 FFmpeg,Linux 和 Windows 上的 MediaSDK):
- 启用后端并将其添加到插件列表中:
-DWITH_GSTREAMER=ON -DVIDEOIO_PLUGIN_LIST=gstreamer
CMake 选项 - 重建 OpenCV
- 检查
lib
目录中是否存在libopencv_videoio_gstreamer.so
库
注意事项
在这两种模式之间切换时不要忘记清理 CMake 缓存
使用第三方驱动程序或摄像机
许多工业相机或某些视频 I/O 设备不为操作系统提供标准驱动程序接口。因此,您无法在这些设备上使用 VideoCapture 或 VideoWriter。
为了访问这些设备,制造商提供了自己的 C++ API 和库,您必须将其包含并链接到 OpenCV 应用程序中。
通常情况下,这些库会从内存缓冲区读/写图像。如果是这样,可以为内存缓冲区(用户分配的数据)创建 Mat
头文件,并使用 OpenCV 函数就地处理。详情请参见 cv::Mat::Mat()。
FFmpeg 库
OpenCV 可以使用 FFmpeg 库 (http://ffmpeg.org/) 作为后端来录制、转换和流式传输音频和视频。FFmpeg 是一个完整的交叉引用解决方案。如果在配置 OpenCV 时启用 FFmpeg,CMake 将下载并安装 OPENCV_SOURCE_CODE/3rdparty/ffmpeg/
中的二进制文件。要在运行时使用 FFmpeg,必须将 FFmpeg 二进制文件与应用程序一起部署。
注意事项
FFmpeg 采用 GNU 宽通用公共许可证 (LGPL) 2.1 或更高版本。有关详细信息和许可信息,请参阅
OPENCV_SOURCE_CODE/3rdparty/ffmpeg/readme.txt
和
http://ffmpeg.org/legal.html。