天天看点

Halcon_Hough变换检测直线,检测圆

按:为回复Halon论坛的帖子“如何利用霍夫变换检测图像的倾斜角度”,作者试着用Halcon实现Hough line的直线检测;然后对此进行延伸——用Halcon做了Hough circle圆检测。谨以此文做一下总结。

背景资料:

Hough直线检测圆检测的原理部分,可参考这一帖子,文中对这一原理解释得十分详尽。参看:http://blog.163.com/yuyang_tech/blog/static/21605008320130233343990/

测试代码:

//Line detection

read_image (Image, 'E:/Halcon_projects/Hough_LineCircle/HoughToFindLine.bmp')

* Detect edges (amplitude) using the Sobel operator

sobel_amp (Image, EdgeAmplitude, 'thin_sum_abs', 9)

dev_set_color ('red')

threshold (EdgeAmplitude, Region, 70, 255)

hough_lines (Region, 8, 400, 5, 5, Angle, Dist)

hough_line_trans(Region, HoughImage, 4)

dev_set_color ('blue')

* Store input lines described in HNF

gen_region_hline (Regions, Angle, Dist)

degree := deg(Angle)

//Circle detection

read_image(Image_circle,'E:/Halcon_projects/Hough_LineCircle/Circle_detection.jpg')

sobel_amp(Image_circle, EdgeAmplitude1, 'sum_abs', 5)

threshold(EdgeAmplitude1, Region_circle, 80, 255)

* Detect Circle 1

hough_circles(Region_circle, RegionOut1, 10, 80, 1)

connection(RegionOut1, ConnectedRegions1)

* Detect Circle 2

hough_circles(Region_circle, RegionOut2, 195, 70, 1)

hough_circle_trans(Region_circle, HoughImage1, 195)

connection(RegionOut2, ConnectedRegions2)

1. 直线检测

halcon的函数原型为hough_lines(RegionIn : : AngleResolution,Threshold,AngleGap,DistGap :Angle,Dist)

* 要求输入的Object为Region;

* AngleResolution用于控制直线的检测精度(AngleResolution=2时,检测精度为1/2度);

* Threshold即为目标线/轮廓落在Hough Line上的像素个数;

* AngleGap和DistGap用于控制所有直线检测结果中,近似直线的区分度。如a)两条几乎重叠但存在小角度的直线,可调整AngleGap这一参数使检测结果唯一, b) 两条几乎平行但和距离很近的直线,DistGap参数可进行控制这一情形。

* Angle和Dist即为直线极坐标表示法下的两个参数:原点到直线的距离和直线垂线的方位角。

首选调整AngleResolution这一参数得到预期结果,然后在对其余参数进行优选,保证检测结果稳定。

测试图:

Halcon_Hough变换检测直线,检测圆

变换至Hough平面:

Halcon_Hough变换检测直线,检测圆

检测结果:

Halcon_Hough变换检测直线,检测圆

2. 圆检测

Hough圆检测在Halcon上的实现较为简单,输入仍为Region,而OpenCV的HoughCircles则基于图像梯度进行检测。函数原型:hough_circles(RegionIn : RegionOut : Radius,Percent,Mode : )

* RegionIn 要求输入的Object为Region;

* RegionOut 检测得到的可能的圆心位置,单个圆检测的结果区域可能为3~4个像素区域,不一定为单像素;

* Radius和Percentage 程序设计者需预先知道像素半径值Radius。Percentage为待检测圆的完整度,对于完整的圆90%应该就行了;

* Mode

0: 此模式下,设定的Radius半径针对圆区域(往往是圆环)的外边缘

1:设定的半径Radiu针对圆环中间线

结果--4个小圆:

Halcon_Hough变换检测直线,检测圆

直线检测原图,可至Halcon论坛中相应帖子下载: http://www.ihalcon.com/read-6632-1.html#63713。

圆检测的图片,见附件

继续阅读