霍夫变换
理论
定义
霍夫变换(Hough Transform)是图像处理中的一种特征提取技术,它通过一种投票算法检测具有特定形状的物体。Hough变换是图像处理中从图像中识别几何形状的基本方法之一。
原则上霍夫变换可以检测任何形状,但复杂的形状需要的参数就多,霍夫空间的维数就多,因此在程序实现上所需的内存空间以及运行效率上都不利于把标准霍夫变换应用于实际复杂图形的检测中。霍夫梯度法是霍夫变换的改进(圆检测),它的目的是减小霍夫空间的维度,提高效率。
原理
1.直线检测
- 将要检测的对象转到霍夫空间中,利用累加器找到最优解,即为所求直线。
霍夫空间
霍夫空间是一种“极坐标”空间(不同于一般意义的极坐标)
而霍夫变换就是将笛卡尔坐标系转化成霍夫空间。
转换:
因此:
1.点(笛卡尔空间)
2.直线(笛卡尔空间)
3.直线(Hough Space)
具体过程
1.首先边缘检测,得到许多点。
2.遍历第一个点的各个
–输入二值化的图像中的每个边缘点的坐标(x,y),通过霍夫变换得到多个矢量(
3.遍历每一个点,得到多条曲线。
–首先构建一个矢量结构变量来代表一个累加器,每个累加器都会对应于前一步得到的每个霍夫空间中的点(
–投票:遍历图像中的每个点,将其对应的(
4.多条曲线相较于一点,这个点在笛卡尔空间对应的直线的就是原图中的直线。
–最终检测,若最终累加器数组中的值大于已经设定的阈值,则认为该点对应的直线为待检测直线。
变换代码
标准霍夫变换函数
1 | void HoughLines(InputArray image, OutputArray lines, double rho, double theta, int threshold, double srn=0, double stn=0 ) |
其中:
输入的图像是 灰度图(最好二值化处理)
输出的是直线数据 (为矢量数据 向量空间中的点(
rho 变量指的是长度步长(单位:像素)。为 double (双精度浮点数)
theta 变量指的是角度步长(单位:弧度)。为 double
int类型的threshold,累加平面的阈值参数
后两个变量先选择忽略,默认为0
渐进概率式霍夫变换
1 | HoughllLinesP(InputArrayimage, OutputArray lines, double rho, double theta, int threshold, minLineLength =, void cv=HoughllLinesP( InputArrayimage, OutputArray lines.double 0, double maxLineGap = 0) |
image:待检测直线的原图像,必须是CV_8C的单通道二值图像。
lines:霍夫变换检测到的直线输出量,每一条直线都由4个参数进行描述,分别是直线两个端点的坐标rho:以像素为单位的距离分辨率。
theta:以弧度为单位的角度分辨率。
threshold:累加器的阈值。
minLineLength:直线的最小长度,当检测直线的长度小于该数值时将会被剔除。
maxLineGap:允许将同一行两个点连接起来的最大距离。
例子1(识别篮板_1)
待识别图像
1 |
|
输出结果:
例子2 (识别篮板2.0—视频)
反正也是屎山,就这吧 😒
1 |
|
现在代码没完全搞清楚,随后好好复盘一下。 😊
!! 这里发现wsl(不知道是不是只有wsl有这种情况) 对ffmpeg好像不一定会默认下载好,这会导致视频无法读取,在这里报错break出来
1 | if (!isopen()){ |
所以需要下载ffmpeg并且启动,可以用ffplay Videos/q.mp4
在terminal
里来检验ffmpeg是否能够正常使用,正常会有输出结果。
之后ffmpeg好像还得和Opencv库一样写在CMakeLists.txt文件里,再cmake
一下。