C++ OpenCV:视频读写程序与帧处理详解

1星 需积分: 35 9 下载量 170 浏览量 更新于2024-09-11 1 收藏 17KB DOCX 举报
本篇C++代码示例展示了如何利用OpenCV库实现视频的读取和写入功能。OpenCV是一个广泛应用于计算机视觉领域的开源库,提供丰富的图像处理和计算机视觉算法。在这个程序中,主要关注以下几个关键知识点: 1. **C++编程基础**: - 代码首先包含了必要的头文件,如`#include <opencv2/opencv.hpp>`,这表明了对OpenCV库的依赖,包括`cv.h`、`cxcore.h` 和 `highgui.h`,这些头文件提供了图像处理和视频操作的基础结构。 2. **枚举类型**: - 定义了两个枚举类型`CaptureCase`和`PlayVideoCase`,分别表示视频的来源(摄像头或视频文件)和播放模式(逐帧或按索引)。这有助于简化代码逻辑和提高可读性。 3. **函数定义**: - `int FrameByFrame()` 和 `int FrameByIndex()` 分别实现了逐帧读取和按照指定索引读取视频的功能。这两个函数接收`CvVideoWriter`指针(用于写入视频)、`IplImage`指针(图像数据容器)、一个布尔值(决定是否保存视频)、`CvCapture`指针(用于捕获视频帧)以及参数用于控制视频文件路径和等待时间。 4. **主函数`tmain()`**: - 这是程序的入口点,初始化了一些全局变量,如`bSave`(保存视频标志)、`cap_case`和`play_case`,以及设置`nWaitKeyTime`为图像显示的间隔时间。 - 创建`CvCapture`对象,并指定要读取的视频文件路径(`szVideoFileName`)。 - 如果`play_case`为`FRAME_BY_INDEX`,还会调用`strSaveImagePath`来保存视频文件。 5. **视频操作**: - 通过`cvQueryFrame()`函数从`CvCapture`对象中读取视频帧,并根据`play_case`模式进行处理。如果是逐帧播放,将帧显示出来并等待用户按键;如果保存视频,使用`CvVideoWriter`将帧写入到指定的文件。 这段代码演示了如何使用C++结合OpenCV处理视频流,涉及到了视频捕获、图像显示、文件操作和基本的视频编码等技术。对于学习C++编程和OpenCV库的开发者来说,这是一个实用且基础的示例。通过这个程序,可以理解视频读写的基本流程,以及如何在C++环境中操作图像数据。
2014-07-14 上传
#include "stdafx.h" #include"highgui.h" int main(int argc,char* argv[]) { cvNamedWindow( "avi"); CvCapture* capture = cvCreateFileCapture( "D:\\sample.avi"); IplImage* frame; while(1) { frame = cvQueryFrame(capture); if(!frame) break ; cvShowImage( "avi",frame); char c = cvWaitKey(33); if(c == 27) break; } cvReleaseCapture(&capture); cvDestroyWindow( "avi"); return 0; } 结构体 CvCapture CvCapture 是一个结构体,用来保存图像捕获所需要的信息。 opencv提供两种方式从外部捕获图像: 一种是从摄像头中, 一种是通过解码视频得到图像。 两种方式都必须从第一帧开始一帧一帧的按顺序获取,因此每获取一帧后都要保存相应的状态和参数。 比如从视频文件中获取,需要保存视频文件的文件名,相应的解码器类型,下一次如果要 获取将需要解码哪一帧等。 这些信息都保存在CvCapture结构中,每获取一帧后,这些信息 都将被更新,获取下一帧需要将新信息传给获取的 api接口 cvCreateFileCapture(char*name) 通过输入要读取的avi文件的路径,然后,该函数返回一个指向 CvCapture结构体的指针。 cvQueryFrame(capture) 输入一个CvCapture 类型的指针,该函数主要功能是将视频文件的下一帧加载到内存。与 cvLoadImage的不同之处是,该函数不重新分配内存空间。 C=cvWaitKey(33) 当前帧被显示后,等待 33毫秒。如果用户触发了一个按键, c会被设置成这个按键的 ASCII码,否则会被设置成 -1。 cvWaitKey(33) 在此处的另外一个作用是,控制帧率。 cvReleaseCapture(&capture) 释放为 CvCapture结构体开辟的内存空间 关闭打开的 AVI文件相关的文件句柄 读取摄像头 只需把 cvCreateFileCapture 改成cvCreateCameraCapture即可。 该函数的输入参数是一个 ID号,只有存在多个摄像头时才起作用。当 ID=-1时,表示 随机选择一个。 HighGUI做了很多工作,使得摄像机图像序列像一个视频文件一样。 cvCreateFileCapture返回空的问题 ( 1)视频文件路径没写对( 2)没有安装解码器( 3)如果使用的是 Opencv2.0或更高版本,那么,能否正确加载 opencv_ffmpeg210.dll( 4)尽管是 AVI文件,但也可能使用了某种 codec,例如 :MJPEG Decompressor。 需要把它转换 OpenCV支持的 AVI文件 . OpenCV支持的AVI。例如使用狸窝全能视频转换器,在《预置方案》处,选择 AVI-Audio_Video Interleaved(*.avi)。或者使用格式工厂也可以。( 5)读摄像头数据,需要安装与摄像头相应的驱动程序。