从HighGUI的一段代码中看OpenCV打开视频的方式

简介: OpenCV的HighGUI提供了视频和摄像头的直接打开。那么它是如何实现的了?这里进行初步分析。  /** * Videoreader dispatching method: it tries to find the first * API that can access a given filename.
 
OpenCV的HighGUI提供了视频和摄像头的直接打开。那么它是如何实现的了?这里进行初步分析。
 
 
/**
 * Videoreader dispatching method: it tries to find the first
 * API that can access a given filename.
 */

CV_IMPL CvCapture * cvCreateFileCaptureWithPreference ( const char * filename, int apiPreference)
{
    CvCapture * result = 0;
    switch(apiPreference) {
    default :
        // user specified an API we do not know
        // bail out to let the user know that it is not available
        if (apiPreference) break;
# ifdef HAVE_FFMPEG
    case CV_CAP_FFMPEG :
        TRY_OPEN(result, cvCreateFileCapture_FFMPEG_proxy (filename))
        if (apiPreference) break;
# endif
    case CV_CAP_VFW :
# ifdef HAVE_VFW
        TRY_OPEN(result, cvCreateFileCapture_VFW (filename))
# endif
# if defined HAVE_LIBV4L || defined HAVE_CAMV4L || defined HAVE_CAMV4L2 || defined HAVE_VIDEOIO
        TRY_OPEN(result, cvCreateCameraCapture_V4L(filename))
# endif
        if (apiPreference) break;
    case CV_CAP_MSMF :
# ifdef HAVE_MSMF
        TRY_OPEN(result, cvCreateFileCapture_MSMF (filename))
# endif
# ifdef HAVE_XINE
        TRY_OPEN(result, cvCreateFileCapture_XINE (filename))
# endif
        if (apiPreference) break;
# ifdef HAVE_GSTREAMER
    case CV_CAP_GSTREAMER :
        TRY_OPEN(result, cvCreateCapture_GStreamer (CV_CAP_GSTREAMER_FILE, filename))
        if (apiPreference) break;
# endif
# if defined(HAVE_QUICKTIME) || defined(HAVE_QTKIT)
    case CV_CAP_QT :
        TRY_OPEN(result, cvCreateFileCapture_QT (filename))
        if (apiPreference) break;
# endif
# ifdef HAVE_AVFOUNDATION
    case CV_CAP_AVFOUNDATION :
        TRY_OPEN(result, cvCreateFileCapture_AVFoundation (filename))
        if (apiPreference) break;
# endif
# ifdef HAVE_OPENNI
    case CV_CAP_OPENNI :
        TRY_OPEN(result, cvCreateFileCapture_OpenNI (filename))
        if (apiPreference) break;
# endif
# ifdef HAVE_OPENNI2
    case CV_CAP_OPENNI2 :
        TRY_OPEN(result, cvCreateFileCapture_OpenNI2 (filename))
        if (apiPreference) break;
# endif
    case CV_CAP_IMAGES :
        TRY_OPEN(result, cvCreateFileCapture_Images (filename))
    }
    return result;
}
 
具体跟入源代码中的 cvCreateFileCaptureWithPreference   函数。可以看到,它提供了这些选项(qt那个除外)
 
HAVE_FFMPEG
CV_CAP_VFW
HAVE_MSMF
HAVE_XINE
HAVE_GSTREAMER
HAVE_AVFOUNDATION
HAVE_OPENNI
CV_CAP_IMAGES
 
 
那么他们分别都是些什么东西了?
 
FFmpeg是一套可以用来记录、转换数字音频、视频,并能将其转化为流的开源计算机程序。采用LGPL或GPL许可证。它提供了录制、转换以及流化音视频的完整解决方案。它包含了非常先进的音频/视频编解码库libavcodec,为了保证高可移植性和编解码质量,libavcodec里很多code都是从头开发的。
 
VFW(Video for Windows)是Microsoft推出的关于数字视频的一个软件开发包,VFW的核心是AVI文件标准。AVI(Audio Video Interleave)文件中的音、视频 数据帧 交错存放。

xine is a free 

multimedia player. It plays back CDs, DVDs, and VCDs.

It also decodes multimedia files like AVI, MOV, WMV, and MP3 from local disk
drives, and displays multimedia streamed over the Internet.
It interprets many of the most common multimedia formats available – and some
of the most uncommon formats, too.

 GStreamer 是用来构建流媒体应用的 开源 多媒体框架 (framework),其目标是要简化音/视频应用程序的开发,目前已经能够被用来处理像 MP3、Ogg、MPEG1、MPEG2、AVI、Quicktime 等多种格式的多媒体数据。
 
AVFoundation是一个OC媒体数据的高级框架。AVFoundation的构建考虑到了目前的硬件环境和应用程序,其设计过程高度依赖多线程机制。充分利用了多核硬件的优势并大量使用block和GCD机制,将复杂的计算机进程放到了后台线程运行。会自动提供硬件加速操作,确保在大部分设备上应用程序能以最佳性能运行。该框架就是针对64位处理器设计的,可以发挥64位处理器的所有优势。
 
 
 OpenNI(开放自然交互)是一个多语言,跨平台的框架,它定义了编写应用程序,并利用其自然交互的API。OpenNI API由一组可用来编写通用自然 交互应用 的接口组成。OpenNI的主要目的是要形成一个标准的API,来搭建视觉和音频传感器与视觉和音频感知中间件通信的桥梁。
 
 
可以看到,OpenCV对于多平台支持,提供了不同的基础库。我认为,在windows下,应该选择的就是
 
VFW了。那么一般意义上认为VFW是比较老旧的技术了,在实际开发的时候,能感到一些性能的不足。
 
感谢阅读至此,希望有所收获。
 



目前方向:图像拼接融合、图像识别 联系方式:jsxyhelu@foxmail.com
目录
相关文章
|
3月前
|
计算机视觉
Opencv学习笔记(八):如何通过cv2读取视频和摄像头来进行人脸检测(jetson nano)
如何使用OpenCV库通过cv2模块读取视频和摄像头进行人脸检测,并提供了相应的代码示例。
143 1
|
7月前
|
算法 开发工具 计算机视觉
【零代码研发】OpenCV实验大师工作流引擎C++ SDK演示
【零代码研发】OpenCV实验大师工作流引擎C++ SDK演示
101 1
|
3月前
|
编解码 关系型数据库 计算机视觉
Opencv学习笔记(十一):opencv通过mp4保存为H.264视频
本文介绍了如何在OpenCV中通过使用cisco开源的openh264库来解决不支持H.264编码的问题,并提供了完整的代码示例。
211 0
Opencv学习笔记(十一):opencv通过mp4保存为H.264视频
|
5月前
|
算法 计算机视觉 Python
python利用opencv进行相机标定获取参数,并根据畸变参数修正图像附有全部代码(流畅无痛版)
该文章详细介绍了使用Python和OpenCV进行相机标定以获取畸变参数,并提供了修正图像畸变的全部代码,包括生成棋盘图、拍摄标定图像、标定过程和畸变矫正等步骤。
python利用opencv进行相机标定获取参数,并根据畸变参数修正图像附有全部代码(流畅无痛版)
|
5月前
|
计算机视觉 索引
OpenCV读取视频失败<无可用信息,未为 opencv_world453.dll 加载任何符号> cv::VideoCapture
本文介绍了解决OpenCV读取视频失败的错误,指出问题通常由视频路径错误或摄像头索引错误导致,并提供了相应的解决方法。
OpenCV读取视频失败<无可用信息,未为 opencv_world453.dll 加载任何符号> cv::VideoCapture
|
5月前
|
计算机视觉 Python
opencv在pycharm不能自动补全代码
opencv在pycharm不能自动补全代码
48 0
|
6月前
|
机器学习/深度学习 XML 计算机视觉
OpenCV(Open Source Computer Vision Library)是一个开源的计算机视觉和机器学习库,它提供了大量的函数和工具,用于处理图像和视频数据。
OpenCV(Open Source Computer Vision Library)是一个开源的计算机视觉和机器学习库,它提供了大量的函数和工具,用于处理图像和视频数据。
|
7月前
|
计算机视觉
OpenCV加载视频
OpenCV加载视频
|
7月前
|
监控 安全 计算机视觉
实战 | 18行代码轻松实现人脸实时检测【附完整代码与源码详解】Opencv、人脸检测
实战 | 18行代码轻松实现人脸实时检测【附完整代码与源码详解】Opencv、人脸检测
|
7月前
|
并行计算 IDE 开发工具
【竹篮打水】OpenCV4.x 中新增并行代码执行演示
【竹篮打水】OpenCV4.x 中新增并行代码执行演示
68 0