做了一个极其简陋的动态跟踪
调用笔记本电脑自带摄像头,发现画面中的橙色目标并标记
基本思路:
没有采用HSV,就用了之前Helcon学习(1)中改进前的方法。
但由于夜间灯光不好,有时不能区分肤色和橙色目标,于是对sub_image和threshold的参数进行了比较极端的设置。
* Image Acquisition 01: Code generated by Image Acquisition 01
open_framegrabber ('DirectShow', 1, 1, 0, 0, 0, 0, 'default', 8, 'rgb', -1, 'false', 'default', '[0] Chicony USB2.0 Camera', 0, -1, AcqHandle)
dev_open_window (0, 0, 800, 450, 'black', WindowHandle)
while (true)
grab_image (Image, AcqHandle)
grab_image_async (Image, AcqHandle, -1)
zoom_image_factor (Image, Image, 0.625,0.625, 'constant')
dev_display (Image)
decompose3 (Image, R, G, B)
*由于夜间灯光不好 经常出现把肤色也选中的bug 于是做了以下暴力魔改
*3倍的相减!!!
sub_image (R, G, ImageSub, 3, 0)
*150的阈值!!!
threshold (ImageSub, Regions, 150, 255)
*当画面中没有出现目标(橙色)时 有可能会将肤色当作目标
*但一旦目标出现 不会再出现误判
connection (Regions, ConnectedRegions)
select_shape_std (ConnectedRegions, SelectedRegions, 'max_area', 70)
*矩形框
smallest_rectangle1 (SelectedRegions, Row1, Column1, Row2, Column2)
rCenter := [(Row1 + Row2)/2,(Column1 + Column2)/2]
rWidth := (Column2 - Column1)/2
rHeight := (Row2 - Row1)/2
gen_rectangle2_contour_xld (Rectangle, rCenter[0], rCenter[1],0, rWidth, rHeight)
dev_display (Rectangle)
*写字
set_tposition (WindowHandle, Row1 - 30, Column1)
write_string (WindowHandle, '中心坐标:')
set_tposition (WindowHandle, Row1 - 15, Column1)
Coordinate := 'R=' + rCenter[0] + ' C=' + rCenter[1]
write_string (WindowHandle, Coordinate)
endwhile
close_framegrabber (AcqHandle)
画面中没有橙色目标的时候,会选中背景中的饮料瓶或者人脸/胳膊
画面中有目标的时候,会正常显示目标