看到一句非常入心的话:天雨大不润无根之草,道法宽只度有缘之人!
说的就是这个理,所有的因果都要追至事物的本质。从古至今,从国家到个人,如果只是华而不实、外强中干,就算机会、机遇在你身旁,你能做的也只能是眼睁睁的看它溜走。
如果想做出点什么,
想收获更多
…
那就撸起袖子加油干!
——《Y忍冬草》
本例程代码主要讲解的是通过形状匹配获取物体,具有抗光照变化和旋转不变性!
1、代码
*
* online shape-based matching with adaptation to illumination changes
* rotational invariant
* rotation/translation to "normalize" the input image
*
* set online to true if you are using an image acquisition device
* if online is set to false, a virtual image acquisition device is opened which reads an image sequence from hard disk
*
online := false
VisUndefPixelBlack := 1
* 关闭窗口更新
dev_update_window ('off')
dev_update_pc ('off')
dev_update_var ('off')
dev_update_time ('off')
* 根据是否是在线抓图,选择抓图方式
if (online)
* open the 'real' image acquisition device
info_framegrabber ('1394IIDC', 'revision', RevisionInfo, RevisionInfoValues)
open_framegrabber ('1394IIDC', 1, 1, 0, 0, 0, 0, 'default', -1, 'default', -1, 'default', 'default', 'default', -1, -1, AcqHandle)
else
* open the virtual image acquisition device
info_framegrabber ('File', 'general', Information, ValueList)
open_framegrabber ('File', 1, 1, 0, 0, 0, 0, 'default', -1, 'default', -1, 'default', 'pendulum/pendulum', 'default', -1, 1, AcqHandle)
endif
grab_image (Image, AcqHandle)
get_image_size (Image, Width, Height)
dev_close_window ()
dev_open_window (0, Width + 30, Width, Height, 'black', WindowRot)
dev_open_window (0, 0, Width, Height, 'black', WindowID)
* 设置当前活动窗口
dev_set_window (WindowID)
* 设置显示图像大小
dev_set_part (0, 0, Height - 1, Width - 1)
dev_set_window (WindowRot)
dev_set_part (0, 0, Height - 1, Width - 1)
dev_display (Image)
set_display_font (WindowID, 16, 'mono', 'true', 'false')
* 创建齐次变换矩阵
hom_mat2d_identity (HomMat2DIdentity)
* disp_continue_message (WindowID, 'black', 'true')
* stop ()
* ------------------------
* select the model object
* ------------------------
if (online)
*
* define template by drawing a rectangle
*
dev_update_pc ('off')
dev_set_window (WindowID)
dev_set_draw ('margin')
dev_set_line_width (5)
grab_image (ImageTempl, AcqHandle)
dev_set_window (WindowID)
dev_display (ImageTempl)
disp_message (WindowID, 'define the template', 'window', 12, 12, 'black', 'true')
dev_set_color ('green')
draw_rectangle2 (WindowID, RowTempl, ColumnTempl, PhiTempl, Length1, Length2)
gen_rectangle2 (Rectangle, RowTempl, ColumnTempl, PhiTempl, Length1, Length2)
dev_display (Rectangle)
reduce_domain (ImageTempl, Rectangle, ImageReduced)
create_shape_model (ImageReduced, 4, 0, rad(360), 'auto', 'none', 'use_polarity', 30, 10, ModelID)
intensity (ImageReduced, Image, TemplMean, Deviation)
dev_update_pc ('on')
else
*
* load default object for virtual framegrabber
*
Length1 := 32.0
Length2 := 12.5
PhiTempl := -0.315
RowTempl := 112.5
ColumnTempl := 92.0
copy_obj (Image, ImageTempl, 1, 1)
gen_rectangle2 (Rectangle, RowTempl, ColumnTempl, PhiTempl, Length1, Length2)
reduce_domain (Image, Rectangle, ImageReduced)
* 创建形状模型
create_shape_model (ImageReduced, 4, 0, rad(360), 'auto', 'none', 'use_polarity', 30, 10, ModelID)
* 计算图像灰度值的均值和偏差
intensity (ImageReduced, Image, TemplMean, Deviation)
endif
* RowRot := RowTempl
* ColumnRot := ColumnTempl
RowRot := Height / 2
ColumnRot := Width / 2
* ------------------------------------------
* visualize normalized input image
* ------------------------------------------
* 根据点和角度计算刚性矩阵
vector_angle_to_rigid (RowTempl, ColumnTempl, PhiTempl, RowRot, ColumnRot, 0, HomMat2DRotate)
* 对图像进行仿射变换
affine_trans_image (ImageTempl, ImageAffineTrans, HomMat2DRotate, 'constant', 'false')
if (VisUndefPixelBlack == 1)
* 将图像扩展到最大尺寸
full_domain (ImageAffineTrans, ImageFull)
dev_set_window (WindowRot)
dev_display (ImageFull)
else
dev_set_window (WindowRot)
dev_display (ImageAffineTrans)
endif
dev_set_window (WindowID)
dev_display (ImageTempl)
disp_message (WindowID, 'run the template matching', 'image', 20, 20, 'yellow', 'false')
disp_message (WindowID, 'run the template matching', 'image', 20, 20, 'yellow', 'false')
disp_message (WindowID, '(click left to start,', 'image', 50, 20, 'yellow', 'false')
disp_message (WindowID, 'right to stop)', 'image', 80, 20, 'yellow', 'false')
* disp_continue_message (WindowID, 'black', 'true')
* stop ()
Button := 0
while (Button != 1)
* 获取当前鼠标状态
get_mbutton (WindowID, dummy, dummy, Button)
endwhile
dev_update_pc ('off')
* ------------------------
* shape-based matching
* ------------------------
Button := 0
Exp := 1
while (Button != 4)
if (online)
grab_image_async (Image, AcqHandle, -1)
else
grab_image (Image, AcqHandle)
endif
count_seconds (Seconds1)
find_shape_model (Image, ModelID, 0, rad(360), 0.7, 1, 0.5, 'least_squares', 0, 0.7, Row, Column, Angle, Score)
if (Score > 0.5)
gen_rectangle2 (Rectangle, Row, Column, PhiTempl + Angle, Length1, Length2)
reduce_domain (Image, Rectangle, ImageReduced)
intensity (ImageReduced, Image, Mean, Deviation)
* Compensate for rotation and translation
vector_angle_to_rigid (Row, Column, PhiTempl + Angle, RowRot, ColumnRot, 0, HomMat2DRotate)
affine_trans_image (Image, ImageAffineTrans, HomMat2DRotate, 'constant', 'false')
count_seconds (Seconds2)
Time := round(1000 * (Seconds2 - Seconds1))
if (VisUndefPixelBlack == 1)
full_domain (ImageAffineTrans, ImageFull)
dev_set_window (WindowRot)
dev_display (ImageFull)
else
dev_set_window (WindowRot)
dev_display (ImageAffineTrans)
endif
dev_set_window (WindowID)
dev_display (Image)
disp_message (WindowID, Time + ' ms', 'window', 12, 12, 'black', 'true')
dev_set_color ('green')
dev_display (Rectangle)
else
dev_display (Image)
endif
* --------------------------
* Exit with mouse click
* --------------------------
dev_error_var (Error, 1)
dev_set_check ('~give_error')
get_mposition (WindowID, R, C, Button)
dev_error_var (Error, 0)
dev_set_check ('give_error')
if (Error != H_MSG_TRUE)
Button := 0
endif
endwhile
* 清除形状模型
clear_shape_model (ModelID)
disp_continue_message (WindowID, 'black', 'true')
stop ()
close_framegrabber (AcqHandle)
dev_set_window (WindowRot)
dev_close_window ()
dev_update_pc ('on')
dev_update_var ('on')
dev_update_time ('on')
dev_update_window ('on')
2、结果
3、算子
- full_domain(Image : ImageFull : : )将图像区域扩展到最大尺寸
- dev_set_window( : : WindowHandle : )设置用于显示的活动窗口
- hom_mat2d_identity( : : : HomMat2DIdentity)定义旋转变换矩
- create_shape_model(Template : : NumLevels, AngleStart, AngleExtent, AngleStep, Optimization, Metric, Contrast, MinContrast : ModelID)创建形状匹配模型
- intensity(Regions, Image : : : Mean, Deviation)计算图像灰度值的均值和偏差
- vector_angle_to_rigid( : : Row1, Column1, Angle1, Row2, Column2, Angle2 : HomMat2D)通过点和角度计算仿射变换矩阵
- affine_trans_image(Image : ImageAffineTrans : HomMat2D, Interpolation, AdaptImageSize : )对图像进行仿射变换
- get_mbutton( : : WindowHandle : Row, Column, Button)等待鼠标按键按下,并获取其状态
- get_mposition( : : WindowHandle : Row, Column, Button)获取鼠标位置及状态
4、参考
- Halcon官方帮助文档