Opencv基于图形相关接口调用,识别图形反馈图标所在位置


Mat:
-------------------------------------------------------------------
1. Mat类简介
Mat类是Opencv中储存图像非常常见的一种数据结构。Mat类可以看做是存放矩阵的容器,他包含了两部分,分别是用来存放图片信息的信息头,和一个指向图片储存矩阵的指针。信息头往往占用空间比较小,而且各个图片之间的信息头是完全独立的。而图片储存矩阵往往占用较大的空间,并且可以多个图片的矩阵指针指向同一个内存空间。

2. Mat类的拷贝
从Mat类的数据储存结构来看,Mat类图像储存是通过矩阵指针实现的。这样的话,在做图片复制的时候,就必须要考虑的一个问题是:我们需要复制的是矩阵指针的地址,还是需要重新创建一个内存空间,把图片存储矩阵重新拷贝一份。所以Mat类的拷贝具有浅拷贝和完全拷贝两种。

2.1 使用拷贝构造函数进行拷贝
Mat类中具有自己的拷贝构造函数,其函数原型如下
浅拷贝:
Mat(const Mat& m);    
使用拷贝构造函数进行图片的拷贝有两种写法,并且这两种写法是等价的。
Mat m = imread("1.jpg);
Mat m2(m);


2.2 使用clone()函数或者copyTo()函数进行拷贝
使用这两种方法拷贝,是一种完全拷贝,会为图片生成独立的图片储存矩阵,与原图片不公用数据,这样的话,操作其中一个,其他的并不会受到影响,缺点是占用空间大,而且速度比较
Mat m = imread("a.jpg");
Mat m1;
m.copyTo(m1);
Mat m2=m.clone();


imread
-------------------------------------------------------------------
原型 
Mat imread( const String& filename, int flags )
第一个参数 filename: 表示图像的路径。
第二个参数 flags:表示读取图像的方式。

      IMREAD_UNCHANGED = -1,表示读取原图, 不进行任何改变
      IMREAD_GRAYSCALE = 0,表示以灰度图方式读取原图
      IMREAD_COLOR = 1,表示以RGB方式读取原图


-------------------------------------------------------------------
int resultCols = img_bgr.cols - img_sub.cols + 1;
int resultRows = img_bgr.rows - img_sub.rows + 1;
Mat result.create(resultRows, resultCols, CV_32FC1);
Mat result.create(Rows, tCols,type)
    使用creat函数,无法初始化,如果新的需求大于原来的内存,它才会重新分配内存区域
    resultRows:标识矩阵宽度
    resultCols:标识矩阵高度
    type:标志矩阵类型 (CV_32FC1)
    CV_<bit_depth>(S|U|F)C<number_of_channels>
        bit_depth:比特数---代表8bite,16bites,32bites,64bites...
        S|U|F:
            S--代表---signed int---有符号整形
            U--代表--unsigned int--无符号整形
            F--代表--float---------单精度浮点型
        C<number_of_channels>----代表---一张图片的通道数,比如:
            channels = 1:灰度图片--grayImg---是--单通道图像
            channels = 3:RGB彩色图像---------是--3通道图像
            channels = 4:带Alph通道的RGB图像--是--4通道图像

-------------------------------------------------------------------
https://blog.csdn.net/Star_ID/article/details/124609507
OpenCV的 matchTemplate函数实现模板匹配
matchTemplate(img_bgr, img_sub, result, TM_CCORR_NORMED);   // TM_CCORR_NORMED等有 6种方式匹配
    参数    含义
    image    正在运行搜索的图像。 它必须是 8 位或 32 位浮点数。
    templ    搜索到的模板。 它必须不大于源图像并且具有相同的数据类型。
    result    比较结果图。 **它必须是单通道 32 位浮点数。** 如果 image 是 W×H 并且 templ 是 w×h ,那么结果是 (W−w+1)×(H−h+1)
    method    指定比较方法的参数,请参见TemplateMatchModes
    mask    搜索模板的掩码。 它必须与 templ 具有相同的数据类型和大小。 默认情况下未设置。 目前,仅支持 TM_SQDIFF 和 TM_CCOEFF_NORMED 方法。

    处理方式:将模板与重叠的图像区域进行比较。
        该函数在图像中滑动,使用指定的方法将大小为 w×h 的重叠块与 templ 进行比较,并将比较结果存储在 result 中。 以下是可用比较方法的公式(I 表示图像,T 是模板,R 是结果)。求和是在模板和/或图像块上完成的:x′=0…w−1,y′=0…h−1
        函数完成比较后,可以使用 minMaxLoc 函数以全局最小值(使用 TM_SQDIFF 时)或最大值(使用 TM_CCORR 或 TM_CCOEFF 时)找到最佳匹配。 在彩色图像的情况下,分子中的模板总和和分母中的每个总和在所有通道上完成,并且每个通道使用单独的平均值。 即该函数可以获取一个颜色模板和一个彩色图像。 结果仍然是单通道图像,更易于分析。


-------------------------------------------------------------------
void cvtColor( InputArray src, OutputArray dst, int code, int dstCn = 0 );
函数参数解释
1.src(source):输入的源图像。为矩阵形式。
2.dst(destination):输出的目标图像,即经过色彩转后我们需要得到的图像。也为矩阵形式。
3.code:颜色空间转换的标识符,表示我们所要进行空间转换的结果。
    BGR——灰度    COLOR_BGR2GRAY    
    RGB——灰度    
    COLOR_RGB2GRAY


-------------------------------------------------------------------
void normalize(InputArray src,OutputArray dst, double alpha = 1, double beta = 0, intnorm_type = NORM_L2, int dtype = -1, InputArray mask = noArray());
normalize函数的作用使输入数组的范数或者数值范围归一到一定范围内。函数原型如下:
src:输入图像/数组
dst:输出图像/数组
alpha:范围的最小值
beta:范围的最大值(不用于范数归一化)
intnorm_type:归一操作的类型,有如下三种:
            NORM_MINMAX:将数组的数值归一化到[alpha,beta]内,常用。
            NORM_L1:归一化数组的L1-范数(绝对值的和)
            NORM_L2:归一化数组的(欧几里德)L2-范数
dtype:为负数时,输出数组的类型与输入数组相同,否则只是通道数相同,类型默认为:type = CV_MAT_DEPTH
mask:指定操作的区域/空间,不懂得可以看看这篇博文:[图像位操作](https://blog.csdn.net/m0_60447786/article/details/125650689?spm=1001.2014.3001.5501)

归一化作用:
归一化就是要把需要处理的数据经过处理后(通过某种算法)限制在你需要的一定范围内。首先归一化是为了后面数据处理的方便,其次是保证程序运行时收敛加快
归一化的具体作用是归纳统一样本的统计分布性。归一化在0-1之间是统计的概率分布,归一化在某个区间上是统计的坐标分布。归一化有同一、统一和合一的意思。
此外,归一化还有其他作用:
1.无量纲化:例如房子数量和收入,从业务层知道这两者的重要性一样,所以把它们全部归一化,这是从业务层面上作的处理。
2.避免数值问题:不同的数据在不同列数据的数量级相差过大的话,计算起来大数的变化会掩盖掉小数的变化。
3.一些模型求解的需要:例如梯度下降法,如果不归一化,当学习率较大时,求解过程会呈之字形下降。
4.时间序列:进行log分析时,会将原本绝对化的时间序列归一化到某个基准时刻,形成相对时间序列,方便排查。
5.收敛速度:加快求解过程中参数的收敛速度。


-------------------------------------------------------------------
OpenCV中的函数minMaxLoc()用于找出矩阵中的最大值和最小值,并且给出它们中的坐标。
void cv::minMaxLoc(InputArray result,double * minVal,double * maxVal = 0,Point * minLoc = 0,Point * maxLoc = 0,InputArray mask = noArray())    
result—输入矩阵,要求是单通道的图像,即二维的矩阵。
minVal—矩阵中的最小值。
maxVal—矩阵中的最大值。
minLoc—矩阵中的最小值的坐标。
maxLoc—矩阵中的最大值的坐标。
mask—掩模矩阵。

( matchTemplate模式匹配的类型 int method = TM_CCORR_NORMED;或则 int method = TM_SQDIFF;)
if (method == TM_SQDIFF || method == TM_SQDIFF_NORMED) {
    matchLoc = minLoc;
} else {
    matchLoc = maxLoc;
}

-------------------------------------------------------------------
画框函数接口void cv::rectangle    (    InputOutputArray     img,
Rect     rec,
const Scalar &     color,
int     thickness = 1,
int     lineType = LINE_8,
int     shift = 0 
)        
@参数 img     输入图像。
@参数 rec     绘制矩形的规格。
@参数color    矩形颜色或亮度(灰度图像)。
@参数thickness构成矩形的线条的厚度。负值,比如FILLED,意味着函数必须绘制一个填充矩形。
@参数lineType 线的类型. 参见 LineTypes
@参数shift    点坐标中的小数位数

-------------------------------------------------------------------
Alph通道:
Alpha通道的概念与功能
在计算机图形学中,一个RGB颜色模型的真彩图形,用由红、绿、蓝三个色彩信息通道合成的,每个通道用了8位色彩深度,共计24位,包含了所有彩色信息。为实现图形的透明效果,采取在图形文件的处理与存储中附加上另一个8位信息的方法,这个附加的代表图形中各个素点透明度的通道信息就被叫做Alpha通道。

Alpha通道使用8位二进制数,就可以表示256级灰度,即256级的透明度。白色(值为255)的Alpha像素用以定义不透明的彩色像素,而黑色(值为0)的Alpha通道像素用以定义透明像素,介于黑白之间的灰度(值为30-255)的Alpha像素用以定义不同程度的半透明像素。因而通过一个32位总线的图形卡来显示带Alpha通道的图形,就可能呈现出透明或半透明的视觉效果。


透明或半透明图形的数学模型
一个透明或半透明图形的数学模型应当如下:
为了便于下面的分析,设Alpha值[0,255]区间映射为[0,1]区间相对应的值表示,即Alpha值为0—1之间的数值。则图形文件中各个像素点可表示为:
Graphx(Redx,Greenx,Bulex,Alphax)
屏幕上相应像素点的显示值就转换为:
Dispx(RedxAlphax,GreenxAlphax,BluexAlphax)
Alpha通道不仅用于单个图形的透明或半透明显示,更重要的是在图像合成中被广泛运用。
下面是如何根据Alpha通道数据进行图像混合的算法:
事实上,我们把需要组合的颜色计算出不含Alpha分量的原始RGB分量然后相加便可。如:两幅图像分别为A和B,由这两幅图像组合而成的图像称为C,则可用如下四元组表示图A和B,三元组表示图像C:
A:(Ra,Ga,Ba,Alphaa)
B:(Rb,Gb,Bb,Alphab)
C:(Rc,Gc,Bc)
根据上述算法,则:
Rc=RaAlphaa+RbAlphab
Gc=GaAlphaa+GbAlphab
Bc=BaAlphaa+Bb*Alphab
这就是两图像混合后的三原色分量。如果有多幅图像需要混合,则按照以上方法两幅两幅地进行混合。

在图像处理中,Alpha用来衡量一个像素或图像的透明度。在非压缩的32位RGB图像中,每个像素是由四个部分组成:一个Alpha通道和三个颜色分量(R、G和B)。当Alpha值为0时,该像素是完全透明的,而当Alpha值为255时,则该像素是完全不透明。


Alpha混色
Alpha混色是将源像素和背景像素的颜色进行混合,最终显示颜色取决于其RGB颜色分量和Alpha值。它们之间的关系可用下列公式来表示:
显示颜色 = 源像素颜色 X alpha / 255 + 背景颜色 X (255 - alpha) / 255


inRange:
-------------------------------------------------------------------
cvtColor(img_bgr, img_hsv, COLOR_RGB2GRAY);
# 将图像转为HSV格式进而得到mask,HSV分别代表色相(Hue)、饱和度(Saturation)、明度(Value)
inRange(img_hsv, Scalar(0, 120, 120), Scalar(10, 255, 255), img_flag);
cv2.inRange(src, lowerb, upperb)
用以确认元素值是否介于某个区域
inRange 函数需要设定三个参数,其中 src 指源图像;lowerb 指图像中低于 lowerb 的值,其所对应的图像值将为 0;upperb指图像中高于 upperb 的值,图像值变为 0 。换言之,源图像中仅有图像值介于 lowerb 和 upperb 之间的值才不为 0 ,且值将变成 255

cv2.bitwise_and(src1, scr2, mask=)
用于对两个数组(图像也是数组)对位元素进行运算,即计算机中的“和”运算。以二进制为例,1&0输出 1 ,1&0、0&1、0&0则均输出 0 。
bitwise_and 函数需要设定三个参数,其中 src1 指第一个数组(源图像),src2 指第二个数组(源图像),mask= 用于指定具体的掩模(常以 0 和 1 元素为主,用以输出具体的元素),应设为 uint8 格式,即单通道的 8-bit 的数组。另外,mask 参数为可选参数,可省略。


(https://blog.csdn.net/jndingxin/article/details/113743671)
getStructuringElement、erode、dilate
-------------------------------------------------------------------

形态学操作就是基于形状的一系列图像处理操作。OpenCV为进行图像的形态学变换提供了快捷、方便的函数。最基本的形态学操作有二种,他们是:膨胀与腐蚀(Dilation与Erosion)。
膨胀与腐蚀能实现多种多样的功能,主要如下:

消除噪声
分割(isolate)出独立的图像元素,在图像中连接(join)相邻的元素。
寻找图像中的明显的极大值区域或极小值区域
求出图像的梯度
腐蚀和膨胀是针对白色部分(高亮部分)而言的。
膨胀就是对图像高亮部分进行“领域扩张”,效果图拥有比原图更大的高亮区域;
腐蚀是原图中的高亮区域被蚕食,效果图拥有比原图更小的高亮区域。
膨胀用来处理缺陷问题; 腐蚀用来处理毛刺问题。


(https://cloud.tencent.com/developer/beta/article/1459455)
getStructuringElement:
-------------------------------------------------------------------
Mat element = getStructuringElement(elem_type, Size(3, 3), Point(1, 1));
这个函数的第一个参数表示内核的形状,有三种形状可以选择。
矩形:MORPH_RECT;
交叉形:MORPH_CROSS;
椭圆形:MORPH_ELLIPSE;
    第二和第三个参数分别是内核的尺寸以及锚点的位置。
    一般在调用erode以及dilate函数之前,先定义一个Mat类型的变量来获得getStructuringElement函数的返回值。
    对于锚点的位置,有默认值Point(-1,-1),表示锚点位于中心点。element形状唯一依赖锚点位置,
    其他情况下,锚点只是影响了形态学运算结果的偏移

(https://blog.csdn.net/jndingxin/article/details/113743671)
erode
-------------------------------------------------------------------
功能描述
通过一个特定的结构元素腐蚀一个图像。图像腐蚀的过程类似于一个卷积的过程,源图像矩阵A以及结构元素B,B在A矩阵上依次移动,每个位置上B所覆盖元素的最小值替换B的中心位置值(即锚点处),完成整个腐蚀的过程。
注意:所谓的腐蚀与膨胀的对象是针对图像中的白色元素所说的。看成是图像中的物体话会理解反。
算法通俗理解:腐蚀算法使二值图像缩小一圈,删除对象边界的某些像素,其运算过程就是使用用3X3的结构元素,扫描二值图像的每一个像素,用结构元素与其覆盖的二值图像做“与”运算,如果都为1,结构图像的该像素为1,否则为0。结果就是使二值图像减小一圈。
函数使用一个指定的核元素去腐蚀源图像,内核有一个可定义的 锚点,我们叫他内核中心点,腐蚀操作时,获取内核覆盖区域最小像素值,并代替锚点的像素,最小值通过以下公式获取:
函数支持就地模式,腐蚀操作可以迭加使用多次,在多通道图像的情况下,每个通道独立处理。

函数原型
CV_EXPORTS_W void erode( InputArray src, OutputArray dst, InputArray kernel,
                         Point anchor = Point(-1,-1), int iterations = 1,
                         int borderType = BORDER_CONSTANT,
                         const Scalar& borderValue = morphologyDefaultBorderValue() );


参数描述
参数 src          输入图像;通道的数量可以是任意的,但是深度值应该是以下之一:
CV_8U, CV_16U, CV_16S, CV_32F or CV_64F.
参数 dst          和源图像同样大小和类型的输出图像。
参数 kernel       用于腐蚀的结构元素;如果element=Mat(),是一个3 x 3的矩形结构元素. Kernel 可以通过使用getStructuringElement来创建。
参数 anchor       素中的锚点的位置,默认是值(-1,-1),也就是说锚点在元素的中心位置。
参数 iterations   腐蚀的迭代次数。
参数 borderType   像素外推方法。参见#BorderTypes, BORDER_WRAP不支持。
参数 borderValue  固定边缘的情况下的边缘值。
参考 dilate, morphologyEx, getStructuringElement


(https://blog.csdn.net/luolaihua2018/article/details/111712087)
膨胀dilate
-------------------------------------------------------------------
膨胀就是求局部最大值的操作,从图像直观看来,就是将图像光亮部分放大,黑暗部分缩小。
按数学方面来说,膨胀或者腐蚀操作就是将图像(或图像的一部分区域,我们称之为A)与核(我们称之为B)进行卷积。假设有图像A和结构元素B,结构元素B在A上面移动,其中B定义其中心为锚点,以B覆盖下A的最大像素值(偏白)替换锚点的像素,其中B作为结构体可以是任意形状(与卷积不同之处,可以是线、矩阵、圆、十字等形状)。


void dilate(
    InputArray src,
    OutputArray dst,
    InputArray kernel,
    Point anchor=Point(-1,-1),
    int iterations=1,
    int borderType=BORDER_CONSTANT,
    const Scalar& borderValue=morphologyDefaultBorderValue() 
);

参数详解:
第一个参数,InputArray类型的src,输入图像,即源图像,填Mat类的对象即可。图像通道的数量可以是任意的,但图像深度应为CV_8U,CV_16U,CV_16S,CV_32F或 CV_64F其中之一。
第二个参数,OutputArray类型的dst,即目标图像,需要和源图片有一样的尺寸和类型。
第三个参数,InputArray类型的kernel,膨胀操作的核。若为NULL时,表示的是使用参考点位于中心3x3的核。
我们一般使用函数 getStructuringElement配合这个参数的使用。getStructuringElement函数会返回指定形状和尺寸的结构元素(内核矩阵)。
其中,getStructuringElement函数的第一个参数表示内核的形状,我们可以选择如下三种形状之一:
矩形: MORPH_RECT
交叉形: MORPH_CROSS
椭圆形: MORPH_ELLIPSE
而getStructuringElement函数的第二和第三个参数分别是内核的尺寸以及锚点的位置。
我们一般在调用erode以及dilate函数之前,先定义一个Mat类型的变量来获得getStructuringElement函数的返回值。对于锚点的位置,有默认值Point(-1,-1),表示锚点位于中心。且需要注意,十字形的element形状唯一依赖于锚点的位置。而在其他情况下,锚点只是影响了形态学运算结果的偏移。


(https://blog.csdn.net/qq_48705696/article/details/109435432#:~:text=OpenCV%E4%B8%AD%E7%9A%84findContours%E5%87%BD%E6%95%B0%E6%98%AF%E7%94%A8%E6%9D%A5%E6%A3%80%E6%B5%8B%E7%89%A9%E4%BD%93%E7%9A%84%E8%BD%AE%E5%BB%93%EF%BC%8C%E4%B8%8B%E9%9D%A2%E8%AF%A6%E7%BB%86%E8%AF%B4%E6%98%8E%E4%B8%80%E4%B8%8B%E8%BF%99%E4%B8%AA%E5%87%BD%E6%95%B0%E5%90%84%E5%8F%82%E6%95%B0%E7%9A%84%E6%84%8F%E4%B9%89%E4%BB%A5%E5%8F%8A%E4%BD%BF%E7%94%A8%E3%80%82.%20Python%E4%BB%A3%E7%A0%81%E4%B8%AD%E7%9A%84findContours%E5%87%BD%E6%95%B0%E5%A6%82%E4%B8%8B%EF%BC%9A%20%20%20findContours%20%28image%2C%20mode%2C,method%2C%20contours%3DNone%2C%20hierarchy%3DNone%2C%20offset%3DNone%29%20%20image%EF%BC%9A%E8%BE%93%E5%85%A5%E7%9A%84%E4%BA%8C%E5%80%BC%E5%9B%BE%E5%83%8F%E3%80%82.%20mode%EF%BC%9A%E5%AE%9A%E4%B9%89%E8%BD%AE%E5%BB%93%E7%9A%84%E6%A3%80%E7%B4%A2%E6%A8%A1%E5%BC%8F%EF%BC%8C%E5%8F%AF%E9%80%89%E9%A1%B9%E4%B8%BA)
OpenCvSharp中通过使用findContours函数,简单几个的步骤就可以检测出物体的轮廓,很方便。这些准备继续探讨一下findContours方法中各参数的含义及用法,比如要求只检测最外层轮廓该怎么办?contours里边的数据结构是怎样的
-------------------------------------------------------------------
findContours( InputOutputArray image, OutputArrayOfArrays contours,  
                              OutputArray hierarchy, int mode,  
                              int method, Point offset=Point()); 

参数详解:
第一个参数:image,单通道图像矩阵,可以是灰度图,但更常用的是二值图像,一般是经过Canny、拉普拉斯等边缘检测算子处理过的二值图像
第二个参数:contours,定义为“vector<vector<Point>> contours”,是一个向量,并且是一个双重向量,向量内每个元素保存了一组由连续的Point点构成的点的集合的向量,每一组Point点集就是一个轮廓。  
           有多少轮廓,向量contours就有多少元素。
第三个参数:hierarchy,定义为“vector<Vec4i> hierarchy”,先来看一下Vec4i的定义:                         
           Vec4i是Vec<int,4>的别名,定义了一个“向量内每一个元素包含了4个int型变量”的向量。           
           向量hiararchy内的元素和轮廓向量contours内的元素是一一对应的,向量的容量相同。
           hierarchy向量内每一个元素的4个int型变量——hierarchy[i][0] ~hierarchy[i][3],分别表示第i个轮廓的后一个轮廓、前一个轮廓、父轮廓、内嵌轮廓的索引编号。如果当前轮廓没有对应的后一个轮廓、前一个轮廓、父轮廓或内嵌轮廓的话,则hierarchy[i][0] ~hierarchy[i][3]的相应位被设置为默认值-1
第四个参数:int型的mode,定义轮廓的检索模式:
           取值一:CV_RETR_EXTERNAL只检测最外围轮廓,包含在外围轮廓内的内围轮廓被忽略
           取值二:CV_RETR_LIST   检测所有的轮廓,包括内围、外围轮廓,但是检测到的轮廓不建立等级关系,彼此之间独立,没有等级关系,这就意味着这个检索模式下不存在父轮廓或内嵌轮廓,所以hierarchy向量内所有元素的第3、第4个分量都会被置为-1,具体下文会讲到
           取值三:CV_RETR_CCOMP  检测所有的轮廓,但所有轮廓只建立两个等级关系,外围为顶层,若外围内的内围轮廓还包含了其他的轮廓信息,则内围内的所有轮廓均归属于顶层
           取值四:CV_RETR_TREE, 检测所有轮廓,所有轮廓建立一个等级树结构。外层轮廓包含内层轮廓,内层轮廓还可以继续包含内嵌轮廓
第五个参数:int型的method,定义轮廓的近似方法:
           取值一:CV_CHAIN_APPROX_NONE 保存物体边界上所有连续的轮廓点到contours向量内
           取值二:CV_CHAIN_APPROX_SIMPLE 仅保存轮廓的拐点信息,把所有轮廓拐点处的点保存入contours向量内,拐点与拐点之间直线段上的信息点不予保留
           取值三和四:CV_CHAIN_APPROX_TC89_L1,CV_CHAIN_APPROX_TC89_KCOS使用teh-Chinl chain 近似算法
第六个参数:Point偏移量,所有的轮廓信息相对于原始图像对应点的偏移量,相当于在每一个检测出的轮廓点上加上该偏移量,并且Point还可以是负值!(默认是没有偏移量)


https://www.cnblogs.com/ybqjymy/p/14333577.html
approxPolyDP
-------------------------------------------------------------------
void approxPolyDP(InputArray curve, OutputArray approxCurve, double epsilon, bool closed)

参数详解:
    InputArray curve:一般是由图像的轮廓点组成的点集
    OutputArray approxCurve:表示输出的多边形点集
    double epsilon:主要表示输出的精度,就是另个轮廓点之间最大距离数,5,6,7,,8,,,,,
    bool closed:表示输出的多边形是否封闭


Rect boundingRect(InputArray points)
-------------------------------------------------------------------
输入:InputArray类型的array,输入灰度图像或二维点集。
输出:Rect类型的矩形信息,包括矩形尺寸和位置。


寻找包裹轮廓的最小正矩形:boundingRect 函数
返回矩阵应满足:
    ① 轮廓上的点均在矩阵空间内。
    ② 矩阵是正矩阵(矩形的边界与图像边界平行)。

(https://www.cnblogs.com/bjxqmy/p/12343385.html)
-------------------------------------------------------------------
绘制轮廓:drawContours 函数,配合 findContours使用相对方便
void drawContours(InputOutputArray image, InputOutputArrays contours, int contourIdx, const Scalar& color, int thickness = 1, int lineType = 8, InputArray hierarchy = noArray(), int maxLevel = INT_MAX, Point offset = Point());

image,目标图像,填 Mat 类对象即可。
contours,输入的轮廓,每个轮廓都是一组点集,可用 Point 类型的 vector 表示。
contourIdx,轮廓的索引编号。若为负值,则绘制所有轮廓。
color,轮廓颜色。
thickness,轮廓线条的粗细程度,有默认值 1。若其为负值,便会填充轮廓内部空间。
lineType,线条的类型,有默认值 8。可去类型如下:
hierarchy,可选的层次结构信息,有默认值 noArray()。
maxLevel,用于绘制轮廓的最大等级,有默认值 INT_MAX。
offset,轮廓信息相对于目标图像对应点的偏移量,相当于在每一个轮廓点上加上该偏移量,有默认值 Point() 。在 ROI 区域(感兴趣区域)绘制轮廓时,这个参数便可派上用场。


功能描述
绘制一个简单的、粗的或填充边界的矩形。
函数cv::rectangle绘制一个矩形轮廓或一个填充矩形,其两个相对的角是pt1和pt2。

函数原型1
void cv::rectangle    (    InputOutputArray     img,
Point     pt1,
Point     pt2,
const Scalar &     color,
int     thickness = 1,
int     lineType = LINE_8,
int     shift = 0 
)        
1
2
3
4
5
6
7
8
参数描述
@参数 img 输入图像。
@参数 pt1 矩形的顶点。
@参数 pt2 对应pt1的矩形的顶点。
@参数color 矩形颜色或亮度(灰度图像)。
@参数thickness 构成矩形的线条的厚度。负值,比如FILLED,意味着函数必须绘制一个填充矩形。
@参数lineType 线的类型. 参见 LineTypes
@参数shift 点坐标中的小数位数


https://blog.csdn.net/qq_33287871/article/details/111504876
namedWindow、imshow、waitKey
图像窗口函数namedWindow
在我们之前的程序中并没有见到窗口函数,因为我们在显示图像时如果没有主动定义图像窗口,程序会自动生成一个窗口用于显示图像,然而有时我们需要在显示图像之前对图像窗口进行操作,例如添加滑动条,此时就需要提前创建图像窗口。创建窗口函数的原型。

void cv::namedWindow(const String & winname,int  flags = WINDOW_AUTOSIZE)
    winname:窗口名称,用作窗口的标识符
    flags:窗口属性设置标志

图像显示函数imshow:
我们在前面已经见过了图像显示函数imshow()的调用方式,这里我们给出函数的原型。

void cv::imshow(const String & winname,InputArray mat)
    winname:要显示图像的窗口的名字,用字符串形式赋值
    mat:要显示的图像矩阵

注意 此函数运行后会继续执行后面程序,如果后面程序执行完直接退出的话,那么显示的图像有可能闪一下就消失了,因此在需要显示图像的程序中,往往会在imshow()函数后跟有cv::waitKey()函数,用于将程序暂停一段时间。waitKey()函数是以毫秒计的等待时长,如果参数缺省或者为“0”表示等待用户按键结束该函数。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值