[CV] 模版匹配

API matchTemplate();//模式查找,API比较简单 minMaxLoc();//用于在模式查找的输出图像中找到极值点,也就是匹配点 笔记 模板匹配(Templet Match) 相当于上一节说的直方图匹配的实用化,通过现有图像在目标图像上滑行(原文Slide),也就是左到右上到下的以像素为单位进行匹配,找到匹配值最大的点.但也是因为这个原因,对模板图像和在目标图像里的目标的大小进行匹配就非常重要,如果大小差得远,效果就不好,所以使用条件相当苛刻. 注意输出图像的大小 在API中需要提供一个储存输出结果的Mat, 他的大小是 Size(src.cols-templ.cols+1, src.rows-templ.rows+1) OpenCV的查找模式 OpenCV提供了很多种方法,在官网上都有介绍,大部分都是取用了最大值作为最匹配 根据最小值匹配的只有 TM_SQDIFF 和 MT_SQDIFF_NORMED For the first two methods ( TM_SQDIFF and MT_SQDIFF_NORMED ) the best match are the lowest values. OpenCV中32位的图像 每个数值是一个位于[0,1]间的小数,相当于8位的[0,255] 源//API实现模式查找 // OpenCV_Template.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。 // #include <iostream>#include<opencv2\opencv.hpp> using namespace std; using namespace cv; Mat src, dst, temp; int main(int, char**) { temp = imread("D:/WorkSpace/Projects/OpenCV Learning/ImageHub/Lena....

February 20, 2020 · 2 min

[CV] 直方图均衡化-直方图比较-反向投影

API - equalizeHist();//直方图均衡化 - split();//分离通道 - calcHist();//参数dims,bin,range - waitkey(); - mixChannels//分离通道, 与split小有差别,建议看官方文档 - cvtColer//使用此api转换到hsv色彩空间 - calcHist//接受单通道图像计算直方图, 参数略微复杂 - normalize//归一化,常用 - compareHist//比较直方图,可以得到两张图片的相似程度,但是对光非常敏感 - backProject();//直方图反向投影 笔记 这里是几个关于直方图的总结, 这一堆实在是不太好懂, 并且映射和统计接触到了很多数学方面的东西,重要的是理解思路以及了解API, 这里的东西要是有不理解的都建议去看官方的教程文档 直方图均衡化 好像在人脸识别的项目总结里写过了, API并不难理解 HSV模型 HSV是一种比较直观的颜色模型,所以在许多图像编辑工具中应用比较广泛,这个模型中颜色的参数分别是:色调(H, Hue),饱和度(S,Saturation),明度(V, Value) 直方图比较 compareHist(); API比较方便,输入两个直方图,比较他们的相似程度 这两个直方图通常会是图像的HS直方图(虽然我现在还不太懂HS为什么可以变成一张直方图,到时候要用再看原理好了),用HS猜测是要降低算法对光线的敏感度?(实测好像对光线还是很敏感) OpenCV提供了一共四种方法 相关性计算:{-1, 1} //1最强 卡方计算:{0, ∞} //0最强 十字交叉 巴氏距离计算:{0, 1} //0最强 其中比较推荐的是相关性计算和巴氏距离计算(不需要归一化了hhhhhhhhh) 数学公式不列出了(反正我又不会去看) 直方图反向投影 mixChannels(); backProject(); 直方图反向投影是一种基于色彩的对象识别技术,通过该方法可以定位图像中已知物体的位置,反应直方图在目标图像中的分布 主要思路是提取已知图像的Hue(色相)空间,做出直方图,再反向找到这些色相在目标图片中的分布,已知图像中越多的色相,在backProject中就会(看起来)更亮,利用这点加上一些二值化,就可以得到一张目标物体的掩膜,覆盖到目标图片上就可以得到完成的图像了,如下 源//读取TIM图标, 在桌面截图上找到他 // OpenCV_Template....

February 19, 2020 · 2 min

[CV] Canny边缘检测算法

API Canny(); //Canny的API, 包含了4个步骤. 注意, 不包含高斯模糊部分 笔记 Canny边缘检测算法可以分为以下5个步骤: 使用高斯滤波器,以平滑图像,滤除噪声。(需要调用高斯模糊API) 计算图像中每个像素点的梯度强度和方向。 应用非极大值(Non-Maximum Suppression)抑制,以消除边缘检测带来的杂散响应。 应用双阈值(Double-Threshold)检测来确定真实的和潜在的边缘。 通过抑制孤立的弱边缘最终完成边缘检测。 非极大值抑制: 细化边缘, 但技术的实现细节并不是很懂, 大致思想是取邻域中的梯度极大值点来进行有效边缘的判断, 下面的文章讲的很详细, 可以看看. 关于几种边缘检测方法: Laplance, Canny 和 Sobel 都是边缘检测的方法, Canny是包含了Sobel算子的边缘检测, 所以可以说是Sobel的实际应用, Laplance的检测效果并不好, 但是有其他的用途, 总的来说Canny能应对大多数的场景 参考来源 《A Computational Approach to Edge Detection》 源//对NXP赛道进行下采样和边缘检测 // OpenCV_Template.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。 // #include <iostream>#include <string>#include<opencv2\opencv....

February 16, 2020 · 2 min

[CV] 霍夫线和圆检测

API /*霍夫线检测 输入图像要先Canny过 参数为 - 输入图像 - 输出向量数组,数据类型为Vec4i(就是两个点) - 默认1 - 默认CV_PI / 180, 转角步长 - 阈值(我设了100) - 最小线长 - 最大间隙, 小于这个值的两条线会连成一条, 对于断断续续的线效果好 */ void HoughLinesP( InputArray image, OutputArray lines, double rho, double theta, int threshold, double minLineLength = 0, double maxLineGap = 0 ); /*霍夫圆检测 参数从前往后分别是 - 输入图像矩阵(8bit的灰度图,这个API自带Canny边缘检测) - 输出向量数组,数据类型位Vec3f - HOUGH_GRADIENT - 图像缩放,默认1 - 圆心最小距离, 小于会认为是同心圆? - Canny检测的大阈值,小的=大的除二计算 - 点重叠n个以上判定为圆,越小检出越多圆 - 最小圆半径 - 最大圆半径 */ void HoughCircles( InputArray image, OutputArray circles, int method, double dp, double minDist, double param1 = 100, double param2 = 100, int minRadius = 0, int maxRadius = 0 ); 笔记 圆检测对噪声敏感, 需要先中值滤波 太难了,建议看下面的博客,线检测还好,圆检测真的看不懂 相关 源//检出NXP赛道上的几何图 // OpenCV_Template....

February 16, 2020 · 2 min

[CV] Sobel算子

相关API Sobel();//索贝尔算子 Scharr();//Sobel的加强 笔记 Sobel: 边缘检测算法及各自的优缺点 Sobel是离散的一阶微分算子,可以用来计算图像的梯度(一阶), 常用于得到图像的边缘特征, 除了Sobel之外还有其他的算子, Sobel的优势是速度比较快, 但是在准确度上有欠缺 使用加减来简化计算机的负担: sobel算子的原理与实现 乘除对计算机很费力, 对计算机应该采用近似计算, 在Sobel求边缘的合成阶段使用到了这种思想 整个流程: 高斯->转灰度->求梯度x与y->混合 源 无

February 15, 2020 · 1 min