halcon算子详解——disp_message
技术标签: HALCON
算子:disp_message( : : WindowHandle, String, CoordSystem, Row, Column, Color, Box : )
功能:此过程将编写一条文本消息。
此过程在图形窗口“窗口句柄”中的位置(Row,Column)显示文本。
如果仅定义一个位置,则为String的每个元素显示一个文本行。 “ \ n”将被解释为换行符。
文本的位置可以在窗口坐标(坐标系=“窗口”)或图像坐标(坐标系=“图像”)中指定,这在使用缩放图像时非常有用。除了提供(行,列)坐标外,还可以将预定义值传递给行和列,以在窗口中的固定位置显示文本(仅当CoordSystem ='window'时)。
参数Color也接受值的数组。在这种情况下,对于每个新的文本位置或每个新的文本行,如果使用单个位置,则循环使用指定的颜色。
Box参数,如果设置为“ true”,则文本将写在橙色框中,如果设置为“ false”,则不会显示任何框。Box的可选第二个值控制是否显示阴影。
输入参数: WindowHandle图形窗口的窗口句柄,显示消息的位置。
String包含要显示的文本消息的字符串数组。数组的每个值将显示在一行中。
CoordSystem如果设置为“窗口”,则相对于窗口坐标系给出文本位置。 如果设置为“图像”,则使用图像坐标(这在缩放图像中可能很有用)。默认值'window',有'window'和'image'两个选项。
Row所需文本位置的垂直文本对齐方式或行坐标。 -1映射到12。默认值12.建议值:10, 12, 20, 30, 'bottom', 'center', 'top'。
Column所需文本位置的水平文本对齐方式或列坐标。 -1映射到12。默认值12.建议值:10, 12, 20, 30, 'center', 'left', 'right'。
Color将文本的颜色定义为字符串。 如果设置为[]或'',则使用当前设置的颜色。 如果传递了字符串元组,则颜色将循环用于每个新位置或文本行。默认值black。
Box如果设置为“ true”,则文本将写在橙色框中。 如果设置为“ false”,则不会显示任何框。 如果设置为颜色字符串(例如'white','#FF00CC'等),则文本将以该颜色的框书写。 可选地,第二个值控制盒子阴影的外观。默认值true。可选项'true', 'false', 'white', 'red', 'forest green', 'black', 'blue'。
例程:
*打开窗体得到窗体句柄
dev_open_window (0, 0, 512, 512, 'black', WindowHandle)
*设置 字体
set_display_font (WindowHandle, 16, 'mono', 'true', 'false')
* [ ]中括号是数组
disp_message (WindowHandle, ['Hello','world!'], 'window', 12, 12, ['black','blue'], 'true')
disp_message (WindowHandle, ['Hello','world!'], 'window', 12, 120, 'white', ['blue','false'])
*定义变量 [ ]中括号是数组
Angle := [0,90,180,270]
Row := 200 - sin(rad(Angle))*100 *行坐标 行中心坐标减上移坐标 上移坐标靠sin正弦函数算出 下面同理
Column := 250 + cos(rad(Angle))*100
Color := ['green','red','red','red']
*参数1: WindowHandle要写出窗体的句柄,参数2:要写的字符串 例如:Angle+' deg'指显示已经在前面定义的变量角度加字符串deg
*参数3:坐标系 可选择图像或窗体 这里选择的是窗体 参数4:横纵坐标 这里多个坐标循环写入
*参数5:颜色默认为黑色 这里用color数组来表示多个颜色 参数6:box文本框 如果不显示则是 false 如果显示true 默认是橘色也可以直接写颜色例如例如'white','#FF00CC'等
注意这里的参数2是角度是数组多个值,参数3、4 坐标是循环写入时调用多次,参数5颜色也是数组
disp_message (WindowHandle, Angle+' deg', 'window', Row, Column, Color, 'false')
*画轮廓 参数1:Cross 十字,参数2、3:行列坐标,参数4:size 生成图像大小,参数5:angle 生成图像的角度
gen_cross_contour_xld (Cross, 200, 250, 200, 0)
模板匹配案例详解
dev_update_window ('off')
* image acquisition and window size
*抓图 虚拟采图接口
open_framegrabber ('File', 1, 1, 0, 0, 0, 0, 'default', -1, 'default', -1, 'default', 'board/board.seq', 'default', -1, 1, FGHandle)
*从指定的图像采集设备同步抓取图像FGHandle采图设备句柄
grab_image (ModelImage, FGHandle)
*防问通道的指针 get_image_pointer1(图片;::指针,类型,宽度,高度)
get_image_pointer1 (ModelImage, Pointer, Type, Width, Height)
dev_close_window ()
dev_open_window (0, 0, Width, Height, 'white', WindowHandle)
*显示部分比窗体高宽小1
dev_set_part (0, 0, Height - 1, Width - 1)
*显示图片
dev_display (ModelImage)
* colors and other settings for the visualization
*显示设置颜色是黄色
dev_set_color ('yellow')
*显示设置画轮廓
dev_set_draw ('margin')
*显示设置线条宽度为2
dev_set_line_width (2)
*设置显示字体
set_display_font (WindowHandle, 14, 'mono', 'true', 'false')
*继续显示消息
disp_continue_message (WindowHandle, 'black', 'true')
stop ()
* ------------------- start of the application ----------------
* step 1: select the model object
Row1 := 188
Column1 := 182
Row2 := 298
Column2 := 412
*创建一个与坐标轴平行的矩形
gen_rectangle1 (ROI, Row1, Column1, Row2, Column2)
dev_display (ROI)
*缩减区域,缩放原区域至新的范围,新范围必须是原范围的子域。从ModelImage照ROI缩小得到新区域ImageROI
reduce_domain (ModelImage, ROI, ImageROI)
disp_continue_message (WindowHandle, 'black', 'true')
stop ()
* step 2: create the model
*inspect检查图形模板 参数1:输入图像 参数2:输出图像 金字塔 参数3:输入模板金字塔
*参数4:金字塔层数 *参数5:对比度
inspect_shape_model (ImageROI, ShapeModelImages, ShapeModelRegions, 8, 30)
dev_clear_window ()
dev_set_color ('blue')
dev_display (ShapeModelRegions)
*用来得到面积中心 参数1:输入目标区域 参数2:输出目标区域的面积AreaModelRegions 参数3、4:输出目标区域中心的行列坐标
*注意得到的可能是数组
area_center (ShapeModelRegions, AreaModelRegions, RowModelRegions, ColumnModelRegions)
*计算图像中有多少个元素
count_obj (ShapeModelRegions, HeightPyramid)
*通过循环得出面积大于15的金字塔等级数 来优化金字塔等级 等级越高准确率越高但速度越慢
for i := 1 to HeightPyramid by 1
if (AreaModelRegions[i - 1] >= 15)
NumLevels := i
endif
endfor
*创造生成图形模板 参数1;输入图像 参数2:最大金字塔等级 参数3、4:图像旋转角度范围
*参数5:旋转角度分辨率这里是auto自动设置 参数6:优化模型的方法
create_shape_model (ImageROI, NumLevels, 0, rad(360), 'auto', 'none', 'use_polarity', 30, 10, ModelID)
*获取模板图形的轮廓 参数1:模板图形 参数2:模板句柄 参数3:图形金字塔层级
get_shape_model_contours (ShapeModel, ModelID, 1)
*显示连续信息因为下一句是停止 用来提示可以继续
disp_continue_message (WindowHandle, 'black', 'true')
stop ()
* step 3: find the object in other images
for i := 1 to 20 by 1
*从采图设备获取图片
grab_image (SearchImage, FGHandle)
*在图像中查找形状最佳匹配项 参数1:SearchImage输入图像 参数2:模板句柄 参数3、4:旋转范围
*参数5:要找模型实例的最低分 参数6:要找图像的个数1 参数7:重叠度 8:最小增量 9:
find_shape_model (SearchImage, ModelID, 0, rad(360), 0.7, 1, 0.5, 'least_squares', 0, 0.7, RowCheck, ColumnCheck, AngleCheck, Score)
*得分绝对值四舍五入=1
if (|Score| == 1)
dev_set_color ('yellow')
*仿射变换 参数1、2:原点行列坐标,3:旋转角度Angle 4、5、6:变换点的行列坐标角度 7:输出变换矩阵
vector_angle_to_rigid (0, 0, 0, RowCheck, ColumnCheck, AngleCheck, MovementOfObject)
*轮廓防射变换 参数1:输入轮廓 2:输出变换后 轮廓 3:输入变换矩阵
affine_trans_contour_xld (ShapeModel, ModelAtNewPosition, MovementOfObject)
dev_display (SearchImage)
dev_display (ModelAtNewPosition)
endif
if (i != 20)
disp_continue_message (WindowHandle, 'black', 'true')
endif
stop ()
endfor
* ------------------- end of the application -----------------
* clean up
*清除模板
clear_shape_model (ModelID)
dev_update_window ('on')
*关闭图像采集器
close_framegrabber (FGHandle)