霍夫变换原理
//在边缘检测已经完成时(Canny)霍夫变换用来做直线检测
//将图像有空域转换到极坐标空间
//通过该公式将空域上的像素点转换到极坐标的空间。
//空域上不同的x,y有不同的θ(0-180/0-360)与其对应。在极坐标空间形成了一条曲线。
//若所有曲线汇聚到一点,则这些(x,y)属于同一条直线。
//获得霍夫空间的曲线如何反推回空域坐标。
//向该公式中输入不同的x,得到y值,若y值在图像空间内则保留,超出平面空间则舍弃。
//比较麻烦,一般不使用,因为求到的r,θ需要反变换到空域。
cv::HoughLines{
输入图像(8位灰度图),
输出极坐标来表示直线,
生成极坐标时的像素扫描步长,1
生成极坐标时的角度步长(每次1度),
阈值(获得足够交点的极坐标被看成是直线),
double srn是否用多尺度霍夫变换(0为经典霍夫变换),(图像金字塔)
double stn是否用多尺度霍夫变换(0为经典霍夫变换),
角度扫描范围(0-180)默认即可,
CV_PI
}
//常用API
HoughLinesP
{
输入图像(8位灰度图),
输出极坐标来表示直线,
生成极坐标时的像素扫描步长,1
生成极坐标时的角度步长(每次1度),
阈值(获得足够交点的极坐标被看成是直线),
最小值线长度,(小于该阈值像素的线段,舍弃)
最大间隔//两条线段最大间隔多少个像素认为是一条直线
}
Line()绘制直线
line{
要绘制线段的图像,//24位,只有三通道的图像,颜色赋值才有意义
线段起点,
线段终点,
颜色,
线宽,
线型
}
//从保存霍夫空间极坐标转换到空域坐标的容器中读取起始点与终止点。
for (int i = 0; i < plines.size(); i++)
{
Vec4f hline = plines[i];
line(dst, Point(hline[0], hline[1]), Point(hline[2], hline[3]), color, 3);
}
//注意vector<>的命名空间
using namespce std;
#include<opencv2/opencv.hpp>
#include<iostream>
#include<math.h>
using namespace std;
using namespace cv;
int main()
{
Mat gray_src, out_edge,dst;
Mat src = imread("C:\\Users\\Administrator\\Pictures\\timg.jpg");
if (src.empty())
{
printf("ould not find image \n");
return -1;
}
namedWindow("opencv set up demo", WINDOW_AUTOSIZE);
imshow("opencv set up demo", src);
cvtColor(src, gray_src, COLOR_BGR2GRAY);
Canny(gray_src, out_edge, 100, 200);
cvtColor(out_edge, dst, COLOR_GRAY2BGR);
vector <Vec4f> plines;//注意命名空间std
HoughLinesP(out_edge, plines, 1, CV_PI / 180.0, 10, 0, 50);
//画直线
Scalar color = Scalar(0, 255, 0);
for (int i = 0; i < plines.size(); i++)
{
Vec4f hline = plines[i];
line(dst, Point(hline[0], hline[1]), Point(hline[2], hline[3]), color, 3);
}
imshow("hough", dst);
waitKey(0);
return 1;
}