取得一副图像,需要完成分拣功能,如下图,
可以粗略分析出完成这个图像处理的步骤:
(1)读图;
(2)阀值化;
(3)连通;
(4)填充;
(5)选择特征;
下面尝试使用不同的方法来完成:
方法一:
今天学习了用Halcon做模板,还算比较成功,但是多找了一个圆,原因还不知道,以后补充!
dev_update_window('off')
*读图片
read_image(Image, 'C:/Documents and Settings/Administrator/桌面/桌面/螺钉分拣.bmp')
*清除窗口
dev_clear_window()
*关闭窗口
dev_close_window()
*获取图片大小
get_image_size(Image, Width, Height)
*打开窗口
dev_open_window(0, 0, Width, Height, 'black', WindowHandle1)
*显示Image
dev_display(Image)
*按照轮廓显示
dev_set_draw('margin')
*选中需要建立模板的区域,记下坐标值,填充gen_rectangle()函数,不用每次都画
* draw_rectangle1(WindowHandle1, Row1, Column1, Row2, Column2)
*创建一个平行于坐标轴的矩形
gen_rectangle1(Rectangle, 203.5, 314.5, 296.5, 384.5)
*在一个图像中的一个区域中采集图像
reduce_domain(Image, Rectangle, ImageReduced)
*全局二值化阈值分割
bin_threshold(ImageReduced, Region1)
*将阈值分割后的面积分开
connection(Region1, ConnectedRegions1)
*把一个范围内的区域忽略掉
fill_up_shape(ConnectedRegions1, RegionFillUp1, 'area', 1, 100)
*闭合一个区域一个圆形的结构化元素
closing_circle (RegionFillUp1, RegionClosing, 3.5)
*????????
gen_contour_region_xld (RegionClosing, Contours, 'border_holes')
*????????
create_shape_model_xld (Contours, 3, rad(0), rad(360), 'auto', 'auto', 'ignore_local_polarity', 5, ModelID2)
*
get_shape_model_contours (ModelContours1, ModelID2, 1)
*
find_shape_model (Image, ModelID2, rad(0), rad(360), 0.921, 10, 0.5, 'least_squares', 0, 0.95, Row3, Column3, Angle1, Score1)
*
for i := 0 to 3 by 1
*
vector_angle_to_rigid (0, 0, 0, Row3[i], Column3[i], Angle1[i], HomMat2D1)
*
affine_trans_contour_xld (ModelContours1, ContoursAffinTrans1, HomMat2D1)
endfor
方法二:
dev_update_window('off')
read_image(Image, '分类管理/学习/Halcon_Along/分拣螺钉/螺钉分拣.bmp')
get_image_pointer1(Image, Pointer, Type, Width, Height)
dev_open_window(0, 0, Width, Height, 'black', WindowHandle)
dev_display(Image)
threshold(Image, Region, 0, 150)
connection(Region, ConnectedRegions)
*填充
fill_up(ConnectedRegions, RegionFillUp)
*其中参数and的意思是指Features(特征)可以组合在一起
select_shape (RegionFillUp, SelectedRegions, ['area', 'circularity'], 'and', [1000,0.95], [5000,1.00])
dev_display(Image)
dev_display(SelectedRegions)