基于Halcon的视频目标检测之帧差法

初次接触是视频目标跟踪,了解到目标跟踪的第一步是目标检测。这两天,参考了一篇硕博士论文《基于Mean Shift算法和卡尔曼滤波的视频目标跟踪技术研究》,对其中的目标检测部分的思想采用Halcon进行了实践。

采用了帧差法背景差法这两种方法对视频中的运动目标进行了检测。

1、帧差法

帧差法其实比较好理解。可以参考:传送门

帧差法就是将视频序列中连续的两帧或者三帧图像同一位置像素做差,并且通过阈值的设定判断是否为运动目标。

参考的论文给出了它的算法流程图:

基于Halcon的视频目标检测之帧差法_第1张图片

根据这个流程图,在Halcon中编写的程序如下:

*把程序窗口、变量窗口、显示窗体变为off状态 
dev_update_off ()
dev_close_window ()
*读入静态背景/初始化图像序列
read_image (Image, 'E:/目标跟踪/aton_hallway/aton_hallway/bgs/aton_hallway_0025.jpg')
get_image_size (Image, Width, Height)
dev_open_window (0, 0, Width, Height, 'black', WindowID)
set_display_font (WindowID, 14, 'mono', 'true', 'false')
*边缘填充、设置区域显示的颜色数目 
dev_set_draw ('margin')
dev_set_colored (12)
dev_set_line_width (3)
dev_display (Image)
*press run(F5) to continue
disp_continue_message (WindowID, 'black', 'true')
stop ()
*采用帧差法检测运动目标
NumImage:=300
for I:=1 to NumImage-1 by 1
read_image (Image0, 'E:/目标跟踪/001/sample'+I$'d')
read_image (Image1, 'E:/目标跟踪/001/sample'+(I+1)$'d')
rgb1_to_gray (Image0, GrayImage0)
rgb1_to_gray (Image1, GrayImage1)
mean_image (GrayImage0, ImageMean0, 3,3)
mean_image (GrayImage1, ImageMean1, 3,3)
sub_image ( ImageMean1, ImageMean0, ImageSub, 1, 0)
*利用最大类间方差法找到合适阈值
binary_threshold (ImageSub, Region, 'max_separability', 'light', UsedThreshold)
*利用形态学进行二值图像处理
closing_circle (Region, RegionClosing, 1)
shape_trans (RegionClosing, RegionTrans, 'rectangle1')
* endif
dev_display (Image0)
dev_display (RegionTrans)
* stop()
endfor

dev_set_draw ('fill')
dev_update_on ()

运行Halcon程序后的目标检测结果:

基于Halcon的视频目标检测之帧差法_第2张图片

但是也发现在有些帧图像的问题,比如:

基于Halcon的视频目标检测之帧差法_第3张图片基于Halcon的视频目标检测之帧差法_第4张图片

这是由于光照变化引起的背景出现变化导致误检测,可以加select_shape来剔除不满足条件的区域:

select_shape (ConnectedRegion,SelectedRegion, 'area', 'and', 10, 99999)

修改后的程序运行结果如下:

基于Halcon的视频目标检测之帧差法_第5张图片

总结:帧差法算法非常简单容易理解,但是也存在一定的局限性。帧差法需要理想的背景图像。但是在动态的视频序列获取过程中噪声、外界干扰、光线变化等影响比较多。我觉得需要及时更新背景图像。

菜鸟一只,有错误望指出。

对了,我发现Halcon没有办法读取AVI之类的视频格式。(参考的代码运行总出错)所以,用opencv把视频转成图片了,不知道有没有其他的方法。因为在学习阶段,所以没有采用摄像头。


你可能感兴趣的:(Halcon目标跟踪)