opencv实用学习
文章平均质量分 84
梦回阑珊
程序员,年二十有九,始从文,连考而不中。 遂习武,练武场上发一矢,中鼓吏,逐之出。 改学IT,自撰一函数,用之,堆栈溢出。无奈之际,发现一洞,刻有武学,为C++、QT、python、opencv,练之,终驰骋天下。
展开
-
《opencv实用探索·二十三》支持向量机SVM处理线性不可分数据
以二维平面为例,如果在这个二维平面中有两堆不同类型的样本,如果能找到一条线把这两种类型的样本分开至线的两侧,那么就称这个样本集是线性可分,反之就是线性不可分。本例中我们通过该函数给向量空间着色, 即将图像中的每个像素当作卡迪尔平面上的一点,每一点的着色取决于SVM对该点的分类类别:深绿色表示分类为1的点,深蓝色表示分类为2的点。这样,通过遍历整个图像,根据 SVM 模型的分类结果,将图像的不同区域标记为不同的颜色,从而可视化 SVM 模型对数据的分类效果,最后在画出训练数据和支持向量。原创 2024-03-11 14:02:23 · 892 阅读 · 2 评论 -
《opencv实用探索·二十二》支持向量机SVM用法
在OpenCV中,SVM的使用通常涉及以下步骤:(1)数据准备: 收集并准备训练数据,确保每个样本都有相应的标签。(2)创建SVM对象: 使用OpenCV的 cv::ml::SVM 类创建一个SVM对象。(3)设置训练参数: 设置SVM的训练参数,例如核函数、惩罚系数等。(4)训练SVM模型: 使用训练数据对SVM进行训练。(5)预测: 使用训练好的SVM模型对新的数据进行分类预测。原创 2024-02-27 16:14:54 · 1377 阅读 · 1 评论 -
《opencv实用探索·二十一》人脸识别
Haar级联分类器工作的基本原理是使用弱分类器(通常是基于决策树的弱分类器)级联成一个强大的分类器。minNeighbors:匹配成功所需要的周围矩形框的数目,每一个特征匹配到的区域都是一个矩形框,只有多个矩形框同时存在的时候,才认为是匹配成功,比如人脸,这个默认值是3,较大的值可以提高对象检测的准确性,但也会增加漏检率。这些文件需要正面、直立的人脸图像。Haar级联分类器是一种用于目标检测的机器学习方法,它是一种基于机器学习的特征选择方法,能够快速而有效地检测出图像中的对象或特定的模式,例如人脸。原创 2023-12-20 16:38:19 · 1650 阅读 · 1 评论 -
《opencv实用探索·二十》点追踪技术
如果以光流的方式追踪目标,基本上我们可以通过goodFeaturesToTrack函数计算一系列特征点,然后通过Lucas-Kanade算法进行一系列特征点的预测,并画出这些预测点的运动轨迹。cornerSubPix 的作用就是对这些检测到的角点位置进行进一步的精细化调整,使得角点的位置更加精确。较大的窗口可能需要更多的计算资源,因此在资源受限或需要实时处理的情况下,可能需要权衡窗口大小和计算效率之间的关系。对于大尺度的特征(如纹理区域或物体),可能需要一个更大的窗口来更好地描述它们的运动。原创 2023-12-17 16:25:52 · 287 阅读 · 1 评论 -
《opencv实用探索·十九》光流法检测运动目标
qualityLevel:一般情况下设置0.01,较小的 qualityLevel 值会选择图像中质量较高的角点,即灰度梯度变化较为显著的地方。较大的 qualityLevel 值会放宽对角点质量的要求,接受更多的角点,即使它们的质量不太高。然而,它的性能可能受到场景中运动的复杂性、遮挡、图像噪声等因素的影响,因此在特定应用中需要仔细考虑其局限性。在光流法的实现中,有几种不同的方法,其中最常见的是Lucas-Kanade方法和Horn-Schunck方法。这意味着在相邻帧中,同一物体的灰度值应该是相似的。原创 2023-12-15 17:33:36 · 828 阅读 · 1 评论 -
《opencv实用探索·十八》Camshift进行目标追踪流程
但它的不足之处在于检测窗口的大小是固定的,而目标是不断变化的比如由近到远,各种旋转,固定的窗口是不合适的。图中一堆点集,任意位置有个圆形窗口(黑色圆),可以看到窗口的圆心(点1位置)和窗口的质心(点2位置)并不重合,那么这个窗口的圆心便会向质心的方向移动,当圆心1与质心2大致重合时圆的位置大概在红色圆的位置,此时在被红色圆覆盖的点集中3的位置为点集最密集的地方,此时红色圆的质心又被更新到3的位置,那么圆便会继续从2的位置向3的位置移动。反向投影是基于目标的颜色直方图,用于估计在图像中的可能位置。原创 2023-12-12 15:53:17 · 575 阅读 · 1 评论 -
《opencv实用探索·十七》calcBackProject直方图反向投影
反向投影中的“反向”指的是从直方图值到反向投影矩阵映射的过程。通过反向投影,原始的图像被简化了,而这个简化的过程实际上就是提取出图像的某个特征。所以我们就可以用这个特征来对比两幅图,如果两幅图的反向投影矩阵相似或相同,那么我们就可以判定这两幅图这个特征是相同的。像素值范围是0-15,在直方图中如果把bin(像素值范围)划分为4份,那第一份到第四份对应的像素值范围为[0, 3],[4, 7],[8, 11],[12, 15]。这个反向投影图像的每个像素值表示输入图像该位置的像素值与目标对象直方图的相似程度。原创 2023-12-12 10:57:13 · 208 阅读 · 1 评论 -
《opencv实用探索·十六》opencv直方图计算calcHist函数解析
比如输入是2副图像,第一副图像有0,1,2共三个channel,第二幅图像只有0一个channel,那么输入就一共有4个channes,如果int channels[3] = {3, 2, 0},那么就表示是使用第二副图像的第一个通道和第一副图像的第2和第0个通道来计算直方图。images:输入的图像的指针,可以是多幅图像,所有的图像必须有同样的深度(CV_8U or CV_32F)。这个就相当于横坐标,比如对像素值为0这个像素,如果数条的高度为100,表示有100个像素值为0的像素。原创 2023-12-11 11:48:04 · 760 阅读 · 1 评论 -
《opencv实用探索·十五》inRange二值化图像
函数实现二值化功能,主要是将在两个阈值内的像素值设置为白色(255),而不在阈值区间内的像素值设置为黑色(0)(2)上面案例中B通道(100-255)范围设置1,G通道(0-50)范围设置1,R通道(0-50)范围设置1。参数4:输出图像,与输入图像src 尺寸相同且为CV_8U 类型。(1)opencv中三通道图像按BGR排列,不是RGB。请注意:该函数输出的dst是一幅二值化之后的图像。参数1:输入要处理的图像,可以为单通道或多通道。参数2:包含下边界的数组或标量。参数3:包含上边界数组或标量。原创 2023-12-08 16:42:00 · 455 阅读 · 1 评论 -
《opencv实用探索·十四》VideoCapture播放视频和视像头调用
因此,waitKey(int(1000 / FrameRate)) 的作用是等待足够的时间,以保持视频的实际帧率接近指定的 FrameRate。当我们等待的时间小于int(1000 / FrameRate)能实现视频快放的效果,当我们等待的时间大于int(1000 / FrameRate)能实现视频慢放的效果。在你的代码中,你可以尝试在开始捕获帧之后再获取帧率信息。有些摄像头可能不以固定的帧率工作,因此 OpenCV 无法准确地获取帧率信息。FrameRate 是视频的帧率,表示每秒播放的帧数。原创 2023-12-08 14:29:18 · 603 阅读 · 1 评论 -
《opencv实用探索·十三》opencv之canny边缘检测
对于所有的像素点,逐一遍历,如果当前边缘像素的梯度值 大于高阈值定为强边缘, 低于高阈值但是高于低阈值被定为虚边缘, 低于低阈值的像素点(抑制)置零。图中Max和Min表示高低阈值,A在Max上面为强边缘直接保留,B在Max和Min之间为虚边缘,但B连着B,故也认定为边缘,保留。当完成非极大值抑制后,只保留了效果明显的边缘,然而,对于这些边缘,有些确实是图像的边缘,而有些却是由噪声产生的。所有的强边缘保留,而对于虚边缘,我们要做个判断。如果这些虚边缘是连接着强边缘的,那么保留,如果不是,那么抑制(置零)。原创 2023-12-07 17:20:24 · 1839 阅读 · 1 评论 -
《opencv实用探索·十二》opencv之laplacian(拉普拉斯)边缘检测,Scharr边缘检测,Log边缘检测
ddepth: 输出图像的深度,若src为CV_8U,则可取-1/CV_16S/CV_32F/CV_64F;若src为CV_16U/CV_16S,可取-1/CV_32F/CV_64F;ddepth:输出图像的深度,若src为CV_8U,则可取-1/CV_16S/CV_32F/CV_64F;Laplacian算子具有各方向同性的特点,能够对任意方向的边缘进行提取,具有无方向性的优点,因此使用Laplacian算子提取边缘不需要分别检测X方向的边缘和Y方向的边缘,只需要一次边缘检测即可。原创 2023-12-07 15:01:12 · 2716 阅读 · 1 评论 -
《opencv实用探索·十一》opencv之Prewitt算子边缘检测,Roberts算子边缘检测和Sobel算子边缘检测
Sobel算子在Prewitt算子的基础上增加了权重的概念,认为相邻点的距离远近对当前像素点的影响是不同的,距离越近的像素点对应当前像素的影响越大,从而实现图像锐化并突出边缘轮廓。但Sobel算子并不是基于图像灰度进行处理的,因为Sobel算子并没有严格地模拟人的视觉生理特性,因此图像轮廓的提取有时并不能让人满意。(4)应用双阈值(Double-Threshold)检测来确定真实的和潜在的边缘,即将梯度幅值映射到两个阈值,根据梯度值高于高阈值或在高低阈值之间的情况,将像素标记为强边缘、弱边缘或非边缘。原创 2023-12-06 17:09:17 · 2252 阅读 · 2 评论 -
《opencv实用探索·十》opencv双边滤波的简单理解
双边滤波的核函数是空间域核与像素范围域核的综合结果:在图像的平坦区域,像素值变化很小,对应的像素范围域权重接近于1,此时空间域权重起主要作用,相当于进行高斯模糊;第五个参数,空间坐标中滤波器的标准差值,这个参数越大表明越远的像素会相互影响,从而使更大领域中有足够相似的颜色获取相同的颜色。双边滤波中加入了对灰度信息的权重,即在邻域内灰度值越接近中心点的灰度值的点权重越大,与中心点灰度值相差大的点权重越小,此权重大小则由像素范围域高斯函数确定。第三个参数,int类型的d,表示在滤波过程中每个像素邻域的直径。原创 2023-12-05 15:41:22 · 778 阅读 · 1 评论 -
《opencv实用探索·九》中值滤波简单理解
中值滤波是一种非线性滤波方式,不再采用加权求均值的方式计算滤波结果,基本原理是把数字图像或数字序列中一点的值用该点的一个邻域中各点值的中值代替,让周围的像素值接近的真实值,从而消除孤立的噪声点。这样的判断条件旨在处理相对较小的像素值,因为在图像中的边缘或包含细节的区域,这些值可能代表着重要的信息。首先我们先取一个nxn的滤波核,该核是一个空核,核中不在有权重等数字,把滤波核放在图像上滑动,每滑动到一个位置,就把核覆盖下的所有像素值进行排序,然后取排序后中间的像素值替换被核中心覆盖下的原图像像素值。原创 2023-12-04 16:29:59 · 833 阅读 · 1 评论 -
《opencv实用探索·八》图像模糊之均值滤波、高斯滤波的简单理解
这里需要注意的是在二维高斯函数中标准差σ只有一种,没有σ1和σ2,如果我们设置sigmaX等于sigmaY,这样拿到的是一个圆形高斯核完全和二维高斯函数生成的一样,如果sigmaX不等于sigmaY我们拿到的是一个椭圆形高斯核,即在X和Y方向调用了分别调用二维高斯函数计算高斯核,因为标准差σ不一样。这种“格格不入”的像素就被称为图像的噪声。在图像处理中,为了提升图像的整体质量,通常我们需要对图像进行模糊处理,即通过卷积运算对每个像素进行滤波或平滑,减少图像的细节,使得图像噪声削弱,凸显特征明显的区域。原创 2023-12-02 22:43:59 · 1366 阅读 · 1 评论 -
《opencv实用探索·七》一文看懂图像卷积运算
可以看到经过卷积运算后原图像从原来的12x12变为了10x10,因为3x3卷积核的中心无法做到对原图像的边缘进行卷积运算。这时候经过卷积的原图像在第三行第四列的像素值置为30,说明图像中这个中心点的灰度值不受周围像素点的影响。因此,对图像的卷积运算也称为平滑或者滤波。比如我们使用3x3卷积核,通常会在图像最外层添加一层像素,这样在用3x3卷积核滑动时卷积核中心就能扫到图像最外层像素。运动模糊(Motion Blur): 使用特定的卷积核,可以模拟图像中的运动模糊,这对于一些图像合成和特效很有用。原创 2023-12-01 16:45:00 · 515 阅读 · 1 评论 -
《opencv实用探索·六》简单理解图像膨胀
用一个结构元素的中心覆盖原图像(二值图像只有0和1)的每个像素,看结构元素覆盖的原图像部分,取原图像中被覆盖部分像素的最小值替换被结构元素中心覆盖的原图像像素值。(5)去除噪声,二值图像中可能存在一些噪声点,或者孤立的像素点,通过一定次数的腐蚀操作可以消除孤立的像素点,通过一定次数的膨胀操作可以填充小的噪声点;src:输入的待膨胀图像,图像的通道数可以是任意的,但是图像的数据类型必须是CV_8U,CV_16U,CV_16S,CV_32F或CV_64F之一。(3)增加物体大小: 膨胀操作会扩大图像中的物体。原创 2023-12-01 11:08:55 · 1281 阅读 · 1 评论 -
《opencv实用探索·五》opencv小白也能看懂的图像腐蚀
(3)去除噪声,二值图像中可能存在一些噪声点,或者孤立的像素点,通过一定次数的腐蚀操作可以消除孤立的像素点,通过一定次数的膨胀操作可以填充小的噪声点;src:输入的待腐蚀图像,图像的通道数可以是任意的,但是图像的数据类型必须是CV_8U,CV_16U,CV_16S,CV_32F或CV_64F之一。)的每个像素,看结构元素覆盖的原图像部分,取原图像中被覆盖部分像素的最小值替换被结构元素中心覆盖的原图像像素值。ksize:结构元素的尺寸大小,一般情况下,结构元素的种类相同时,结构元素的尺寸越大腐蚀效果越明显。原创 2023-11-30 18:24:51 · 897 阅读 · 1 评论 -
《opencv实用探索·四》Mat图像数据类型转换和归一化显示
8位255值转32位依旧255,但32位图像显示范围0-1,超过1就是全白,这时候需要把32位图像归一化处理。像素值的计算过程为:mat2(191*(1.0/255)-1, 127*(1.0/255)-1, 63*(1.0/255)-1, -1)像素值的计算过程为:mat2(191*(1.0/255), 127*(1.0/255), 63*(1.0/255), 0)原来8为的时候像素值是255,但图像显示都很正常,现在转到16位,像素值依旧255,但这时候图像显示基本全黑,这是为啥?原创 2023-11-29 16:58:42 · 445 阅读 · 1 评论 -
《opencv实用探索·三》opencv Mat与数组互转
一个RGB32的像素,总共占32位,R,G,B分别占8位,还有一个空8位不用,可以用Vec3b获取RGB32像素值。一个ARGB32的像素,总共占32位,R,G,B,A分别占8位,可以用Vec4b获取ARGB32像素值。C----代表通道数,C3表示3通道,没加默认位单通道。CV_32S-有符号32位整数(-2147483648-2147483647)CV_16S-有符号16位整数(-32768-32767)CV_8S-有符号8位整数(-128-127)原创 2023-11-27 10:38:54 · 1017 阅读 · 1 评论 -
《opencv实用探索·二》根据RGB的像素排列来理解图像深度、像素深度和位深度
RGB16从高位到低位的排列为R->G->B,RGB24和RGB32从高位到低位的排列为B->G->R。(00000000 00000000 00000000 空空空空空空空空–11111111 11111111 11111111 空空空空空空空空)32位为一个像素(Vec4b),带alpha通道的RGB24,与RGB32的区别在于保留的8个Bit用于表示透明,也就是alpha值。32位为一个像素(Vec3b),RGB32与RGB24排列方式一样都是从高到底,从B到R,唯一不同就是在低字节保留了8位。原创 2023-11-24 16:01:19 · 972 阅读 · 1 评论 -
《opencv实用探索·一》QT+opencv实现图片拼接和Mat转QImage
offset为重叠区域, 比如拼接a,b两张图片,a图片包含内容m和n, b图片包含内容n和j,a和b图片有重叠内容为n,拼接成功后图片显示为m+n+j,即只显示一次重叠部分。左右拼接后的图像宽度为a.width+b.width-offset,上下拼接后的图像高度为a.height+b.height-offset;clone true 表示与 Mat 不共享内存,更改生成的 mat 不会影响原始图像,false 则会与 mat 共享内存;mat1和mat2为两个待拼接的源图像;主要包含左右拼接和上下拼接。原创 2023-11-20 14:52:07 · 809 阅读 · 1 评论