基于HALCON的视频对象分割及跟踪方法总结
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
halcon:基于HALCON的视频对象分割及跟踪方法总结(..
疯狂代码 / ĵ:http://DeveloperUtil/Article31476.html
基于HALCON的视频对象分割及跟踪方法总结
2006-9-3 22:15:00
前面总结了利用HALCON进行模板匹配的一些方法,讨论了利用物体形状的轮廓进行匹配的步骤和如何来优化匹配的速度,提高匹配的精度和速度,当然这两者之间本身也存在着制约,而在这两者之间找到一个适合自己要求的结合点,正是我们要研究和实验的。模板匹配并不是单纯的一个任务,它是一些其他工作的一个必备环节,比如物体识别、对象跟踪、检验产品、零件统计等等一些机器视觉应用。在很多情况下,模板匹配是个不错的选择。在前面总结模板匹配方法的基础上,利用HALCON做了一些视频对象跟踪的实验,并多次试验来调整程序参数优化跟踪过程,采用标准视频进行测试,将这些方法作了如下总结。
首先来看看HALOCN中的帧采集器(FrameGrabber),HDevelop提供这样一个函数来开启你采用的帧采集器(这里我的理解就是图像采集卡或工业摄像机)open_framegrabber(),这个函数中指定了HALCON目前支持的一些帧采集器的文件参数,主要有'BARRACUDA', 'BaumerFCAM', 'BCAM1394', 'BitFlow',
'DahengCAM', 'DahengFG', 'DFG-BW', 'DFG-LC', 'DirectFile', 'DirectShow', 'DT315x', 'DT3162', 'File',
'FireGrab', 'FirePackage', 'FlashBus', 'FlashBusMX', 'Ginga++', 'GingaDG', 'IDS', 'INSPECTA', 'Leutron', 'MatrixVision', 'MeteorII', 'mEnable3', 'MultiCam', 'Opteon', 'p3i2', 'p3i4', 'PT1000CL', 'PX', 'PXC', 'PXD', 'PXR', 'SaperaLT', 'TAG', 'TWAIN', 'uEye';除此之外,在官方网站上也在逐步推出新支持的一些采集卡,比如近期推出的支持大恒的DahengCAM的USB2.0接口(更多的信息请访问
/halcon/news/)。由于实验条件有限,我在实验中只能采用标准的视频,有CIF和QCIF两种格式的。这个当中我也在摸索,read_sequence()只是读取无格式的图像数据,因为找不到如何直接打开视频文件,所以在实验时只能采用保存好的单帧图像。
在利用模板匹配进行跟踪之前,需要对选定的初始帧或者某一帧进行分割,比如在实验中,采用标准Akiyo视频文件(352×288),我选定初始帧进行分水岭的分割,然后采用马儿可夫随机场的分类,分割出前景对象和背景;也可以直接利用watersheds_threshold()进行阈值化的分割,当然分割的方法还很多,比如基于边缘的,基于区域增长的,基于阈值的,其中基于阈值的用的较多,里面也分为二值化,自动阈值,动态阈值等,各具特点,使用针对图像特征采用不同的方法。如果想进一步的获取精确的分割,可以采用数学形态学算子,这个可以根据具体需要选择不同的膨胀、腐蚀、开、闭操作的结合,这里就不多说了。
对已经分割好的初始帧建立模板,这里没有再确定某个区域,因为是采用已分割的图像。也可以先确定感兴趣区域(ROI),然后在对该区域建立模板,但这样获得的模板就不怎么精确了。接下来的步骤就更按模板匹配的方法来进行,用create_shape_model()来对初始帧创建模板,但这里要注意一点,Metric有个可选项
,use_polarity(匹配时要求有相同的对比度),ignore_global_polarity(在全局上有对比度的情况下仍可匹配),ignore_local_polarity(即使局部灰度发生变化,也可找到模板,可以应用于遮挡条件)如果在非常低对比度下找到模板,可将MinContrast设置为一个相应小的值;如果即使在严重重叠条件下,仍可以认识模板
,MinContrast应该大于噪声造成的灰度波动范围,这是为了确保模板的位置和旋转能被精确的找到。之后获取轮廓,照样使用inspect_template()监视模板。
再接下来就是跟踪的过程,因为是对单帧图像进行匹配,所以要读取这个视频文件的所有帧。如何自动读取多个图像文件也就成了一个问题?这里采用for循环,还是利用read_image(Image,’E:/实验图像
/Akiyo/’+k$’d’)来读取,循环当中采用find_shape_model()来匹配,这个过程跟前面介绍的一样,不再细说。要重点总结的是如何来加速匹配以及模板更新的问题,因为考虑到由于视频对象变化过大,或者发生了非刚体的运动,这时某帧不能匹配,就需要重新针对该帧重新建立模板,便于后面帧的匹配。当然在这之前的跟踪过程中,对象与模板之间的测量匹配需设定一个阈值,两者之差在这个阈值之内,则认为是匹配的,否则是不匹配的。当出现不匹配时,记录下该帧;然后对这帧采用图像分割并分类,跟初始帧样建立新模板;于是继续后面的跟踪匹配。在实验中,我采用的视频图像有对象相对于背景变化不大的,比如新闻人、视频会议等
;也有对象相对于背景变化大,但对象的运动是刚体运动;如果对于非刚体的运动,匹配过程会更复杂,考虑的问题也更多。
例如,采用claire标准视频图像序列(176×144),由于对象相对背景变化较小,在匹配中尽量不采用更新模板来匹配,这里可以放宽匹配的要求,比如在MaxOverlap参数设置中可以减小其值,将MinSocre的值尽量调小点,这样会增加匹配的时间,可以在匹配的前提下尽量增大Greediness的值,这个实验中我设置的值分别为MaxOverlap=0.3, MinSocre=0.35, Greediness=0.9,共有492帧,总共匹配的时间大约12秒左右。当然这里的时间还更计算机配置有关。对foreman视频序列,由于摄像机的运动,对象和背景都有较大变化,因此在这里匹配要放宽要求,在创建模板时将对比度设置大一点,而在优化过程中选取忽略局部对比度变化的参数,在找模板中将贪婪度(Greediness)设置较低值,并且匹配度也尽量设较低值,这样可以通过部分匹配来跟踪对象。
采用Vectra标准视频图像序列(352×288),汽车行走,可作为一个刚体运动,这时就需要更新模板了,因为在行走的过程中,汽车在转弯或遇到遮挡物时就无法跟踪了,这里暂时不考虑完全遮挡的情况。在这个视频中,汽车在途中会有一些树木的遮挡,遮挡面积不大,可以完整看到汽车的轮廓。这时在前面有转弯的地方,可以放宽匹配的要求,当遇到遮挡时,更新不能匹配的模板。这个视频有141帧,在前面100帧以内,可以很好的跟踪,而在以后出现了较大的偏差,这跟寻找模板的参数设置有关;由于更新模板需要消耗时间,所以整个跟踪匹配的时间会较长。在实际应用中,我们更应该考虑到跟踪的效果,即跟踪的准确性;如何提高视频对象跟踪的精确性和快速性也是需要进一步研究实验的。
[附:流程图和实验图像无法上传,所以没有一个直观的感受~!欢迎一起交 2008-12-10 11:48:44
疯狂代码 /