霍夫变换-可以实现传统几何形状的检测
霍夫直线变换原理介绍
Hough Line Transform用来做直线检测(前提条件是边缘检测已经完成)
霍夫直线检测实质上是平面空间到极坐标空间转换关系
对于任意一条直线上的所有点来说
变换到极坐标中,从[0~360]空间,可以得到r的大小
属于同一条直线上点在极坐标空间(r, θ \thetaθ)必然在一个点上有最强的信号出现,根据此反算到平面坐标中就可以得到直线上各点的像素坐标,从而得到直线=
1.上的像素点全部变为极坐标空间 形成一条一条的曲线
2.无数个像素点绘制的成曲线如果相交在一个点表明这些像素点都属于同一条直线
3.需要去找直线相交的交点
4.如何找交点?把曲线经过的点都加1 然后相交的地方数值越加越大颜色越来越白(灰度值越来越多)
霍夫直线变换介绍
●对于任意- 条直线上的所有点来说
●变换到极坐标中 ,从[0~360)空间,可以得到r的大小
●属于同一条直线上点在极坐标空间(r,theta)必然在一个点
上有最强的信号出现,根据此反算到平面坐标中就可
以得到直线上各点的像素坐标,从而得到直线
霍夫变换 API
●标准的霍夫变换 cv:Houghlines从平面坐标转换到霍夫
空间,最终输出是(θ,rθ) 表示极坐标空间(把平面坐标像素点转换为极坐标空间曲线)
霍夫变换直线概率cv:HoughLinesP(极坐标曲线交点得出后自动反算为屏幕坐标像素点)最终输出是直线的
两个点(x0,y0 | x1,y1)
标准的霍夫变换cv::HoughLines从平面坐标转换到霍夫空间,最终输出(θ \thetaθ,rθ r_\thetarθ)表示极坐标空间
cv::HoughLines//需要自己反变换到平面空间 一般为有经验的开发者使用
(
InputArray src,//输入图像,必须是8位的灰度图像
OutputArraylines,//输出的极坐标来表示直线
double rho,//生成极坐标时候的像素扫描步长,一般取值为1
double theta,//生成极坐标时候的角度步长,一般取CV_PI/180 对于每一个点将其投影至极坐标系下,要对每一个角度求一个r值,最后要看哪一个(r,theta)值达到某一个阈值,视为可能的直线,这里的角度步长,相当于划分角度的密度
int threshold,//阈值,只有获得足够交点的极坐标点才被看成是直线
double srn = 0,//是否应用多尺度(可用图像金字塔)的霍夫变换,如果不需要 设置0表示经典霍夫变换
double stn = 0,//是否应用多尺度的霍夫变换,如果不需要 设置0表示经典霍夫变换
double min_theta = 0,//表示角度扫描范围0~180之间,默认即可
double max_theta = CV_PI
)
霍夫变换直线概率cv::HoughLinesP最终输出是直线的两个点(x0,y0,x1,y1)
由于HoughLines运行复杂且不准确 所以此API是常用API
cv::HoughLinesP
(
InputArray src–输入图像,必须是8bit的灰度图像
OutputArray lines–输出的笛卡尔坐标来表示直线
double rho–生成极坐标时候的像素扫描步长
double theta–生成极坐标时候的角度步长,一般取CV_PI/180
int threshold–阈值,只有获得足够交点的极坐标点才被看成是直线(输入10就好)
double minLineLength = 0–最小直线长度 (假设为5 小于5的直线长度 被 否认为直线)
double maxLineGap = 0–最大间隔(两端直线之间隔了一些像素 是否判断间隔属于直线)
)
http://www.seotest.cn/jishu/45006.html 霍夫变换 详细说明
霍夫直线检测过程
#include <opencv2/opencv.hpp>
#include <opencv2/highgui/highgui_c.h>
#include <iostream>
#include <math.h>
using namespace cv