几个重要的函数opencv
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了几个重要的函数opencv相关的知识,希望对你有一定的参考价值。
1、CvCapture结构体: CvCapture是一个结构体,用来保存图像捕获的信息,就像一种数据类型(如int,char等)只是存放的内容不一样,在OpenCv中,它最大的作用就是处理视频时(程序是按一帧一帧读取),让程序读下一帧的位置,CvCapture结构中,每获取一帧后,这些信息都将被更新,获取下一帧回复。 如CvCapture* pCapture = NULL;
2、cvCreateFileCapture(const char* mov) cvCreateFileCapture()通过参数设置确定要读入的avi文件,返回一个指向CvCapture结构的指针。这个结构包括了所有关于要读入avi文件的信息,其中包含状态信息。调用这个函数之后,返回指针所指向的CvCapture结构呗初始化到对应的avi文件的开头。 如pCapture=cvCreateFileCapture("d:\\xx.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。
以上是关于几个重要的函数opencv的主要内容,如果未能解决你的问题,请参考以下文章