例子在HDevelop自带例子里面,叫clip;这里讲我实验的内容,机械视觉目的:检测照片中图像,标记中心位置及其方向,代码如下:
dev_update_window ('off')
read_image (Image, 'E:/test2.jpg')
get_image_size (Image, Width, Height)
dev_close_window ()
dev_open_window (0, 0, Width , Height, 'black', WindowID)
dev_display (Image)
set_display_font (WindowID, 14, 'mono', 'true', 'false')
disp_continue_message (WindowID, 'black', 'true')
stop ()
threshold (Image, Regions, 49, 95)
connection (Regions, Regions)
select_shape (Regions, SelectedRegions, 'area', 'and', 1380, 2242)
dev_set_draw ('fill')
dev_set_colored (12)
dev_display (SelectedRegions)
disp_continue_message (WindowID, 'black', 'true')
stop ()
dev_display (Image)
dev_set_color ('green')
dev_display (SelectedRegions)
orientation_region (SelectedRegions, Phi)
area_center (Regions, Area, Row, Column)
dev_set_line_width (3)
dev_set_draw ('margin')
Length := 80
for i := 0 to |Phi| - 1 by 1
dev_set_color ('blue')
disp_arrow (WindowID, Row[i], Column[i], Row[i] - Length * sin(Phi[i]), Column[i] + Length * cos(Phi[i]), 4)
disp_message (WindowID, deg(Phi[i])$'3.1f' + ' deg', 'image', Row[i], Column[i] - 100, 'black', 'false')
endfor
这是原始图,找了张白纸自己记号笔画的,然后用手机拍的照片。
结果图像如上图。
下面一步一步说代码:
dev_update_window ('off')怎么样,是不是比opencv简单明了,当然opencv也可以做到,找到对应的相关函数和算子,然后按照这个思路编程就好,就是到了直方块图时候就比较麻烦。
这句如字面意思,就关闭窗口图形的刷新
read_image (Image, 'E:/test2.jpg')
这句也如字面,读取图像,可以在算子窗口输入,然后在filename打开图片所在位置,点击确定即可直接插入上面的程序,算子窗口如下:
get_image_size (Image, Width, Height)
如字面意思,获取图像的尺寸;
dev_close_window ()
dev_open_window (0, 0, Width , Height, 'black', WindowID)
dev_display (Image)
set_display_font (WindowID, 14, 'mono', 'true', 'false')
disp_continue_message (WindowID, 'black', 'true')
stop ()
上面这几句也如字面意思,主要是窗口显示的样式及消息提醒什么的(比如按F5继续等),写程序也可运行,窗口会默认显示步骤;
threshold (Image, Regions, 49, 95)
这句很重要,是灰度直方块图的阈值算子,这个一定要点击灰度直方块图命令来输出,你可以通过调节阈值范围来去除不需要的图形和干扰,如下图中右图里,红色90的那条线就是,就是灰度阈值范围在0-90之间,调节时候右图回随着阈值变化而变化,记得点插入代码上面“阈值”前面有个小图标,这个是实时显示的,不然你调时候右图不会刷新,调到你满意然后点击插入代码就可以,如上面的代码:
connection (Regions, Regions)
这句写就可以了,如字面计算连通域的命令,是为了特征直方块图做准备的;
select_shape (Regions, SelectedRegions, 'area', 'and', 1380, 2242)
这句是特征直方图的代码,灰度直方图一样,不用写,在特征直方图中调出即可,样式如下图:
dev_set_draw ('fill')
dev_set_colored (12)
dev_display (SelectedRegions)
disp_continue_message (WindowID, 'black', 'true')
stop ()
dev_display (Image)
dev_set_color ('green')
dev_display (SelectedRegions)
上面语句也是界面显示的,可以按F1查看帮助,这里不赘述了
orientation_region (SelectedRegions, Phi)
这句是计算图形方向的算子,Phi是角度,计算方法是计算图形长宽比例,长方向,窄边为方向向量;
area_center (Regions, Area, Row, Column)
这句是计算图形中心的算子
dev_set_line_width (3)
线宽
dev_set_draw ('margin')
画斜线
Length := 80
线长
for i := 0 to |Phi| - 1 by 1
dev_set_color ('blue')
disp_arrow (WindowID, Row[i], Column[i], Row[i] - Length * sin(Phi[i]), Column[i] + Length * cos(Phi[i]), 4)
disp_message (WindowID, deg(Phi[i])$'3.1f' + ' deg', 'image', Row[i], Column[i] - 100, 'black', 'false')
endfor
这句是循环以图形中心划线,画箭头,并在中心位置标记角度的文字。