只用来记录学习笔记
霍夫直线变换:
r=xcosθ+ysinθ
任取一个点,做0-180度(或者0-360)直线,每条直线有一个(θ,r),这样就能绘制出如图的曲线:
如果有三个点的(θ,r)曲线都交于一点(假设(θ=1,r=8)),那就说明三个点在一条直线上,那条直线就是相交的那个点(θ=1,r=8)所代表的直线。
cv::HoughLines(
InputArray src, // 输入图像,必须8-bit的灰度图像
OutputArray lines, // 输出的极坐标来表示直线
double rho, // 生成极坐标时候的像素扫描步长
double theta, //生成极坐标时候的角度步长,一般取值CV_PI/180
int threshold, // 阈值,只有获得足够交点的极坐标点才被看成是直线
double srn=0;// 是否应用多尺度的霍夫变换,如果不是设置0表示经典霍夫变换
double stn=0;//是否应用多尺度的霍夫变换,如果不是设置0表示经典霍夫变换
double min_theta=0; // 表示角度扫描范围 0 ~180之间, 默认即可
double max_theta=CV_PI
)
代码:
- 提取边缘:
Canny(src, gray_src, 150, 200);
cvtColor(gray_src, dst, CV_GRAY2BGR);
提取边缘的笔记:opencv学习笔记17-边缘检测-Canny算法
- 霍夫直线检测:
vector<Vec4f> plines;
HoughLinesP(gray_src, plines, 1, CV_PI / 180.0, 10, 2, 10);
//gray_src:输入图像,必须8-bit的灰度图像
//plines:输出的极坐标来表示直线
//1:生成极坐标时候的像素扫描步长
//CV_PI / 180.0:生成极坐标时候的角度步长,一般取值CV_PI/180
// 10:阈值,只有获得足够交点的极坐标点才被看成是直线
//2:最小直线长度,小于2的都不能算作直线
//10:最大间隔 一条直线中允许间断的最大像素为10,
- 将获得的直线显示出来,用line函数画直线
Scalar color = Scalar(0, 0, 255);
for (size_t i = 0; i < plines.size(); i++) {
Vec4f hline = plines[i];
line(dst, Point(hline[0], hline[1]), Point(hline[2], hline[3]), color, 3, LINE_AA);
}
imshow("final image", dst);
画直线的笔记:opencv学习笔记5-划线、矩阵、圆、椭圆等
效果图: