OpenCV 笔记 —— 常用函数API介绍

常用函数及其用法举栗:



  • opencv 中的图像坐标问题:原图中的坐标Point 类中的坐标

1、原图中的坐标 (x, y)
在 opencv 中,读入的图像 source 其 X 坐标为 source.rows,即为图像的高;Y 坐标为 source.cols,即为图像的宽。
2、Point 类中的坐标 Point(x, y)
在 Point 类中,点的坐标 (x, y) 表示为该点在原图像中的 ( 宽度,高度 ),正好与原图中的坐标表示相反。


  • Mat数据类型中指针ptr的使用:原图中的坐标Point 类中的坐标

常用形式:
Mat.ptr<type>(row)[col]

对于Mat的ptr函数,返回的是<type>中的模板类型指针,指向的是(row)中的第row行的起点地址
通常<type>中的类型和Mat的元素类型应该一致
然后再去访问该起点地址的[col],即对应col列位置的元素

单通道
cv::Mat image = cv::Mat(400, 600, CV_8UC1);	     //定义了一个Mat变量image。
uchar* data00 = image.ptr<uchar>(0);	       //data00是指向image第一行第一个元素的指针。
uchar* data10 = image.ptr<uchar>(1);	       //data10是指向image第二行第一个元素的指针。
uchar* data01 = image.ptr<uchar>(0)[1];        //data01是指向image第一行第二个元素的指针。

多通道
cv::Mat image = cv::Mat(400, 600, CV_8UC3);          //height:400,width:600,3通道彩色图片
cv::Vec3b* data000 = image.ptr<cv::Vec3b>(0);
cv::Vec3b* data100 = image.ptr<cv::Vec3b>(1);
cv::Vec3b* data001 = image.ptr<cv::Vec3b>(0)[1];

  • 图像读取与显示函数:imread()imshow()
Mat imread(
             const String& filename,       //文件路径
             int flags = IMREAD_COLOR      //在原图读取时进行一定转换的参数
          );

flags 具体参数如下:

flags图像深度图像通道
-18位在原图基础上增加alpha通道
08位1通道
18位3通道
2如果原图是16或32位,则为跟原图一样,其他的就返回8位的1通道
48位3通道

例如:
imread(“F:/…/123.jpg”) → 从路径 F:/… 读取图像123.jpg。
imshow(“显示”, oneImage) → 弹出名称为“显示”的窗口,显示名为oneImage的图像。


  • 显示窗口函数:namedWindow()
void namedWindow(
                   const String& winname,         //新建窗口的名称
                   int flags = WINDOW_AUTOSIZE    //窗口尺寸标识
                );

flags – 窗口尺寸标识,默认为WINDOW_AUTOSIZE。
  WINDOW_AUTOSIZE → 窗口大小自动适应图片尺寸,不可手动更改。
  WINDOW_NORMAL → 用户可以改变这个窗口大小。
  WINDOW_OPENGL → 窗口创建的时候会支持OpenGL


  • Mat类型图像的 “复制” :=、copyto()、clone()

1、重载运算符 =
使用重载运算符 “ = ” 进行的拷贝是一种浅拷贝,虽然它们有不同的图像矩阵头,但是二者共享相同的内存空间,二者内容相互关联,任何一个变量变化的同时另一个变量也随之改变。

Mat Input, Output;
Input = imread("E:/***");
Output = Input;                    //此时,Output与Input仅仅是图像名称不同,但同时指向同一个内存空间

2、复制函数 copyto()
系统在使用这个函数之前,实际上先使用create()函数开辟了一段内存:m.create(src.size(), src.type()); ,然后复制原图像。这是一种深拷贝,真正地拷贝了一个新的图像矩阵,此时二者相互之间没有影响,但是如果设置了ROI、COI,copyto()只会复制ROI、COI区域的内容。

Mat Input, Output;
Input = imread("E:/***");
Input.copyto(Output);              //在复制之前,执行 Output.create(Input.size(), Input.type());

3、克隆函数 clone()
clone()同样是一种深拷贝,该函数会自己开一段内存,再复制好图像里面的数据,然后返回这段内存中的数据。clone()是把所有的都复制过来,不论你是否设置了ROI、COI等影响,clone()都会原封不动的克隆过来。

Mat Input, Output;
Input = imread("E:/***");
Output = Input.clone();            //Input图像克隆到Output中,Output是一幅新图像

应当注意:
用clone复制后,如果源图像在内存中消失,复制的图像也变了,而用copy复制,源图像消失后,复制的图像不变。


  • 空间色彩转换函数:cvtColor()
void cvtColor( 
                InputArray src,       //输入图像
                OutputArray dst,      //输出图像
                int code,             //颜色映射码(转换码)
                int dstCn = 0         //输出的通道数 (0='automatic')
             );

其中:dstCn用于指定目标图像的通道数,如果指定的值是默认值0,那么通道数将由输入图像和颜色转换码决定。
例如:
cvtColor(srcImage, srcGray, CV_RGB2GRAY) → 转换码
CV_RGB2GRAY表示将彩色图像转换至灰度图像,因此,这里将彩色图像srcImage转化为灰度图像srcGray。


  • 图像灰度值个数计算函数:calcHist()
void cv::calcHist(
                    const Mat* images,         //输入图像(数组)
                 int nimages,               //输入图像(数组)的个数
                 const int* channels,       //需要统计直方图的第几通道
                 InputArray mask,           //掩膜,即感兴趣区域(ROI)
                 OutputArray hist,          //输出直方图数组
                 int dims,                  //直方图所统计的通道个数
                 const int* histSize,       //直方图区间bin的个数
                 const float** ranges,      //像素统计的区间
                 bool uniform = true,       //是否对直方图进行归一化处理
                 bool accumulate = false    //多个图像时,是否累计计算各像素的个数
                 );

其中,images可以有多个,但必须满足:同等深度,同等大小,同种数据类型(CV_8U或CV_32F),而通道数不需要一致。
应当注意:
函数 calcHist() 的计算结果储存为一个尺寸为 256×1 的“列向量”,即,
calcResults[ ] = { ‘0灰度的个数’; ‘1灰度的个数’; … ‘255灰度的个数’; };


  • 等待函数:waitKey()
int waitKey(
              int delay = 0       //表示结果显示的时间,单位毫秒
           );

waitKey(t) → 表示 t 毫秒后程序自动退出,当 t≤0 时,表示显示图片后,按下任意键后程序退出。


  • 提取Mat中的元素数据:M.at<float>(i, j)M.ptr<float>(i)[j]
    M.at<float>(i, j) → 提取名为M的单通道图像中坐标(i, j)点的值,其值的类型为float。
    M.at<Vec3b>(i, j) → 提取名为M的三通道图像中坐标(i, j)点的值,其值的类型为Vec3b,Vec3b实质上是一个uchar的数组,最多能装三个uchar类型数据。

  • 矩阵极值函数:minMaxLoc()
void minMaxLoc(
                 InputArray src,              //输入的单通道矩阵
                 double* minVal,              //最小值,NULL为无返回
                 double* maxVal=0,            //最大值,NULL为无返回
                 Point* minLoc=0,             //最小值的位置
                 Point* maxLoc=0,             //最大值的位置
                 InputArray mask=noArray()    //掩码
              );

查找全局最小和最大数组元素并返回它们的值和它们的位置(若无须返回,此值置为NULL或 0)。
例如:
minMaxLoc(src, &minValue, &maxValue, 0, 0);


  • 直线绘制函数:line()
void line(
            InputOutputArray img,          //要绘制线段的图像
            Point pt1,                     //线段的起点
            Point pt2,                     //线段的终点
            const Scalar& color,           //线段的颜色,通过一个Scalar对象定义
            int thickness = 1,             //线条的宽度
            int lineType = LINE_8,         //线段的类型,默认值为8邻接
            int shift = 0                  //坐标点小数点位数
         );

lineType – 线段的类型。默认值为8邻接。
  8(or 0) → 8邻接连接线,
  4 → 4邻接连接线和反锯齿连接线。
  CV_AA → 采用高斯滤波连接。

  • 圆绘制函数:circle()
void circle(
               InputOutputArray img,       //输入输出图像
               Point center,               //圆心坐标
               int radius,                 //圆的半径
               const Scalar& color,        //圆的颜色,Scalar(B, G, R)
               int thickness = 1,          //圆的线条宽度,正数表示线条的粗细程度,负数表示圆被填充
               int lineType = LINE_8,      //线条的类型
               int shift = 0               //圆心坐标点和半径值的小数点位数
           );
  • 矩形绘制函数:rectangle()
void rectangle(
                  InputOutputArray img,    //在这张图上绘制矩形,并输出
                  Point pt1,
                  Point pt2,
                  const Scalar& color,
                  int thickness = 1,
                  int lineType = LINE_8,
                  int shift = 0
              );
                          
void rectangle(
                  InputOutputArray img,
                  Rect rec,
                  const Scalar& color,
                  int thickness = 1,
                  int lineType = LINE_8,
                  int shift = 0
              );

  • 灰度直方图均衡函数:equalizeHist()
void equalizeHist(
                     InputArray src,        //输入图像,只能是8位单通道图像
                     OutputArray dst        //输出图像
                 );

  • 三种滤波函数:blur()、GaussianBlur()、medianBlur()
//均值滤波
void blur( 
            InputArray src,                              //待均值滤波的输入图像 
            OutputArray dst,                             //滤波后的输出图像
            Size ksize,                                  //滤波器尺寸(大于1的奇数)
            Point anchor = Point(-1,-1),                 //滤波器中心位置
            int borderType = BORDER_DEFAULT              //边界模式,用于推断图像外部像素的某种边界模式
         );

//高斯滤波
void GaussianBlur(
                    InputArray src,                      //待高斯滤波的输入图像
                    OutputArray dst,                     //滤波后的输出图像
                    Size ksize,                          //滤波器尺寸(大于1的奇数)
                    double sigmaX,                       //高斯核函数在X方向上的标准差
                    double sigmaY = 0,                   //高斯核函数在Y方向上的标准差
                    int borderType = BORDER_DEFAULT      //边界模式,用于推断图像外部像素的某种边界模式
                 );

//中值滤波
void medianBlur(
                  InputArray src,                        //待中值滤波的输入图像,要求为1通道、3或4通道图像
                  OutputArray dst,                       //滤波后的输出图像
                  int ksize                              //滤波器尺寸(大于1的奇数)
               );

  • 阈值分割函数:threshold()
double threshold(
                    InputArray src,        //输入图像
                    OutputArray dst,       //输出图像
                    double thresh,         //阈值
                    double maxval,         //使用 BINARY 或 BINARY_INV 方法时的最大值
                    int type               //选用 OpenCV 提供的阈值分割方法
                );

参数 type,表示执行阈值分割的方法,其具体种类如下:

type在 OpenCV 中的表示具体方法
0THRESH_BINARY
1THRESH_BINARY_INV
2THRESH_TRUNC
3THRESH_TOZERO
4THRESH_TOZERO_INV
7THRESH_MASK
8THRESH_OTSUOtsu,最大类间方差法
16THRESH_TRIANGLE

例如:
使用 Otsu 算法:threshold ( src_gray, dst, 0, 255, CV_THRESH_OTSU) ;

应当注意:
使用 Otsu 或者 Triangle 方法时,输入图像只能是8位单通道图像


  • 形态学结构元设置函数:getStructuringElement()
Mat getStructuringElement(
                             int shape,                       //结构元形状
                             Size ksize,                      //结构元尺寸,注意为Size类型变量
                             Point anchor = Point(-1,-1)      //结构元原点
                         );

参数 shape,表示执行的形态学操作的结构元形状,其具体参数可选如下:

shape在 OpenCV 中的表示结构元形状
0MORPH_RECT矩形结构元
1MORPH_CROSS十字形结构元
2MORPH_ELLIPSE椭圆形结构元
  • 形态学处理函数:morphologyEx()
void morphologyEx(
                     InputArray src,                       //输入图像
                     OutputArray dst,                      //输出图像
                     int op,                               //形态学操作的类型
                     InputArray kernel,                    //结构元
                     Point anchor = Point(-1,-1),          //结构元的原点,不设置时默认为结构元中心
                     int iterations = 1,                   //膨胀和腐蚀的次数
                     int borderType = BORDER_CONSTANT,     //推断图像外部像素边界模式的模式
                     const Scalar& borderValue = morphologyDefaultBorderValue()   //常数边界的边界值
                 );

参数 op,表示执行的形态学操作类型,其具体参数如下:

 op 在 OpenCV 中的表示具体方法
0MORPH_ERODE腐蚀,缩小细化图像中的物体特征
1MORPH_DILATE膨胀,扩大图像细节
2MORPH_OPEN开运算,对图像先腐蚀再膨胀
3MORPH_CLOSE闭运算,对图像先膨胀再腐蚀
4MORPH_GRADIENT梯度,膨胀与腐蚀之差,可以保留物体边缘轮廓
5MORPH_TOPHAT顶帽,原图像与开运算结果图之差
6MORPH_BLACKHAT黑帽,闭运算结果图与原图像之差
7MORPH_HITMISS击中、不击中,在一幅图中匹配已知特征

注意:
在对图像进行形态学处理前,必须先设置结构元:使用函数 getStructuringElement() 。
详细栗子,可参考:https://blog.csdn.net/xiansong1005/article/details/80702941


  • 连通域标记函数:connectedComponentsWithStats()
int connectedComponentsWithStats(
                                    InputArray image,         //输入要标记的8位单通道图像
                                    OutputArray labels,       //输出的标记完成图像
                                    OutputArray stats,        //每个标签的统计输出,包含顶点、面积、包围盒等
                                    OutputArray centroids,    //每个标签的质心输出
                                    int connectivity,         //用4或8分别表示4连通邻域和8连通邻域
                                    int ltype,                //输出图像标签类型,目前支持 CV_32S 和 CV_16U 类型
                                    int ccltype               //连通域算法类型
                                 );

//连通域标记函数connectedComponentsWithStats()具有一个重载类型,两者只是调用的形参不同
int connectedComponentsWithStats(
                                    InputArray image, 
                                    OutputArray labels,
                                    OutputArray stats, 
                                    OutputArray centroids,
                                    int connectivity = 8, 
                                    int ltype = CV_32S
                                );

参数 labels 是标记完成后的图像,是将原图像中的各个连通域中像素对应的位置从1开始,依次标记。例如:第一个连通域的所有像素位置均标记为“1”。

参数 stats,表示对每个标签的统计输出,例如:stats.at < int > ( i, CC_STAT_AREA),表示读取 stats 中第 i 个连通域的面积信息。stats 中具体包含:

stats在 OpenCV 中的表示解释
CC_STAT_LEFT最左边的 X 坐标,是水平方向边界框的开始
CC_STAT_TOP最上边的 Y 坐标,是竖直方向边界框的开始
CC_STAT_WIDTH边界框的水平宽度
CC_STAT_HEIGHT边界框的竖直高度
CC_STAT_AREA连通域的面积(像素点数)
CC_STAT_MAX

参数 ccltype,表示计算连通域使用的算法类型,具体包含:

ccltype在 OpenCV 中的表示解释
CCL_WUSAUF algorithm for 8-way connectivity, SAUF algorithm for 4-way connectivity.
CCL_DEFAULTBBDT algorithm for 8-way connectivity, SAUF algorithm for 4-way connectivity.
CCL_GRANABBDT algorithm for 8-way connectivity, SAUF algorithm for 4-way connectivity.

官方说明文档:https://docs.opencv.org/3.3.1/d3/dc0/group__imgproc__shape.html#ga107a78bf7cd25dec05fb4dfc5c9e765f


  • 二维掩膜计算函数:filter2D()
void filter2D(
                 InputArray src,                              //输入图像
                 OutputArray dst,                             //输出图像(与输入图像具有相同的尺寸和通道数)
                 int ddepth,                                  //目标图像深度
                 InputArray kernel,                           //掩膜(相关核)
                 Point anchor = Point(-1,-1),                 //掩膜原点位置(默认为掩膜中心位置)
                 double delta = 0,                            //在储存目标图像前可选的添加到像素的值,默认值为0
                 int borderType = BORDER_DEFAULT              //像素向外逼近的方法
             );

例如:
filter2D(src, dst, CV_8U, kernel);
表示以掩膜kernel对原图像src进行二维掩膜计算,结果图像深度为8位无符号整型(CV_8U),结果储存于dst图像中。

参考博文:https://blog.csdn.net/keith_bb/article/details/53103026


  • 矩阵通道分离与合并函数:split()、merge()
//通道分离
void split(
              const Mat& src,                                 //待分离的多通道矩阵
              Mat* mvbegin                                    //矩阵数组,保存分离后的单通道矩阵
          );
void split(
              InputArray m,                                   //待分离的多通道矩阵
              OutputArrayOfArrays mv                          //vector容器,保存分离后的单通道矩阵
          );

//通道融合
void merge(
              const Mat* mv,                                  //矩阵数组,包含多个待融合单通道矩阵
              size_t count,                                   //需要融合的矩阵数目
              OutputArray dst                                 //输出结果(融合后的多通道矩阵)
          );
void merge(
              InputArrayOfArrays mv,                          //vector容器,包含多个待融合单通道矩阵
              OutputArray dst                                 //输出结果(融合后的多通道矩阵)
          );

应当注意:
当储存多个单通道图像的容器是矩阵数组(Mat src[] = { image01, image02 };)时,需要指定融合矩阵的数目,而当储存容器是vector容器(vector<Mat>src = { image01, image02 };)时,则默认融合vector容器中的所有矩阵。


  • 图像尺寸更改函数:resize()
void resize(
               InputArray src,                                //输入原图像
               OutputArray dst,                               //输出结果图像
               Size dsize,                                    //设定结果图像的尺寸
               double fx = 0,                                 //在x轴上的缩放比例
               double fy = 0,                                 //在y轴上的缩放比例
               int interpolation = INTER_LINEAR               //差值方式(计算新图像的各点像素)
           );

其中,参数 interpolation 表示采用的差值方式,OpenCV 3.4 提供的差值方式有:

interpolation在 OpenCV 中的表示具体解释
0INTER_NEAREST最邻近差值
1INTER_LINEAR双线性插值(默认的差值方式)
2INTER_CUBIC立方插值(4×4像素邻域内)
3INTER_AREA使用像素关系重采样
4INTER_LANCZOS4Lanczos差值(8×8像素邻域内)
5INTER_LINEAR_EXACT
7INTER_MAX
8WARP_FILL_OUTLIERS
16WARP_INVERSE_MAP

应当注意:
参数dsize与参数组fx、fy不能同时为0,例如:
resize(src, dst, Size(350, 200)); → 表示将原图src缩小为宽350、高200的图像dst。
resize(src, dst, Size(0, 0), 0.8, 0.8); → 表示将原图src的x轴、y轴尺寸均更改为0.8倍。


  • 霍夫直线变换函数:HoughLinesP()
void HoughLinesP(
                    InputArray image,                 //输入图像,8位单通道二值图像
                    OutputArray lines,                //输出vector<Vec4i>型值,Vec4i是一个包含4个int数据类型的结构体:[x1,y1,x2,y2],表示一条线段
                    double rho,                       //半径的分辨率
                    double theta,                     //角度分辨率
                    int threshold,                    //直线点数的阈值
                    double minLineLength = 0,         //线段长度阈值
                    double maxLineGap = 0             //线段上最近两点之间的阈值
                );

  • 霍夫圆变换函数:HoughCircles()
void HoughCircles(
                     InputArray image,                //输入图像,8位单通道图像
                     OutputArray circles,             //输出vector<Vec3f>型值,Vec3f是一个包含3个float数据类型的结构体:[x, y, radius],表示一个圆
                     int method,                      //使用的检测方法,目前OpenCV仅提供霍夫梯度法:CV_HOUGH_GRADIENT
                     double dp,                       //检测圆心的累加器图像的分辨率(尺寸)与输入图像之比的倒数
                     double minDist,                  //检测到的多个圆的圆心之间的最小距离
                     double param1 = 100,             //第三个参数method设置的检测方法的对应的参数
                     double param2 = 100,             //第三个参数method设置的检测方法的对应的参数
                     int minRadius = 0,               //圆半径的最小值
                     int maxRadius = 0                //圆半径的最大值
                 );

应当说明:
1、参数 param1 是第三个参数 method 设置的检测方法的对应的参数。对当前唯一的方法:霍夫梯度法,它表示传递给 canny 边缘检测算子的高阈值,而低阈值为高阈值的一半。
2、参数 param2 也是第三个参数method设置的检测方法的对应的参数。对当前唯一的方法:霍夫梯度法,它表示在检测阶段圆心的累加器阈值。它越小的话,就可以检测到更多根本不存在的圆;而它越大的话,能通过检测的圆就更加接近完美的圆形。


  • 漫水填充函数:floodFill()
//第一个函数原型(不带 mask)
int floodFill(
                 InputOutputArray image,              //需要处理的图像(是输入也是输出)
                 Point seedPoint,                     //漫水填充算法的起始点
                 Scalar newVal,                       //像素点被染色的值,即在重绘区域像素的新值
                 CV_OUT Rect* rect = 0,               //设置水填充算法将要重绘区域的最小边界矩形区域
                 Scalar loDiff = Scalar(),            //表示当前像素值与其邻域像素值或者待加入该区域的种子像素之间的亮度或颜色负差(lower brightness/color difference)的最大值
                 Scalar upDiff = Scalar(),            //表示当前像素值与其邻域像素值或者待加入该区域的种子像素之间的亮度或颜色正差(lower brightness/color difference)的最大值
                 int flags = 4                        //操作标志符
             );

//第二个函数原型(带 mask)
int floodFill(
                 InputOutputArray image,              //同上
                 InputOutputArray mask,               //操作掩模,8位单通道图像
                 Point seedPoint,                     //同上
                 Scalar newVal,                       //同上
                 CV_OUT Rect* rect=0,                 //同上
                 Scalar loDiff = Scalar(),            //同上
                 Scalar upDiff = Scalar(),            //同上
                 int flags = 4 );                     //同上

注意两个说明:
一、mask 表示操作掩码,是一个8位单通道图像,其尺寸比输入图像 image “大一圈”,即长和宽均大两个像素单位。漫水填充算法不会填充掩膜 mask 的非零像素区域。因此,若将一个边缘检测算子的输出图像加大“一圈”后用作掩膜,则可以有防止填充到边缘的作用。

二、参数 flags 是操作标志符,共包含三个部分:

  1. 低八位(第0~7位)用于控制算法的连通性,可取4 (4为缺省值) 或者 8。如果设为4,表示填充算法只考虑当前像素水平方向和垂直方向的相邻点;如果设为 8,除上述相邻点外,还会包含对角线方向的相邻点。
  2. 高八位部分(16~23位)可以为 0 或者如下两种选项标识符的组合:
    <1>、FLOODFILL_FIXED_RANGE - 如果设置为这个标识符的话,就会考虑当前像素与种子像素之间的差,否则就考虑当前像素与其相邻像素的差。也就是说,这个范围是浮动的。
    <2>、FLOODFILL_MASK_ONLY - 如果设置为这个标识符的话,函数不会去填充改变原始图像 (也就是忽略第三个参数 newVal ), 而是去填充掩模图像(mask)。这个标识符只对第二个版本的 floodFill 有用,因第一个版本里面压根就没有mask参数。
  3. 中间八位部分,上面关于高八位 FLOODFILL_MASK_ONLY 标识符中已经说的很明显,需要输入符合要求的掩码。Floodfill 的 flags 参数的中间八位的值就是用于指定填充掩码图像的值的。但如果 flags 中间八位的值为0,则掩码会用1来填充。

  • OpenCV视频文件处理类:Class VideoCapture{}

1、VideoCapture类的基本构造函数

VideoCapture::VideoCapture();
VideoCapture::VideoCapture(const string& filename);   //filename – 打开的视频文件名
VideoCapture::VideoCapture(int device);               //device – 打开的视频捕获设备id,值为0时打开默认摄像头

用于创建一个VideoCapture类的实例。
如果传入对应的参数,可以直接打开视频文件或者要调用的摄像头。例如:VideoCapture video(“E:\dog.mp4”);

2、打开视频或摄像头:VideoCapture::open()

bool VideoCapture::open(const string& filename);      //filename – 打开的视频文件名
bool VideoCapture::open(int device);                  //device – 打开的视频捕获设备id

opencv读入视频的方式一般有两种:
一是实例化的同时进行初始化:VideoCapture video(“E:\dog.mp4”);
二是先实例化,再初始化:VideoCapture video; video.open(“E:\dog.mp4”);

3、判断视频读取或者摄像头调用是否成功:VideoCapture::isOpened()

bool VideoCapture::isOpened();

例如:
video.isOpened(); 若VideoCapture类型变量video成功加载视频,则返回true。

4、关闭视频文件或摄像头:VideoCapture::release()

void VideoCapture::release();

5、抓取帧:VideoCapture::grab()

bool VideoCapture::grab();               //调用成功返回true

6、解码并返回抓取帧:VideoCapture::retrieve()

bool VideoCapture::retrieve(Mat& image, int channel=0);

7、按帧读取视频:VideoCapture::read()

VideoCapture& VideoCapture::operator>>(Mat& image);
bool VideoCapture::read(Mat& image);

该函数结合VideoCapture::grab()和VideoCapture::retrieve()其中之一被调用,用于捕获、解码和返回下一个视频帧这是一个最方便的函数对于读取视频文件或者捕获数据从解码和返回刚刚捕获的帧,假如没有视频帧被捕获(相机没有连接或者视频文件中没有更多的帧)将返回false。
由此,获取视频帧可以有多种方法 :

// 方法一 
capture.read(frame); 
 
// 方法二 
capture.grab(); 
 
// 方法三
capture.retrieve(frame); 
 
// 方法四
capture >> frame;

8、获取视频属性:VideoCapture.get()

parameter在 OpenCV 中的表示define
VideoCapture.get(0)CV_CAP_PROP_POS_MSEC视频文件的当前位置(播放)以毫秒为单位
VideoCapture.get(1)CV_CAP_PROP_POS_FRAMES基于以0开始的被捕获或解码的帧索引
VideoCapture.get(2)CV_CAP_PROP_POS_AVI_RATIO视频文件的相对位置(播放):0=视频开始,1=视频结束
VideoCapture.get(3)CV_CAP_PROP_FRAME_WIDTH在视频流的帧的宽度
VideoCapture.get(4)CV_CAP_PROP_FRAME_HEIGHT在视频流的帧的高度
VideoCapture.get(5)CV_CAP_PROP_FPS帧速率
VideoCapture.get(6)CV_CAP_PROP_FOURCC编解码的4字-字符代码
VideoCapture.get(7)CV_CAP_PROP_FRAME_COUNT视频文件中的帧数
VideoCapture.get(8)CV_CAP_PROP_FORMAT返回对象的格式
VideoCapture.get(9)CV_CAP_PROP_MODE返回后端特定的值,该值指示当前捕获模式
VideoCapture.get(10)CV_CAP_PROP_BRIGHTNESS图像的亮度(仅适用于照相机)
VideoCapture.get(11)CV_CAP_PROP_CONTRAST图像的对比度(仅适用于照相机)
VideoCapture.get(12)CV_CAP_PROP_SATURATION图像的饱和度(仅适用于照相机)
VideoCapture.get(13)CV_CAP_PROP_HUE色调图像(仅适用于照相机)
VideoCapture.get(14)CV_CAP_PROP_GAIN图像增益(仅适用于照相机)(Gain在摄影中表示白平衡提升)
VideoCapture.get(15)CV_CAP_PROP_EXPOSURE曝光(仅适用于照相机)
VideoCapture.get(16)CV_CAP_PROP_CONVERT_RGB指示是否应将图像转换为RGB布尔标志
VideoCapture.get(17)CV_CAP_PROP_WHITE_BALANCE_BLUE_U× 暂时不支持
VideoCapture.get(18)CV_CAP_PROP_RECTIFICATION立体摄像机的矫正标注(目前只有DC1394 v.2.x后端支持这个功能)

9、设置VideoCapture类的属性:VideoCapture::set()

bool VideoCapture::set(
                          int propertyId,      //设置属性的ID
                          double value         //该属性要设置的值
                      );

注意:设置属性的ID与VideoCapture::get()中的相似。


  • 未完待续:cvtColor()
void (
            
         );

  • 未完待续:cvtColor()
void (
            
         );

  • 未完待续:cvtColor()
void (
            
         );

思路:



  • 10
    点赞
  • 46
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值