通常这是一幅边缘图像,比如来自 Canny算子。cv:: Houghlines函数的输出是
cV::Vec2f向量,每个元素都是一对代表检测到的直线的浮点数(p,0)。在下例中
我们首先应用 Canny算子获取图像轮廓,然后基于霍夫变换检测直线
这个函数的的表达直线的方式用的不习惯的话可以用下面这个。
HoughLinesP函数的原型为:
void HoughLinesP(InputArray image,OutputArray lines, double rho, double theta, int threshold, double minLineLength=0,double maxLineGap=0 )
image为输入图像,要求是8位单通道图像
lines为输出的直线向量,每条线用4个元素表示,即直线的两个端点的4个坐标值
rho和theta分别为距离和角度的分辨率
threshold为阈值,即步骤3中的阈值
minLineLength为最小直线长度,在步骤5中要用到,即如果小于该值,则不被认为是一条直线
maxLineGap为最大直线间隙,在步骤4中要用到,即如果有两条线段是在一条直线上,但它们之间因为有间隙,所以被认为是两个线段,如果这个间隙大于该值,则被认为是两条线段,否则是一条。
int main()
{
Mat img = imread("D:\\pdf2jpg\\nn\\00010.jpg");
//GetRedComponet(img);
Mat contours,res;
Canny(img,contours,125,350);
cvtColor( contours, res, CV_GRAY2BGR );
vector<Vec4i> lines;
HoughLinesP(contours, lines, 1, CV_PI/180, 80, 30, 10 );
for( size_t i = 0; i < lines.size(); i++ )
{
Vec4i l = lines[i];
line(res, Point(l[0], l[1]), Point(l[2], l[3]), Scalar(0,0,255), 2);
}
imwrite("D:\\dst1.jpg",res);
}
统计概论霍夫直线检测houghlinesP是一个改进,不仅执行效率较高,而且能检测到直线的两个端点。
思想:
先随机检测出一部分直线,然后将直线上点的排查掉,再进行其他直线的检测
1. 首先仅统计图像中非零点的个数,对于已经确认是某条直线上的点就不再变换了。
2. 对所以有非零点逐个变换到霍夫空间
a. 并累加到霍夫统计表(图像)中,并统计最大值
b. 最大值与阈值比较,小于阈值,则继续下一个点的变换
c. 若大于阈值,则有一个新的直线段要产生了
d. 计算直线上线段的端点、长度,如果符合条件,则保存此线段,并mark这个线段上的点不参与其他线段检测的变换