(八)绘图函数

在图像中,我们经常想要在图像中做一些标识记号,这就需要绘图函数。OpenCV虽然没有太优秀的GUI,但在绘图方面还是做得很完整的。这里就介绍一下相关的函数。

在绘图函数中都会用到颜色,这里用Scalar结构表示颜色参数。


作图相关的函数有circle、clipLine、ellipse、ellipse2Poly、line、rectangle、polylines、类LineIterator。

填充相关的函数有fillConvexPoly、fillPoly。

显示文字相关的函数有getTextSize、cvInitFont、putText。

以上这些函数使用都非常简单方便,我就不过多介绍了。

粒子滤波法是指通过寻找一组在状态空间传播的随机样本对概率密度函数进行近似,以样本均值代替积分运算,从而获得状态最小方差分布的过程。
对于粒子滤波跟踪方法,这里有一篇很浅显易懂的博客,我分享给大家http://www.cnblogs.com/yangyangcv/archive/2010/05/23/1742263.html。他的工作也是参考Rob Hess的程序做的,感谢老外的开源精神,我看了他的程序,我也提出了我的几点改进,作者本身的设想是想做多目标的运动跟踪,但函数接口写的还是有些混乱,以至于最后不能实现(估计是我才疏识浅,没能领会作者的精神),而且用到了gsl数学库,这个库我是不熟悉的,开了一下程序,主要也就只用了里面的随机数的功能,这功能在新版本的OpenCV里已经集成啦,作者用的数据结构还是老版本的结构,好多函数还是作者自己写的,我这里用新版本的数据结构重新写了一遍这个算法,简化跟踪目标为一个。下面介绍一下我的设计流程

首先还是将视频转换到HSV颜色空间,我发现很多图像处理的办法都是在该空间下完成的,Rob Hess对HSV颜色空间的特征提取还是很有意思的,他知道色度和饱和度提供的信息和亮度提供的信息分开考虑,做出了他自己的特征直方图。我这里用了新版本的calcHist做的特征直方图,偷了个懒,效果感觉还可以。

初始化阶段就是对鼠标选中的目标区域的特征直方图提取,进入搜索阶段,通俗的讲,就是在待搜索区域里放入大量的粒子particle,放入粒子的规则有很多,这里使用的是让粒子的分布为高斯分布,计算每个粒子所在区域的特征直方图,与目标区域特征进行比较,特征接近的粒子的权重大一些,反之权重小一些。通过调整各粒子的权重大小和样本位置来近似实际的概率分布,以样本期望作为系统估计值。然后进行重采样,重新分布粒子的位置。(对于重采样的目的,是为了解决序列重要性采样(SIS)存在的退化现象,即几步迭代之后,许多粒子的权重变得很小,大量的计算浪费在小权值的粒子上。解决退化问题的一般办法就是重采样原理,基本思想就是对后验概率密度再采样,保留复制权重大的粒子,剔除权重小的粒子。程序里感觉只是据粒子的权重的后验概率分布进行一次重新采样,感觉并不是yangyangcv说的那个类似ransac的意思,因为我对代码分析并没有循环放粒子的过程,欢迎大家拍砖)

具体的算法流程为

我的实际编程步骤大概可以分为如下几步:

// step 1: 提取目标区域特征

// step 2: 初始化particle(粒子的个数很影响跟踪的速度)

// step 3: 求particle的transition(这一步的参数会很影响粒子的变化区域,需要对不同的跟踪对象进行调整参数)

// step 4: 求particle区域的特征直方图(特征选取的不合适也很影响结果)

// step 5: 特征的比对,更新particle权重(特征比较的方法也是影响结果的因素)

// step 6: 归一化粒子权重

// step 7: resample根据粒子的权重的后验概率分布重新采样

// step 8: 计算粒子的期望,作为跟踪结果

再写一下我试验后的心得,我用的是最基本的粒子滤波算法,考虑因素较少,受参数影响很大,而且参数众多,不方便自动调整。对不同的视频跟踪效果差别很大,而且会出现目标丢失的情况。这都是可以改进的。

试验代码下载地址为:http://download.csdn.net/detail/yang_xian521/3756240

 

OpenCV的发展趋势真是越来越向Linux方向发展,对Windows平台的支持越来越少,2.2版本之后把CvvImage也给删除了,这让人如何开发MFC程序啊,网上搜了好久,基本的办法都是调用之前版本的代码,继续使用CvvImage,这样会导致一个很严重的问题,就是程序里显示的所有的图片都必须是CvvImage类,不能用MFC的图片显示方法,这就需要对代码进行大量的修改,不符合开发的要求。感觉大家的办法都是治标不治本,而且MFC也是快要被日新月异的新技术拍在沙滩上的东西。
我总不能永远在控制台下面开发OpenCV应用程序吧。看了一下OpenCV的用户手册,发现它支持跨平台的Qt这个UI开发框架。Qt是诺基亚开发的一个跨平台的C++图形用户界面应用程序框架,我索性也学习一下。Qt的安装我参考的是这篇文章
http://blog.sina.com.cn/s/blog_661159d50100ib38.html,文章里介绍的方案也是我的开发环境VS2008,想必对于配置OpenCV相当熟练的大牛们,配置Qt肯定也难不倒各位。安装好后,就是进行OpenCV的GUI开发咯

从上图中我们可以看出Qt对OpenCV的支持还是很好的,需要用到的开发工具为Qt*GUI,这个GUI可以提供状态栏、工具栏和控制面板。控制面板上面可以制作进度条河按钮等控件(使用trackbar,要确保窗口的参数为NULL;使用buttonbar之前,要先创建一个按钮)。相关的函数有setWindowProperty、getWindowProperty、fontQt、addText、displayOverlay、displayStatusBar、createOpenGLCallback、saveWindowParameters、loadWindowParameters、createButton。由于Qt我也是刚接触,对这些函数的理解和新收获,我会陆续补充在这篇文章里。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值