例程里有一个类似的,Ctrl+E打开例程,搜measure_circles就行。下面是这个例程的效果。(Halcon11)
大概过程差不多是
大致找到园形区域--亚像素边缘--结果曲线分段--筛选出圆形--拟合
把(x, y) 坐标系中可能对直线做出贡献的点,利用梯度信息把其所有可能形成的所有直线(和梯度方向垂直),转化为极坐标系中的一点(Rou, Theta)(任意一条直线与原点的垂线段,角度和长度组成极坐标值),这样通过把(x,y)坐标系中所有的点进行转化,并把结果在极坐标系中进行累积,可以在累积空间中把真正直线所在的一些点累积的很高,从而可以确定直线的极坐标,转换回去就是直线。
read_image( Image,'fabrik')
rectangle1_domain(Image, ImageReduced, 170,280,310,360)
注意:这里是一个重要的剪切出ROI区域 *** 作,通过图形窗口的‘创建ROI’功能可以手动创建,这里依然对此函数的各个参数做出说明,方便以后非人工 *** 作时候的程序编写:
rectangle1_domain(Image : ImageReduced : Row1, Column1, Row2, Column2 : )
后面四个参数是矩形的两个对角点。
当自动取RoI时候,需要用到:
gen_rectangle2( : Rectangle : Row, Column, Phi, Length1, Length2 : )
中心点位置,角度Phi,半个变长的长度Lengh1,Lengh2,然后利用reduce_domain来确定ROI
sobel_dir(ImageReduced,EdgeAmplitude,EdgeDirection,'sum_abs', 3)
sobel算子来计算边缘的幅值和方向,幅值计算方式是绝对值和除以4,模板大小是3
注意这里面的EdgeDirection结果是一个direction类型的图
dev_set_color('red')
threshold(EdgeAmplitude, Region, 55,255)
reduce_domain(EdgeDirection,Region,EdgeDirectionReduced)
start use hough transform using the direction information
hough_lines_dir( EdgeDirectionReduced,HoughImage, Lines, 4, 2, 'mean', 3, 25, 5, 5, 'true', Angle, Dist)
hough_lines_dir(ImageDir : HoughImage, Lines : DirectionUncertainty, AngleResolution, Smoothing, FilterSize, Threshold, AngleGap, DistGap, GenLines : Angle, Dist)
利用边缘的梯度信息进行hough变换来检测直线,并把结果以Hessian normal form (HNF)格式返回(最后得到一组angle和dist)
gen_region_hline(LinesHNF, Angle,Dist)
生成这些Hessian线条
dev_display('margin')
setcolor,show把(x, y) 坐标系中可能对直线做出贡献的点,利用梯度信息把其所有可能形成的所有直线(和梯度方向垂直),转化为极坐标系中的一点(Rou, Theta)(任意一条直线与原点的垂线段,角度和长度组成极坐标值),这样通过把(x,y)坐标系中所有的点进行转化,并把结果在极坐标系中进行累积,可以在累积空间中把真正直线所在的一些点累积的很高,从而可以确定直线的极坐标,转换回去就是直线
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)