基于OpenCV的运动目标检测跟踪实验平台(2)
发布时间:2021-06-05
发布时间:2021-06-05
基于OpenCV的运动目标检测跟踪实验平台
,利用"连续适应性均值移动算法(CamShift)",对目标进行跟踪。
CamShift算法简述如下:首先,在图像HSI空间中计算H通道(色彩通道)分量的1D直方图;接着,利用此1D直方图将原图改建成2D概率分布图;第三步,计算出目标区域的重心;第四部,利用经典的"Mean Shift"算法,不断平移调整窗口中心到与目标重心重合;第五步,将上一帧的窗口大小和中心,作为下一帧Mean Shift算法搜索窗口的初始值,在下一帧中继续Mean Shift运算。
上述运动物体检测和跟踪的算法运算量小,跟踪效果好。只要初始抓取目标无误,并且在色彩空间上目标与背景有一定偏差,视频跟踪便能够达到相当的准确度。更好的一点是,此算法在跟踪同一场境内多个运动目标其中的一个时的效果,是其它同样计算复杂度的算法所难以比拟的。
4 Windows多线程编程
为了达到良好的实时性能,充分利用CPU资源,本平台采用多线程并发处理模式进行编程。在Windows操作系统下,线程与进程调度都有着一套封装好的方法,各线程轮流占用CPU资源。既然没有多个CPU进行真正的程序"并发"执行,多线程编程要做的就是如何利用线程的"休眠"事件,合理充分地使用资源,以达到提高程序运行效率的目的。
本平台中,程序由两个线程组成:main线程和GetImage线程。Main线程作为主线程,它启动了GetImage线程;除此之外main
线程的主要功能就是利用OpenCV函数库,对从摄像头获取的图像数据进行分析处理;此外main线程还负责获取用户输入信息。GetImage线程的主要工作就是循环地从摄像头读取数据放到缓存中,以供main线程分析。在这当中,GetImage线程往缓存中写数据与从缓存中读数据将不可避免地操作同一块缓存;为防止数据读写冲突出错,两线程在操作这块缓存时都必须上锁。这在本平台程序中是通过"互斥量"来实现的。另外,为防止main线程重复地分析同一帧图像,要求main线程必须等待GetImage线程的一个信号才能进行数据读取和分析,这在平台程序中是通过Wait/Object的方式来实现的。
程序流程图如图2、图3所示。
5 实验结果
经过实验证明,基于OpenCV的运动目标检测跟踪实验平台可以在实时显示图像的基础上,实时检测和跟踪运动目标,并且检测和跟踪具有较高的鲁棒
性。在跟踪过程中,即时目标保持静止,程序也不会丢失对目标的跟踪。检测跟踪结果如图4所示:
上述稳定的目标检测与跟踪结果,是实现基于全地图路径规划的机器人算法的前提。实际上图4也正是一种基于此平台的视频智能吸尘器的软件工作界面。
实践表明,OpenCV使得在PC机上
下一篇:小学音乐教案教学设计《夜色美》