zoukankan      html  css  js  c++  java
  • 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。

  • 相关阅读:
    搭建前端监控系统(备选)Js截图上报篇
    搭建前端监控系统(三)静态资源加载监控篇
    搭建前端监控系统(一)阿里云服务器搭建篇
    springboot+缓存
    springboot集成springDataJpa
    从零开始搭建SpringBoot项目
    Java1.8的HashMap源码解析
    SpringMvc流程分析,简单源码分析
    Java定时任务
    Java性能调优
  • 原文地址:https://www.cnblogs.com/yangxuebing/p/7339694.html
Copyright © 2011-2022 走看看