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


-------------------------------------------------------------------

normalize函数的作用使输入数组的范数或者数值范围归一到一定范围内。函数原型如下:

void normalize(InputArray src,OutputArray dst, double alpha = 1, double beta = 0, intnorm_type = NORM_L2, int dtype = -1, InputArray mask = noArray());

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(img_bgr, matchLoc, Point(matchLoc.x + img_sub.cols, matchLoc.y + img_sub.rows), Scalar(255, 0, 0), 2, 8, 0);
 

-------------------------------------------------------------------
画框函数接口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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值