现在的位置: 首页 > 综合 > 正文

OpenCV参考手册之CvCapture结构体

2017年12月25日 ⁄ 综合 ⁄ 共 5755字 ⁄ 字号 评论关闭

1、CvCapture结构体:

CvCapture是一个结构体,用来保存图像捕获的信息,就像一种数据类型(如int,char等)只是存放的内容不一样,在OpenCv中,它最大的作用就是处理视频时(程序是按一帧一帧读取),让程序读下一帧的位置,CvCapture结构中,每获取一帧后,这些信息都将被更新,获取下一帧回复。

2、cvCreateFileCapture(const char* mov)

cvCreateFileCapture()通过参数设置确定要读入的avi文件,返回一个指向CvCapture结构的指针。这个结构包括了所有关于要读入avi文件的信息,其中包含状态信息。调用这个函数之后,返回指针所指向的CvCapture结构呗初始化到对应的avi文件的开头。

3、IplImage* cvCreateImage(CvSize size,int depth,int channels);

cvCreateImage:创建首地址并且分配存储空间:IplImage* cvCreateImage(CvSize size,int depth,int channels);

//size:图像的宽、高;depth:图像元素的位深度,可以是一下其中之一:

IPL_DEPTH_8U - 无符号8位整型
IPL_DEPTH_8S - 有符号8位整型
IPL_DEPTH_16U - 无符号16位整型
IPL_DEPTH_16S - 有符号16位整型
IPL_DEPTH_32S - 有符号32位整型
IPL_DEPTH_32F - 单精度浮点数
IPL_DEPTH_64F - 双精度浮点数

4、cvSetTrackbarPos("进度条名称","窗口名称",pos):

这个函数要和另外两个函数配套使用,一个是回调函数,也就是响应鼠标的函数(即下面的CvTrackbarCallback on_change),这个是自定义的。第二个是创建函数cvCreateTrackbar(),这个函数的最后一个参数是前面回调函数,用来创建一个进度条。

关于cvSetTrackbarPos,他有3个参数cvSetTrackbarPos("进度条名称","窗口名称",pos)。第三个参数是当前进度条的位置,可以按照视频帧数的比例来设置当前进度值,也可以用循环pos++来设置。

5、cvQueryFrame(CvCapture* capture):

表示从摄像头或者文件中抓取并返回一帧。

IplImage* cvQueryFrame(CvCapture* capture);函数cvQueryFrame从摄像头或者文件中抓取一帧,然后解压并且返回这一帧。这个函数仅仅是函数cvGrabFrame和函数cvRetrieveFrame在一起调用的组合。返回的图像不可以被用户释放或者修改。

cvQueryFrame的参数是CvCapture结构的指针。用来将下一帧视频文件载入内存,返回一个对应当前帧的指针。与cvLoadImage不同的是cvLoadImage为图像分配内存空间,而cvQueryFrame使用已经在cvCapture结构中分配好的内存,这样就没必要通过cvReleaseImage()对这个返回的图像指针进行释放,当CvCapture结构被释放后,每一帧图像对应的内存空间会被释放。

6、CvCaptureFromCAM(int index):

初始化从摄像头中获取视频:CvCapture* cvCaptureFromCAM(int index);

index:要使用的摄像头索引。如果只有一个摄像头或者用哪个摄像头也无所谓,那么使用参数-1便可以。

函数给从摄像头的视频流分配和初始化CvCapture结构。

7、cvCreateTrackbar(const char* trackbar_name,const char* window_name,int* value,int count,CvTrackbarCallback on_change);

该函数为开放计算机视觉(OpenCV)库库函数,创建trackbar并将它添加到指定的窗口。

定义:

CV_EXTERN_C_FUNCPTR(void (*CvTrackbarCallback)(int pos));

int cvCreateTrackbar(const char* trackbar_name,const char* window_name,int* value,int count,CvTrackbarCallback on_change);

参数:

trackbar_name:被创建的trackbar名字

window_name:窗口名字,这个窗口将为被创建trackbar的父对象

value:整数指针,它的值将反映滑块的位置,这个变量指定创建时的滑块位置。

count:滑块位置的最大值。最小值一直是0

on_change:每次滑块位置被改变的时候,被调用函数的指针。这个函数应该被声明为void Foo(int),如果没有回调函数,这个值可以设置为NULL。

函数cvCreateTrackbar用指定的名字和范围来创建trackbar(滑块或者范围控制),指定与trackbar位置同步的变量,并且指定当trackbar位置被改变的时候调用的回调函数。

被创建的trackbar默认显示在指定窗口的顶端,可以通过cvGetTrackbarPos来获取trackbar显示的位置信息,以及通过函数cvSetTrackbarPos来重新设置trackbar的位置。

8、double cvGetCaptureProperty(CvCapture* capture,int property_id);

double cvGetCaptureProperty(CvCapture* capture,int property_id)获取视频文件的一些属性,

//capture 视频获取结构;property_id 属性标识。

以下是OpenCV属性的一些宏定义:

CV_CAP_PROP_POS_MSEC //影片目前位置,为毫秒数或者视频获取时间戳

CV_CAP_PROP_POS_FRAMES //将被下一步解压/获取的帧索引,以0为起点

CV_CAP_PROP_POS_AVI_RATIO //视频文件的相对位置(0 - 影片的开始,1 - 影片的结尾)
CV_CAP_PROP_FRAME_WIDTH //视频流中的帧宽度
CV_CAP_PROP_FRAME_HEIGHT  //视频流中的帧高度
CV_CAP_PROP_FPS //帧率
CV_CAP_PROP_FOURCC  //表示codec的四个字符
CV_CAP_PROP_FRAME_COUNT  // 视频文件中帧的总数

CV_CAP_PROP_FORMAT       

CV_CAP_PROP_MODE          

CV_CAP_PROP_BRIGHTNESS    

CV_CAP_PROP_CONTRAST      

CV_CAP_PROP_SATURATION    

CV_CAP_PROP_HUE          

CV_CAP_PROP_GAIN         

CV_CAP_PROP_EXPOSURE     

CV_CAP_PROP_CONVERT_RGB   

CV_CAP_PROP_WHITE_BALANCE 

CV_CAP_PROP_RECTIFICATION 

通过创建一个Capture对象的指针后,调用cvGetCaptureProperty即可获取上述任何相关属性;但是我们不能太依赖这个函数;比如我们想获取一段视频的帧数,我们就不能太依赖于CV_CAP_PROP_FRAME_COUNT这个属性;因为cvGetCaptureProperty对属性的访问,其实访问的是关联视频文件的文件头信息,并不是真正去访问了视频的图像数据,这就带来一个问题:我们在讲其他视频格式转换为AVI格式的时候,图像帧数并没改变,只是视频文件头改变了,这时直接通过get函数读取的信息就可能不准确;最好的办法是迭代从视频中取出一帧,检查是否有数据,来确定该视频文件的总共帧数~~~

例如:

示例1:

CvCapture* cap = cvCaptureFromFile(videoName);//获取视频

int numFrames = (int) cvGetCaptureProperty(cap,CV_CAP_PROP_FRAME_COUNT);//得到视频帧数,

//得到的帧数是148帧

示例2:[较好的方法]

IplImage* pImg = NULL;

int count = 0;

while((pImg = cvQueryFrame(cap))!=NULL){

count++;

}//得到的帧数只有60帧

9、cvSetCaptureProperty

int  cvSetCaptureProperty(CvCapture* capture,int property_id,double value);

注意此方法定位并不准确

capture:视频获取结构

property_id:属性识别,可以是下面之一:

 CV_CAP_PROP_POS_MSEC    //从文件开始的位置,单位为毫秒
CV_CAP_PROP_POS_FRAMES   //单位为帧数的位置(只对视频文件有效)
CV_CAP_PROP_POS_AVI_RATIO   // 视频文件的相对位置(0 - 影片的开始,1 - 影片的结尾)
CV_CAP_PROP_FRAME_WIDTH  //视频流的帧宽度(只对摄像头有效)
CV_CAP_PROP_FRAME_HEIGHT  //视频流的帧高度(只对摄像头有效)
CV_CAP_PROP_FPS  //帧率(只对摄像头有效)
CV_CAP_PROP_FOURCC  //表示codec的四个字符(只对摄像头有效)

value表示的是属性的值

10、cvSmooth

函数cvSmooth可以使用简单模糊、简单无缩放变换的模糊、中值模糊、高斯模糊、双边滤波的任何一种方法平滑图像。每一种方法都有自己的特点和局限。没有缩放的图像平滑仅支持单通道图像,并且支持8位到16位的转换和32位浮点数到32为浮点数的变换格式。简单模糊和高斯模糊支持1-或3-通道,8-比特和32-比特浮点图像。这两种方法可以(in-place)方式处理图像。中值和双向滤波工作于1-或3-通道,8-位图像,但是不能以in-place方式处理图像。

void cvSmooth(const CvArr* src,CvArr* dst,int smoothtype=CV_GAUSSIAN,int param1=3,int param2=0,double param3=0,double param4=0);

//src:输入图像

//dst:输出图像

//smoothtype:平滑方法

平滑方法如下:

CV_BLUR_NO_SCALE (简单不带尺度变换的模糊) - 对每个象素的 param1×param2 领域求和。如果邻域大小是变化的,可以事先利用函数 cvIntegral 计算积分图像。

CV_BLUR (simple blur) - 对每个象素param1×param2邻域 求和并做尺度变换 1/(param1.param2).

CV_GAUSSIAN (gaussian blur) - 对图像进行核大小为 param1×param2 的高斯卷积

CV_MEDIAN (median blur) - 对图像进行核大小为param1×param1 的中值滤波(i.e. 邻域是方的).

CV_BILATERAL (双向滤波) - 应用双向 3x3 滤波,彩色sigma=param1,空间 sigma=param2. 平滑操作的第一个参数.

param2:

平滑操作的第二个参数. 对于简单/非尺度变换的高斯模糊的情况,如果param2的值 为零,则表示其被设定为param1。

param3:

对应高斯参数的 Gaussian sigma (标准差). 如果为零,则标准差由下面的核尺寸计算:
sigma = (n/2 - 1)*0.3 + 0.8, 其中 n=param1 对应水平核,
n=param2 对应垂直核.
对小的卷积核 (3×3 to 7×7) 使用如上公式所示的标准 sigma 速度会快。如果 param3 不为零,而 param1 和 param2 为零,则核大小有 sigma 计算 (以保证足够精确的操作).
函数 cvSmooth 可使用上面任何一种方法平滑图像。每一种方法都有自己的特点以及局限。
没有缩放的图像平滑仅支持单通道图像,并且支持8位到16位的转换(与cvSobel和cvLaplace相似)和32位浮点数到32位浮点数的变换格式。
简单模糊和高斯模糊支持 1- 或 3-通道, 8-比特 和 32-比特 浮点图像。这两种方法可以(in-place)方式处理图像。
中值和双向滤波工作于 1- 或 3-通道, 8-位图像,但是不能以 in-place 方式处理图像.

11、cvGetSize

cvGetSize是Opencv提供的一种操作矩阵图像的函数

得到二维的数组的尺寸,以CvSize返回。

CvSize cvGetSize(const CvArr* arr);

它与cvGetDims()密切相关,cvGetDim()返回一个数组的大小。主要的不同是cvGetSize()是专为矩阵和图像设计的,这两种对象的维数总是2。其尺寸可以以CvSize结构的形式返回,例如当创建一个新的大小相同的矩阵或图像时,使用此函数就很方便。

12、cvSize

cvSize是OpenCV的基本数据类型之一。表示矩阵框大小,以像素为精度。与CvPoint结构类似,但数据成员是integer类型的width和heigh

原型:

typedef struct CvSize
{
int width; /* 矩形宽 */
int height; /* 矩形高 */
}
CvSize;

13、cvPyrDown

功能:函数cvPyrDown使用Gaussian金字塔分解对输入图像向下采样

格式:void cvPyrDown(const CvArr* src,CvArr* dst,int filter = CV_GAUSSIAN_5x5);

参数:src:输入图像、dst:输出图像,其宽度和高度应是输入图像的一半;filter:卷积滤波器类型,目前仅支持CV_GAUSSIAN_5x5。

抱歉!评论已关闭.