Halcon找圆系列(1)如何检测圆形

简介: Halcon找圆系列(1)如何检测圆形

一、HALCON 12.0例程里有一个类似的,Ctrl+E打开例程,搜关键字“circle”或者"ball"就行。


请重点关注下measure_circles.hdev,circles.hdev,union_cocircular_contours_xld.hdev,ball.hdev这几个例程。


大概过程差不多是:找到圆形区域--亚像素边缘--结果曲线分段--筛选出圆形--拟合



二、要测量一个圆的直径,可以先通过阈值筛选出黑色部分threshold (Rim, Dark, 0, 128),


然后将选中部分组合connection (Dark, DarkRegions),选择其中类圆度高的部分根据选中部分与圆的相似度筛选出圆型部分select_shape (DarkRegions, Circles, ['circularity','area'], 'and', [0.85,50], [1.0,99999]),


然后选择将所选的类圆区域扩大8.5个像素点作为一个区域,缩小8.5个像素点作为一个区域,然后将连个区域合并,去两个区域不同的部分,那么这个圆区域的边缘就在这个合并区域中,算子如下:


dilation_circle (Circles, ROIOuter, 8.5)

erosion_circle (Circles, ROIInner, 8.5)

difference (ROIOuter, ROIInner, ROI)

union1 (ROI, ROIEdges)


这时我们在用算子edges_sub_pix (RimReduced, Edges, 'lanser2', 0.3, 10, 20)提取其边缘轮廓。


用一个椭圆去近似它(这个圆形区域毕竟不是真正的圆,需要进行拟合)fit_ellipse_contour_xld (RelEdges, 'ftukey', -1, 2, 0, 200, 3, 2, Row, Column, Phi, Ra, Rb, StartPhi, EndPhi, PointOrder)从而得到这个区域的中点坐标 Row, Column,与x轴的角度Phi,半长轴Ra,半短轴Rb,开始角度StartPhi,结束角度EndPhi,这是就可以计算圆的近似半径了。


例子1

dev_clear_window()
dev_close_window()
read_image (read_Image, 'C:/Users/Leason/Desktop/试验/2.jpg')
rgb1_to_gray (read_Image, Image)
get_image_size (Image, Width, Height)
dev_open_window_fit_image (Image, 0, 0, Width/3, Height/3, WindowHandle)
dev_display (Image)
gen_rectangle1 (ROI, 239.876, 8.5, 513.303, 695.5)
reduce_domain (Image, ROI, ImageReduced)
threshold (ImageReduced, ROI, 80, 255)
connection (ROI, DarkRegions)
select_shape (DarkRegions, Circles, ['circularity','area'], 'and', [0.85,50], [1.0,99999])
count_obj (Circles, Number)//计算圆形的数量
select_obj (Circles, PillSelected,1)
dilation_circle (Circles, ROIOuter, 4)
erosion_circle (Circles, ROIInner, 2)
difference (ROIOuter, ROIInner, ROI_dif)
union1 (ROI_dif, ROIEdges)
reduce_domain (ImageReduced, ROIEdges, ImageReduced1)
*提取其边缘轮廓
edges_sub_pix (ImageReduced1, Edges, 'lanser2', 0.3, 10, 20)
*区域的中点坐标Row, Column,与x轴的角度Phi,半长轴Ra,半短轴Rb,开始角度StartPhi,结束角度EndPhi
fit_ellipse_contour_xld (Edges, 'ftukey', -1, 2, 0, 200, 3, 2, Row, Column, Phi, Ra, Rb, StartPhi, EndPhi, PointOrder)


例子2

read_image (Image, 'C:/Users/caiqi/Desktop/halcon计划/测量/_4.png')
get_image_size (Image, Width, Height)
dev_open_window (0, 0, Width, Height, 'black', WindowHandle)
set_display_font (WindowHandle, 16, 'mono', 'true', 'false')
dev_set_draw ('margin')
dev_display (Image)
disp_continue_message (WindowHandle, 'black', 'true')
stop ()
dev_set_colored (12)
dev_set_line_width (2)
dev_set_draw ('fill')
fast_threshold (Image, Region, 200, 255, 20)
connection (Region, ConnectedRegions)
select_shape (ConnectedRegions, SelectedRegions, 'area', 'and', 150, 99999)
dev_display (Image)
dev_display (SelectedRegions)
disp_continue_message (WindowHandle, 'black', 'true')
stop ()
boundary (SelectedRegions, RegionBorder, 'inner_filled')
dev_clear_window ()
dev_display (RegionBorder)
disp_continue_message (WindowHandle, 'black', 'true')
stop ()
edges_sub_pix (Image, Edges, 'canny', 1, 10, 40)
fit_circle_contour_xld (Edges, 'algebraic', -1, 0, 0, 3, 2, Row, Column, Radius, StartPhi, EndPhi, PointOrder)
gen_circle_contour_xld (ContCircle, Row, Column, Radius, 0, 6.28318, 'positive', 1)



三、边缘提取


1、设置ROI兴趣区域


2、快速二值化,并连接相邻区域。


这样做的目的是进一步减少目标区域,通过二值化将目标区域大概轮廓提取出来


3、提取最接近目标区域的轮廓


常用函数有boundary,gen_contour_region_xld


4、根据自己的需求提取需要的初步轮廓


5、将初步提取的初步轮廓进行膨胀操作


6、将膨胀后的区域和原图进行减操作(在这步之前有可能需要对原图进行高斯滤波)。这样就能得到只有边缘的真实图像


7、用canny或其他算子(根据需要)提取亚像素轮廓,一般使用edges_sub_pix函数


8、处理和计算,得到真实的边缘XLD后你可能需要进一步处理得到你想要的线、弧等。


你可能用到的函数segment_contours_xld(分割)  union_collinear_contours_xld(联合相邻或相同角度直线)select_contours_xld(提取想要的轮廓) union_cocircular_contours_xld(联合相同圆)等等


得到轮廓后如果你不知道怎么处理后得到你想要的东西(线、弧、圆、角、矩形)你都可以将轮廓转化为点,然后用点集合来拟合任何你想要的东西。



四、常用的选择和修改区域的算子


select_shape:选择区域


shape_trans:区域变换


union1、union2、intersection、difference、complement、clip_region:常用的组合区域的算子


一些组合区域的操作图解:

image.png



一些变换区域的操作图解:

image.png





---


参考资料


鸟叔封装的halcon rake卡直线 spoke卡圆工具(开源版) v1.3 20190527


https://www.51halcon.com/forum.php?mod=viewthread&tid=228


封装的halcon找顶点的函数-peak


https://www.51halcon.com/forum.php?mod=viewthread&tid=731


Halcon测量圆直径(半径)的方法之暴力拟合法 vs 测量工具法


https://blog.csdn.net/horsee/article/details/82794569


halcon边缘提取和赃物检测的常用方法


https://blog.csdn.net/dearpeer/article/details/40855233


Halcon - 基础03 - 常用的选择和修改区域的算子


https://blog.csdn.net/zdfffg/article/details/83055265


相关文章
圆形算法识别
圆形算法识别
|
3月前
|
算法 计算机视觉 Python
圆形检测算法-基于颜色和形状(opencv)
该代码实现了一个圆检测算法,用于识别视频中的红色、白色和蓝色圆形。通过将图像从RGB转换为HSV颜色空间,并设置对应颜色的阈值范围,提取出目标颜色的区域。接着对这些区域进行轮廓提取和面积筛选,使用霍夫圆变换检测圆形,并在原图上绘制检测结果。
112 0
|
7月前
|
存储 编解码 算法
【Qt&OpenCV 检测图像中的线/圆/轮廓 HoughLinesP/HoughCircles/findContours&drawContours】
【Qt&OpenCV 检测图像中的线/圆/轮廓 HoughLinesP/HoughCircles/findContours&drawContours】
130 0
|
8月前
|
计算机视觉
[Halcon&图像] 彩色图转灰度图处理
[Halcon&图像] 彩色图转灰度图处理
136 1
|
8月前
|
计算机视觉
OpenCV(十三):图像中绘制直线、圆形、椭圆形、矩形、多边形和文字
OpenCV(十三):图像中绘制直线、圆形、椭圆形、矩形、多边形和文字
103 0
|
8月前
[Qt5] 鼠标中心为基准缩放图像(halcon实现)
[Qt5] 鼠标中心为基准缩放图像(halcon实现)
270 0
|
数据安全/隐私保护 计算机视觉
opencv边缘检测加提取(圆形和矩形)
opencv边缘检测加提取(圆形和矩形)
79 0
|
C# 计算机视觉
C#使用OpenCV剪切图像中的圆形和矩形
本文主要介绍如何使用OpenCV剪切图像中的圆形和矩形。
C#使用OpenCV剪切图像中的圆形和矩形
|
数据可视化 算法 安全
自动检测图像中的圆形目标并可视化检测到的圆
说明如何自动检测图像中的圆或圆形目标并可视化检测到的圆。
210 0
|
机器学习/深度学习 传感器 算法
【圆检测】基于霍夫变换检测灰度图像中不同半径的圆附matlab代码
【圆检测】基于霍夫变换检测灰度图像中不同半径的圆附matlab代码