![](https://img-blog.csdnimg.cn/20201014180756916.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
C++ opencv
文章平均质量分 67
打酱油的;
这个作者很懒,什么都没留下…
展开
-
C++ opencv模板匹配
模板匹配就是在整个图像区域发现与给定子图像匹配的小块区域;模板匹配需要首先给定一个模板图像;另外需要一张待检测的图像;工作方法:在待检测图像上,从左到右,从上到下计算模板图像与重叠子图像的匹配度,匹配程度越大,两者相同的可能性越大。原创 2022-11-27 20:02:13 · 2047 阅读 · 0 评论 -
C++ opencv高斯模糊
计算平均值的时候,我们只需要将"中心点"作为原点,其他点按照其在正态曲线上的位置分配权重,不平滑主要在于距离中心点很远的点与距离中心点很近的所带的权重值相同,产生的模糊效果一样。高斯模糊之所以叫高斯模糊,就是因为它运用了高斯的正态分布的密度函数(概率论知识)。平滑化处理,就是用平滑滤波函数,生成卷积核对应的权重,然后对图像进行卷积操作。上面的正态分布是一维的,而对于图像都是二维的,所以我们需要二维的正态分布。正态分布显然是一种可取的权重分配模式。正态分布中,越接近中心点,取值越大,越远离中心,取值越小。原创 2022-11-21 11:16:47 · 1338 阅读 · 0 评论 -
C++ opencv图像卷积操作
卷积的一种应用形式就是滤波,当然不同的卷积核有不同的卷积效果,所以卷积还有诸如梯度运算等其他的应用形式,差别就在于卷积核的不同。图像卷积常常用于图像滤波(平滑化),图像梯度,开运算,闭运算,黑帽运算,顶帽运算等形态处理,以及基于梯度运算的边缘提取中。其实就是利用卷积核(卷积模板)在图像上滑动,将图像点上的像素灰度值与对应的卷积核上的数值相乘,上面的图片演示了图像的卷积操作,但是直观的看出,卷积后的图片和卷积前的图片尺寸不一致。原图像与均值滤波卷积核卷积,结果就是原图像的像素值乘以卷积核对应位置的值相加,原创 2022-11-21 09:12:12 · 2200 阅读 · 0 评论 -
C++ opencv直方图均衡化
话说回直方图,我们引入直方图,很大程度上是为了让我们可以根据直方图的形态,判断图像的质量,比如根据下图所示,会很快发现一张图片是过亮还是过暗。假设有一幅图像64*64大小,共有4096个像素,8个灰度级各灰度级概率分布见下表 ,试将其直方图均匀化。图像直方图均衡化可以用于图像增强、对输入图像进行直方图均衡化处理,提升后续对象检测的准确率等。而在HSV色彩空间中,V通道关于亮度的,所以我们实现彩色图像的均衡化可以从V通道着手。直方图均衡化是将原图像通过某种变换,得到一幅灰度直方图为均匀分布的新图像的方法。原创 2022-11-19 22:17:34 · 2360 阅读 · 0 评论 -
C++ opencv二维直方图
上节课中,我们学习了一维直方图的绘制,那我们该如何绘制二维直方图呢?寻找最小/最大值 - minMaxLoc。本课中计算的直方图维数为2维,采取方式为。计算直方图数据 - calcHist。四舍五入浮点数 - cvRound。如何绘制HSV图像的二维直方图?S(饱和度)范围是[0,255]我们回顾HSV的知识,可以发现。H(色调)范围是[0,180]V(明度)范围是[0,255]原创 2022-11-17 11:16:53 · 455 阅读 · 0 评论 -
C++ opencv图像直方图
由于其计算代价较小,且具有图像平移、旋转、缩放不变性等众多优点,广泛地应用于图像处理的各个领域,特别是灰度图像的阈值分割、基于颜色的图像检索以及图像分类、反响投影跟踪。图像直方图(Image Histogram)是用以表示数字图像中亮度分布的直方图,标绘了图像中每个亮度值的像素数。通常直方图的维数要低于原始数据,所以它的信息有缺,图像直方图并不能唯一表示一张图像。因为计算的到直方图数据数组,是一个大小为256的一维数组,它的每个值对应一个频次。有很多的算法,比如传统的特征工程,跟它都有千丝万缕的关系。原创 2022-11-17 10:00:27 · 4697 阅读 · 0 评论 -
C++ opencv视频处理与保存
在不改变屏幕分辨率的情况下,至少有一路传输端可以传输 4K视频,4K内容的显示必须原生,在opencv中,我们如果要获取视频的属性,就要用到VideoCapture类的一个方法。视频属性中,由于国内互联网视频网站的定义,我们对分辨率的区分有些误区。所以这里重新介绍一下视频的分辨率,至于其他属性,一般不会有什么误区。视频有很多的属性,有时长,分辨率,帧宽度,帧高度,帧速率等。虽然介绍了分辨率,但本文主要演示一些帧相关的属性,具体如下。如果超出了摄像头硬件的范围,即使设置的再好也不会显示。原创 2022-11-16 21:55:32 · 4515 阅读 · 1 评论 -
C++ opencv图像翻转
C++ opencv图像翻转。原创 2022-11-15 20:10:06 · 1450 阅读 · 0 评论 -
C++ opencv视频文件摄像头使用
如果打开成功,我们将可以开始读取视频的帧,并且cv::VideoCapture的成员函数isOpened()将会返回true。虽然摄像机将在 VideoCapture 析构函数中自动取消初始化,但我们最好在末尾写上release,这种情况下,我们会给出一个标识符,用于表示我们想要访问的摄像机,及其与操作系统的握手方式。如果果只有1个摄像机,那么就是0,如果系统中有多个摄像机,那么只要将其向上增加即可。当我们要读取一个视频文件,或者相机时,一般有3种方式。如果系统中有多个摄像机,那么只要将其向上增加即可。原创 2022-11-15 22:34:35 · 836 阅读 · 0 评论 -
C++ opencv图像旋转
图像变换将原定义在图像空间的图像以某种形式转换到另外的空间,利用空间的特有性质方便地进行一定的加工,最后再转换回图像空间以得到所需的效果。只有物体的位置(平移变换)和朝向(旋转变换)发生改变,而形状不变,得到的变换称为刚性变换。为了更好的理解图像翻转,图像旋转等,我们首先介绍一下变换相关的概念。当旋转的角度为Θ,且旋转中心为x,y时,即这个矩阵的通式为。通过如上图,我们可以计算新图像的宽度,高度,旋转中心的通式。图像的几何变换包含很多变换,其中有一些变换,具体如下。原创 2022-11-15 20:42:52 · 2811 阅读 · 1 评论 -
C++ opencv图像放缩与插值
可以使用size做放缩插值,也可以使用fx,fy卷积做放缩插值。在做一些神经网络训练,深度网络训练,卷积网络训练等的时候,为了方便处理,会把图像resize到指定大小。第6个参数 插值方法(查阅文档可知,下文会进行简单介绍)INTER_LANCZOS4 = 4 ——Lanczos插值。要想得到放缩后图像像素点的位置,就要经过某种算法计算得来。而常见的插值算法有4种,其中前两种比较快,后两种比较慢。这是因为,图像放缩时,像素点的位置会发生变化。首先,图像放缩的时候为什么要用插值算法呢?原创 2022-11-15 00:06:00 · 388 阅读 · 0 评论 -
C++ opencv 图像像素类型转换与归一化
但是这可能会给我们模型的训练过程带来一些问题, 因为在深度神经网络训练时一般使用较小的权重值来进行拟合,而当训练数据的值是较大整数值时,可能会减慢模型训练的过程。(虽然图像的像素处于0-1范围时,opencv会自动*255,由于仍然介于0-255之间,所以图像依旧是有效的,并且可以正常查看图像。如果我们在将图像输入到神经网络之前对图像做像素值归一化的处理,即将像素值缩放到0-1之间,就能够避免很多不必要的麻烦。我们可以直接将原始图像的像素真实值直接作为神经网络模型的训练数据,本文链接:图像的像素归一化。原创 2022-11-14 19:25:02 · 1381 阅读 · 0 评论 -
C++ opencv几个拷贝函数
copyTo()函数有两个接口,第一个接口就是上述clone()调用的接口,所以copyTo()是clone()的扩展。copyTo()的第二个函数是只拷贝图像的ROI(感兴趣区域)。由此可以看到,clone()和copyTo()都是深拷贝;而“=”操作,当原图改变时,目标图像也会发生改变,原因是赋值操作令两张图片有两个“头”,但是共用一段内存空间。clone()函数,跟进opencv源码,clone()调用了copyTo()函数。图像的赋值操作,是浅拷贝,当源图像改变时,也随之改变。原创 2022-11-14 16:08:19 · 1226 阅读 · 0 评论 -
C++ opencv 鼠标事件响应
setMouseCallback要传入窗口的名字,所以要使用namedWindow事先创建一个窗口,不然会报错。我们绘制矩形的时候,如果终点在图像外就会报错,只要根据if判断即可,不过本文没有处理。左键按下 - EVENT_LBUTTONDOWN。为了演示通过鼠标绘制矩形,我们选择三个鼠标事件。鼠标移动 - EVENT_MOUSEMOVE。左键松开 - EVENT_LBUTTONUP。我们这里,实现了通过鼠标在四个区域绘制矩形。原创 2022-11-14 09:21:42 · 2402 阅读 · 0 评论 -
C++ opencv多边形填充与绘制
C++ opencv多边形填充与绘制。原创 2022-11-12 20:33:49 · 1102 阅读 · 1 评论 -
C++ opencv随机数与随机颜色
RNG::uniform(a, b ) 返回一个[a,b)范围的均匀分布的随机数,a,b的数据类型要一致,而且必须是int、float、double中的一种,默认是int。如果要产生均值为λ,标准差为σ的随机数,可以λ+RNG::gaussian( σ)RNG::gaussian( σ) 返回一个均值为0,标准差为σ的随机数。RNG::gaussian( ) : 产生一个高斯分布的随机数。RNG::uniform( ) :产生一个均匀分布的随机数。原创 2022-11-12 19:41:23 · 1217 阅读 · 0 评论 -
C++ opencv 图像几何形状绘制
接下来,这里演示一种很有意思的用法利用addWeighted融合几何图形与原图像。可以看到,这种隐约的图形效果很nice,只在原图像上绘制图形是达不到这种效果的。原创 2022-11-12 10:30:42 · 1192 阅读 · 0 评论 -
C++ OpenCV 图像像素值统计
在图像分析的时候,我们关注图像的有效信息,通过图像像素的统计值,我们就可以对图像的有效信息作出判断。当图像标准差很小时,图像所携带的有效信息会很少,我们就要对图像进行筛选,通过一些手段过滤掉一些东西。上图中,输出平均值和标准差,是把所有通道的都输出了,那如果怎么输出单通道的呢?当平均值恒定,标准差很小时,我们可以想到是基本纯色的图片,也就是低对比度的图。1.minMaxLoc 求取单通道图像像素的最小值,最大值。图像的平均值和标准差会给我们带来一定的信息。这里简单提一下图像分析的事情。原创 2022-11-11 10:09:47 · 581 阅读 · 0 评论 -
C++ opencv 图像色彩空间转换--色域捕获
在opencv中,我们提取指定色彩范围的区域,采用inRange实现,这样的一块区域,学名叫做ROI(region of interest),感兴趣区域。对于多通道的输入,输出结果是各个通道的结果相与,当各通道结果都在上下限之内时,输出为255,否则为0。当我们传入mask时,这里的copyTo只会拷贝到mask中不为0的像素点,即白色区域(255)图像中,对于在指定色彩范围内的颜色,将置为255(白色),不在的则置为0(黑色)提取后,指定色彩区域为255,roi区域为0。关于inRange的提取原理。原创 2022-11-10 17:06:03 · 1160 阅读 · 0 评论 -
C++ opencv 通道分离与合并
这时,如果再通过BGR2GRAY转换色彩空间,就可以得到对应的单通道图像。这个混合的意思是,彩色图像本来是bgr的顺序,经过通道混合就变成了rgb。下图中间的R,G,B图,并不是分离,而是3通道中其他两个通道置0了。彩色图像,是由RGB三个通道合并起来得到的。0通道的单通道图像,变成了2通道的单通道图像。2通道的单通道图像,变成了0通道的单通道图像。这里我们进行一个演示,实现如下通道的混合。根据文档,我们有两种分离方式。根据文档,我们有两种合并方式。分离通道要用到split。合并通道要用到merge。原创 2022-11-10 09:26:35 · 2403 阅读 · 0 评论 -
C++ opencv 图像像素的逻辑操作
如果参数 >=0,则表示绘制矩形(如为1,表示绘制的矩形边为1个像素)2表示图像*(1/2)^2,同时距离(0,0)的x方向和y方向距离*(1/2)^2。如果参数 >=0,则表示绘制矩形(如为1,表示绘制的矩形边为1个像素)2表示图像*(1/2)^2,同时距离(0,0)的x方向和y方向距离*(1/2)^2。如果参数 < 0,则表示填充矩形(如-1,表示填充整个矩形)1表示图像*1/2,同时距离(0,0)的x方向和y方向距离*1/2。1表示图像*1/2,同时距离(0,0)的x方向和y方向距离*1/2。原创 2022-11-09 20:38:12 · 1489 阅读 · 2 评论 -
C++ OpenCV 自带颜色表操作
第3个参数 颜色图(查阅官方文档可知)第1个参数 输入矩阵。第2个参数 输出矩阵。原创 2022-11-09 11:58:00 · 815 阅读 · 0 评论 -
C++ opencv 键盘响应事件
可以是打客房电话,也可以是派服务员去敲门,睡得死怕耽误事的,还可以要求往自己头上浇盆水。这是因为回调并不仅仅用在应用和库之间,任何时候,只要想获得类似于上面情况的灵活性,都可以利用回调。而旅客告诉旅馆怎么叫醒自己的动作,也就是把回调函数传入库函数的动作,称为登记回调函数。换句话说,程序可以在运行时,通过登记不同的回调函数,来决定、改变中间函数的行为。在回调中,我们利用某种方式,把回调函数像参数一样传入中间函数。可以这么理解,在传入一个回调函数之前,中间函数是不完整的。这就比简单的函数调用,要灵活太多了。原创 2022-11-08 16:41:12 · 901 阅读 · 0 评论 -
C++ opencv 亮度对比度调节
createTrackbar 函数创建了一个具有特定名称和范围的轨迹条,指定一个和轨迹条位置同步的变量,而且指定回调函数onChange(第五个参数),在轨迹条改变的时候来调用这个回调函数,且创建的轨迹条显示在指定的winname(第二个参数)所代表的窗口上。createTrackbar()函数用于创建一个可以调整数值的滑动条(常常也称轨迹条),并将滑动条附加到指定的窗口上。把函数的指针(地址)作为参数传递给另一个函数,当这个指针被用来调用其所指向的函数时,就称其为回调函数。处理轨迹栏事件类型的回调函数。原创 2022-11-08 10:43:47 · 1626 阅读 · 0 评论 -
C++ opencv 图像像素的算术操作
这就用到了saturate_cast,当使用它时会保证BGR图像的像素值在[0,255]创建俩个相同大小的矩阵一个用来加,一个用来收,前提类型大小要一样,不然报错。OpenCV有自带的专用函数,专用函数都有截断处理,以乘法为例。采用运算符时加法,乘法有溢出隐患,有什么办法解决吗?:如果除数较大,结果最终会被自动截断为0。对于截断的演示,我们用运算符加法演示。本案例就溢出了,所以没有结果展示。可能会溢出,提示溢出的错误。首先,我们采用运算符的方式。原创 2022-11-06 20:29:21 · 245 阅读 · 0 评论 -
C++ opencv 图像像素的读写操作
at中必须标明矩阵的数据类型,一般图像是uchar(8位无符号整型)类型。根据通道数的不同,数据类型的不同,就有了很多变化,下面是常用的三种。简单而言就是一个uchar类型的,长度为3的vector向量。这里只是at方法的一种演示,一共6种传参方式,具体可查看文档。3 通道 float 类型的矩阵可以使用 < Vec3f >8U 类型的 RGB 彩色图像可以使用 < Vec3b >3 通道 int 类型的矩阵可以使用 < Vec3i >通过设置每一行的首地址指针,我们可以实现更快的遍历。原创 2022-11-06 10:32:30 · 1949 阅读 · 0 评论 -
C++opencv 色彩空间转换和保存
对于PPM,PGM,或PBM格式的图片,这个参数表示一个二进制格式标志(CV_IMWRITE_PXM_BINARY),取值0或1,默认值时1。对于JPEG格式的图片,这个参数从0到100的图片质量(CV_IMWRITE_JPEG_QUALITY),默认值是95。如果加上透明通道A(alpha),透明通道也是[0,255],就有256 * 256 * 256 * 256种组合。是opencv里的颜色空间转换函数,可以实现RGB颜色向HSV,HSI等颜色空间的转换,也可以转换成灰度图像。原创 2022-11-04 16:08:16 · 3364 阅读 · 0 评论 -
C++ opencv图像存储和MAT容器
有时候,由于内存足够大,可实现连续存储,图像中的各行是一行一行连接起来的,形成一个长行。OpenCV中,每个Mat对象有自己的信息头,但共享同一个矩阵。通过让矩阵指针指向同一地址实现。对于多通道图像来说,矩阵中的列会包含多个子列,其子列个数与通道数相同,如图5.2所示RGB颜色模型的矩阵。图像矩阵的大小取决于所用的颜色模型,确切说,取决于所用通道数。指向存储所有像素值的矩阵(根据所选存储方法的不同,矩阵可以是不同的维数)的指针。CIE L*a*b*:在感知上均匀的颜色空间,适合度量两个颜色之间的距离。原创 2022-11-04 00:02:08 · 3428 阅读 · 0 评论 -
C++ opencv 图像读取与显示
CV_LOAD_IMAGE_ANYDEPTH——等价取值为2,若图像深度是16位或者32位,就返回对应深度,否则,返回8位图像。因为24位在opencv中只是一个深度的表示,opencv用一个枚举类型来表示它,这个枚举类型的值可能是1。比如imread加载进来的图片是3通道的,每个通道1个字节(8bit),3*8=24位,图像深度就是24。2. 第二个参数,int类型的flags,为载入标识,指定一个加载图像的颜色类型,默认值为1。直到任意按键按下,显示窗口才会关闭。,可以更改窗口的大小(没有限制)。原创 2022-11-03 20:53:35 · 2865 阅读 · 0 评论