OpenCV(七)细说HighGUI(视频处理)
2016-11-17 16:15
381 查看
显示图像类似,让我们先看看处理视频相关的函数,首先用到的肯定是读写视频的文件的函数。在OpenCV中,处理视频要用到CvCapture结构。CvCapture结构包含从摄像机或视频文件读取帧所需的信息。根据视频来源,我们可以使用下面两个函数之一来初始化CvCapture结构。
CvCapture* cvCreateFileCapture (const char* filename);
CvCapture* cvCreateCameraCapture( int index);
当使用cvCreateFileCapture()时,我们只需要将MPG或者AVI视频文件名告诉cvCreateFileCapture(),OpenCV会打开并准备读取视频。如果打开成功,将返回一个指向已经初始化了的CvCapture结构的指针,随后便可以读入视频的帧。
注:检查函数的返回结果,一些情况下无法打开文件,函数会返回NULL指针;当压缩视频的编码未知时cvCreateFileCapture()也会返回NULL指针。(视频压缩编码是为了视频可以被成功的读入)。这就出现了一台机器上可以读入视频文件,换了机器后,由于可能缺少视频压缩编码库就读不了视频文件了。
从摄像机中得到图像
从摄像机中得到图像要用到函数cvCreateCameraCapture(),这个函数只有一个参数,常用的参数有两个,当只有一个摄像机的时候,参数值取0;当参数设置为-1时,OpenCV会打开一个窗口让用户选择需要的摄像机。
读视频
int cvGrabFrame( CvCapture* capture);
IplImage* cvRetrieveFrame(CvCapture* capture);
IplImage* cvQueryFrame( CvCapture* capture);
创建一个有效的CvCapture结构后,便可以开始读取视频帧。有两种方法,第一种方法是使用cvGrabFrame(),该函数是以CvCapture指针为参数,返回一个整数,当读取帧成功时返回1,否则返回0。cvGrabFrame()将视频帧复制到了一个用户不可见的内存空间里。为什么要这样那?以为获取的视频帧数据是未经处理的,cvGrabFrame()被设计为用于快速将视频帧读入内存。
在cvGrabFrame()后,可以调用cvRetrieveFrame()来处理cvGrabFrame()读入的视频数据。这个函数会对读入帧做多有必须的处理(包括图像解码操作),并且返回一个IplImage指针,改指针指向另一块内部内存空间(但是cvGrabFrame()下一次被调用时,指针多指向的空间被新的图像覆盖)。如果要特殊处理这幅图像,可以先将图像数据复制其他地方。
第二种方法,使用cvQueryFrame()函数。这个函数其实是cvGrabFrame()和cvRetrieveFrame()的一个组合。
注意:对于一个视频文件,当调用cvGrabFrame()时,视频帧会自动前进一步,所以下一次调用会自动读入下一视频。
释放CvCa结构,调用cvReleaseCapture():
void cvReleaseCapture(CvCapture * capture);
查询和设置视频的各种属性:
double cvGetCaptureProperty(
CvCapture* capture,
int property_id
);
int cvSetCaptureProperty(
CvCapture* capture,
int property_id,
double value
);
写视频
写视频必须要创建一个CvVideoWriter结构,CvVideoWriter是一个类似于CvCapture的视频写入结构。该结构与下面的函数一起使用。
CvVideoWriter* cvCreateVideoWriter(
const char* filename,
int fourcc,
double fps,
CvSize frame_size,
int is_color =1
);
int cvWriteFrame(
CvVideoWriter* writer,
const IplImage* image
);
void cvReleaseVideoWriter(
CvVideoWriter** writer
);
写入完成后,为了关闭写入结构,必须调用CvReleaseVideoWriter()函数。如果不显示的释放写入结构,视频文件可能被损坏。
补充:ConvertImage函数
此函数使用广泛,同时也是非常重要。
void cvConvertImage(
const CvArr* src,
CvArr* dst,
int flags = 0
);
cvCOnvertImage()用于在常用的不同图像格式之间转换。文件格式在src与dst图像的头文件中指出。
原图像可以是单个、3个或者4个通道,可以是8位或者浮点类型像素格式。目标图像必须是8位的单通道或者3通道。参数flags可以垂直旋转图像。
补:不能光说不做假把式,最近做个小项目,把已经学到的知识应用到实际中!
CvCapture* cvCreateFileCapture (const char* filename);
CvCapture* cvCreateCameraCapture( int index);
当使用cvCreateFileCapture()时,我们只需要将MPG或者AVI视频文件名告诉cvCreateFileCapture(),OpenCV会打开并准备读取视频。如果打开成功,将返回一个指向已经初始化了的CvCapture结构的指针,随后便可以读入视频的帧。
注:检查函数的返回结果,一些情况下无法打开文件,函数会返回NULL指针;当压缩视频的编码未知时cvCreateFileCapture()也会返回NULL指针。(视频压缩编码是为了视频可以被成功的读入)。这就出现了一台机器上可以读入视频文件,换了机器后,由于可能缺少视频压缩编码库就读不了视频文件了。
从摄像机中得到图像
从摄像机中得到图像要用到函数cvCreateCameraCapture(),这个函数只有一个参数,常用的参数有两个,当只有一个摄像机的时候,参数值取0;当参数设置为-1时,OpenCV会打开一个窗口让用户选择需要的摄像机。
读视频
int cvGrabFrame( CvCapture* capture);
IplImage* cvRetrieveFrame(CvCapture* capture);
IplImage* cvQueryFrame( CvCapture* capture);
创建一个有效的CvCapture结构后,便可以开始读取视频帧。有两种方法,第一种方法是使用cvGrabFrame(),该函数是以CvCapture指针为参数,返回一个整数,当读取帧成功时返回1,否则返回0。cvGrabFrame()将视频帧复制到了一个用户不可见的内存空间里。为什么要这样那?以为获取的视频帧数据是未经处理的,cvGrabFrame()被设计为用于快速将视频帧读入内存。
在cvGrabFrame()后,可以调用cvRetrieveFrame()来处理cvGrabFrame()读入的视频数据。这个函数会对读入帧做多有必须的处理(包括图像解码操作),并且返回一个IplImage指针,改指针指向另一块内部内存空间(但是cvGrabFrame()下一次被调用时,指针多指向的空间被新的图像覆盖)。如果要特殊处理这幅图像,可以先将图像数据复制其他地方。
第二种方法,使用cvQueryFrame()函数。这个函数其实是cvGrabFrame()和cvRetrieveFrame()的一个组合。
注意:对于一个视频文件,当调用cvGrabFrame()时,视频帧会自动前进一步,所以下一次调用会自动读入下一视频。
释放CvCa结构,调用cvReleaseCapture():
void cvReleaseCapture(CvCapture * capture);
查询和设置视频的各种属性:
double cvGetCaptureProperty(
CvCapture* capture,
int property_id
);
int cvSetCaptureProperty(
CvCapture* capture,
int property_id,
double value
);
写视频
写视频必须要创建一个CvVideoWriter结构,CvVideoWriter是一个类似于CvCapture的视频写入结构。该结构与下面的函数一起使用。
CvVideoWriter* cvCreateVideoWriter(
const char* filename,
int fourcc,
double fps,
CvSize frame_size,
int is_color =1
);
int cvWriteFrame(
CvVideoWriter* writer,
const IplImage* image
);
void cvReleaseVideoWriter(
CvVideoWriter** writer
);
写入完成后,为了关闭写入结构,必须调用CvReleaseVideoWriter()函数。如果不显示的释放写入结构,视频文件可能被损坏。
补充:ConvertImage函数
此函数使用广泛,同时也是非常重要。
void cvConvertImage(
const CvArr* src,
CvArr* dst,
int flags = 0
);
cvCOnvertImage()用于在常用的不同图像格式之间转换。文件格式在src与dst图像的头文件中指出。
原图像可以是单个、3个或者4个通道,可以是8位或者浮点类型像素格式。目标图像必须是8位的单通道或者3通道。参数flags可以垂直旋转图像。
补:不能光说不做假把式,最近做个小项目,把已经学到的知识应用到实际中!
相关文章推荐
- OpenCV--HighGUI视频读写和显示
- OPENCV(1)图片,视频读入,输出(highgui)
- OpenCV之highgui 模块. 高层GUI和媒体I/O: 为程序界面添加滑动条 OpenCV的视频输入和相似度测量 用OpenCV创建视频
- opencv c++函数 highgui模块 2 OpenCV的视频输入和相似度测量
- OpenCV(六)细说HighGUI(创建窗口,载入图像,显示图像)
- opencv error opening file(../.../modules/highgui/src/acp_ffmpeg_impl.hpp:545)(视频路径...)
- OpenCV学习笔记08--细说HighGUI
- opencv4-highgui之视频的输入和输出以及滚动条
- OpenCv学习笔记(八)---细说HighGUI(图像用户界面)之滑动条createTrackbar()详解
- Opencv—第四章细说highgui课后练习4-1
- opencv4-highgui之视频的输入和输出以及滚动条
- OpenCV做视频处理用到的几个函数
- openCV 视频平滑处理 小程序
- HighGUI视频读写函数
- Opencv--High-level GUI使用介绍
- opencv视频处理范例
- opencv视频处理整理
- opencv处理视频颠倒问题
- 实现OpenCV的视频图像处理
- 【Ubuntu+OpenCV】HighGUI之trackbar充当开关按钮--学习笔记【3】