K210实现单目标跟踪

前言

整个项目都是用C语言实现的,算法这块参考了这位大佬的demo,采用粒子滤波的方法,由于能力有限,没有使用K210的KPU模块,所以整体来说,这个项目还有很大的改进空间,后续将继续尝试其他的方法,引入KPU模块,进一步发挥K210的性能。
另外就是,我用的开发板是亚博智能的k210开发板,以及他们提供的SDK,开发环境是VScode+CMake+kendryte-toolchain,具体按照官方给的教程走就是了。

使用方法

demo的具体内容我就不再具体分析,其实主要还是算法部分,这里主要说一下使用方法:

  1. 在屏幕上选中目标,也就是画框,画框不重要,只是一个形式,重要的获取方框的左上角坐标和方框的宽度、高度这些参数。
  2. 选中目标后,按下右上角的keypad键,注意是垂直按下,不是往左/往右拨。
  3. 按下keypad后,程序将跟踪方框目标
  4. 按下板子右下角的Boot键,将取消跟踪
    这里再贴上板子的图片,方便理解。
    K210实现单目标跟踪_第1张图片
    使用方法大家可以按照自己的喜好修改。

比较鸡肋的点

文字有点多,还请耐心看完,相信会对你今后的开发有所帮助。
起初在弄目标跟踪的时候(不是用的粒子滤波),经常会出现内存爆掉的情况,一开始我以为是自己代码有问题,然后反复的检查修改,最后检查发现是官方给的关于动态内存分配的方法有问题…按照官方给的iomem.c文件提供的方法,就必须做到用完就要释放,如果你想定义一个全局指针变量指向这块内存,在整个执行程序期间都不释放的话,那么你之后申请的其它内存,将无法正常释放,因为在iomem.c文件里,它只是将我们申请的内存标记为占用,释放操作为取消标记,地址上的数据没有进行任何处理。
在这个文件中,有一个值得关注的指针变量,那就是_ioheap_line,这个指针变量指向的是我们最后一次申请的内存的首地址。举个例子,假设我依次申请了a、b、c三块内存,那么,按照官方给的方法,就必须按照c、b、a的顺序释放内存,这样更新_ioheap_line指针的位置,如果按b、c、a的顺序释放的话,由于_ioheap_line指针指向c的地址,那么在释放的时候,虽然这三块内存成功标记为未使用,但是_ioheap_line没有更新,下一次申请新内存d的时候,该指针将继续指向下一块内存,而之前释放的a、b、c这三块内存,由于在d之前,所以即使标记未未使用,但仍然用不了。如果不断申请的话,最终系统会提示内存爆了,但实际上之前的内存你并没有用上,或者用了,但是指针没更新,_ioheap_line指针会超除堆内存,导致停止运行。
这里加上我注释的代码,方便理解上面的文字
这个是iomem_malloc函数
K210实现单目标跟踪_第2张图片
这个k_free函数,iomem_free就是调用这个函数取消标记内存的
K210实现单目标跟踪_第3张图片
这里我在把我注释的代码文件链接贴出来,感兴趣的可以下载下来
链接:https://pan.baidu.com/s/1F2wW4VSH2HE6TaOFNsbgzQ
提取码:9vt9
注释若有理解错误的地方可以写在评论里,大家一起相互交流学习哈!

解决方案

只能自己设计一个内存池,然后所有程序需要的内存都在这里申请和释放。为了节省时间,当时没有将重心放在设计内存池上面,所以直接参考了现成的方法,代码很容易理解,可以选择BestFit(最佳适应算法)和NextFit(循环首次适应算法)两种分配内存大方法,各有利弊,大家根据自己项目选择合适的方法,当然也可以再添加其它方法,没有限制。
具体实现代码我和项目放在一起了,在mem_malloc文件夹里面。
参考链接

项目demo

整个项目的demo都在这里,如果感兴趣的话可以下载下来,自己实现一下,因为整个代码都是c语言实现的,没有使用OpenCV库函数,移植代码应该不难。

总结

整个项目还有很多值得优化的地方,考虑到时间问题,所以很多地方就没有优化处理。当然这还只是version1.0,后续将采用更高效的方法实现目标跟踪,比如引入KPU,进一步挖掘K210的潜力。
链接:https://pan.baidu.com/s/1SRwkZSM8rtT4C5TH2afnJw
提取码:10o7

你可能感兴趣的:(目标跟踪,K210学习,目标跟踪)