OpenCV学习笔记(二十一)——绘图函数core OpenCV学习笔记(二十二)——粒子滤波跟踪方法 OpenCV学习笔记(二十三)——OpenCV的GUI之凤凰涅槃Qt OpenCV学习笔记(二十

OpenCV学习笔记(二十一)——绘图函数core 

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

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

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

填充相关的函数有fillConvexPoly、fillPoly

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

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



OpenCV学习笔记(二十二)——粒子滤波跟踪方法 

粒子滤波法是指通过寻找一组在状态空间传播的随机样本对概率密度函数进行近似,以样本均值代替积分运算,从而获得状态最小方差分布的过程。

对于粒子滤波跟踪方法,这里有一篇很浅显易懂的博客,我分享给大家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学习笔记(二十三)——OpenCV的GUI之凤凰涅槃Qt 

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我也是刚接触,对这些函数的理解和新收获,我会陆续补充在这篇文章里。


OpenCV学习笔记(二十四)——初探机器学习库ml 

这部分内容应该是OpenCV高深精髓的一部分。给OpenCV插上了翅膀,可以使它实现更强大的功能,而不是简单的做一些基本的图像处理。文采太差,就不描绘machine learning的强大了。直接剖析之。

大部分的分类器和识别的算法都封装在了c++的类中。有些类有一些共同的基础,都被定义在CvStatModel类中了。

那就先介绍这个统计模型类CvStatModel,它是机器学习统计模型的基础类,其包括了构造函数和析构函数,清除内存重置模型状态的clear函数(功能类似析构函数,但可以重用,在析构函数里也调用该函数),模型保存 / 加载XML文件的save / load函数,读写文件和模型的函数write / read,训练模型的函数train,预测样本结果predict函数。

普通的贝叶斯分类器CvNormalBayesClassifier,有train和predict函数

k近邻算法CvKNearest,有train、find_nearest、get_max_k、get_var_count、get_sample_count、is_regression函数

支持向量机SVM相关的有类CvParamGrid用来表示统计参数范围的对数格子,类CvSVMParams、类CvSVM

决策树类CvDTreeSplit、CvDTreeNode、CvDTreeParams、CvDTreeTrainData、CvDTree

Boosting算法相关类CvBoostParams、CvBoostTree、CvBoost

Gradient Boosted Trees(GBT)算法相关类CvGBTreesParams、CvGBTrees

随机森林相关算法类CvRTparams、CvRTrees

随机树算法的扩展类CvERTrees

期望最大EM算法相关类CvEMParams、CvEM

神经网络算法相关类CvANN_MLP_TrainParams、CvANN_MLP

OpenCV果然够强大,几乎囊括了目前比较流行的全部机器学习方面的经典算法。以上这些牛叉的算法我都好膜拜啊,得下苦功专研了。

记得哪位牛人说过algorithm is king,data is queen。有了算法还需要对应的数据类CvMLData、CvTrainTestSplit

这部分内容真是博大精深啊,作为初学者,我一直不太敢写这方面的博客,很多算法只知道个皮毛,没有实现过,更不知道其中的奥妙,这里只能先做个介绍,待我日后慢慢丰富内容



OpenCV学习笔记(二十五)——OpenCV图形界面设计Qt+VS2008


一直对MFC对OpenCV的支持不好而耿耿于怀,了解了Qt对OpenCV支持很好,但网上这方面的资料很少。大部分的图形交互的设计都是基于OpenCV2.0之前的数据结构lpImage进行的。最近得到了一本好书《OpenCV 2 Computer Vision Application Programming Cookbook》,下载的链接为http://ishare.iask.sina.com.cn/f/20485520.html?retcode=0,2011年5月出版,全书都是基于OpenCV2.2版本的实现,采用了新的数据结构。我这里强烈建议利用C++开发的朋友们不要再使用老版本的数据结构了,实在影响开发效率。至于大家最熟悉的参考书《learning OpenCV》和《OpenCV教程——基础篇》这两本广为流传的书,我的看法是已经远远不能满足OpenCV新版本的学习了。真的希望这本新书的中文版尽快出炉。

参考这本书的利用Qt创建GUI,不过书中的办法是在Qt Creator下实现的,我这里通过VS2008+Qt实现。下面结合一个例程介绍一下如何在Qt的GUI环境下开发OpenCV。

先新建工程Qt Project --> Qt Application,点击finish完成工程的创建。然后在项目属性里的连接器的附加依赖项里面添加opencv的lib文件。工程创建好之后,一个后缀名为.ui的文件就是关于界面设计的。首先创建两个按钮,拖拽两个Push Buttons到Form中去,修改其属性,一个名字为Open Image,一个为Process。右键按钮选择connect signal为其添加响应函数,选择clicked()。对应的cpp文件多出了on_OpenImage_clicked函数,代码如下:

[cpp]  view plain  copy
  1. #include "qttest1.h"  
  2.   
  3. qttest1::qttest1(QWidget *parent, Qt::WFlags flags)  
  4.     : QMainWindow(parent, flags)  
  5. {  
  6.     ui.setupUi(this);  
  7. }  
  8.   
  9. qttest1::~qttest1()  
  10. {  
  11.   
  12. }  
  13.   
  14.   
  15. void qttest1::on_OpenImage_clicked()  
  16. {  
  17.   
  18. }  

接下来要在对应的头文件中添加显示图片的必要代码,添加QFileDialog类的声明,OpenCV必要的include头文件包含,在类中声明一个cv :: Mat成员变量。代码如下:

[cpp]  view plain  copy
  1. #ifndef QTTEST1_H  
  2. #define QTTEST1_H  
  3.   
  4. #include   
  5. #include   
  6. #include "ui_qttest1.h"  
  7.   
  8. #include   
  9. #include   
  10.   
  11. class qttest1 : public QMainWindow  
  12. {  
  13.     Q_OBJECT  
  14.   
  15. public:  
  16.     qttest1(QWidget *parent = 0, Qt::WFlags flags = 0);  
  17.     ~qttest1();  
  18.   
  19. private:  
  20.     Ui::qttest1Class ui;  
  21.     cv::Mat image;  // cv图片  
  22.   
  23. private slots:  
  24.     void on_OpenImage_clicked();  
  25. };  
  26.   
  27. #endif // QTTEST1_H  


接下来添加on_OpenImage_clicked的函数内容。代码如下:

[cpp]  view plain  copy
  1. void qttest1::on_OpenImage_clicked()  
  2. {  
  3.     QString fileName = QFileDialog::getOpenFileName(this, tr("Open Image"), ".", tr("Image Files (*.png *.jpg *.jpeg *.bmp)"));  
  4.     image = cv::imread(fileName.toAscii().data());  
  5.     cv::namedWindow("Original Image");  
  6.     cv::imshow("Original Image", image);  
  7. }  

类似的办法添加Process按钮的相应代码:

[cpp]  view plain  copy
  1. void qttest1::on_Process_clicked()  
  2. {  
  3.     cv::flip(image, image, 1);  
  4.     cv::namedWindow("Output Image");  
  5.     cv::imshow("Output Image", image);  
  6. }  

这样就可以实现一个普通的按钮响应。但我们的目的是将图片显示在对话框form中,这还需要进一步深入学习。与MFC中显示图片需要CvvImage类似,要想在Qt的Form中显示图片,图片的格式也必须为QImage,需要将cv::Mat的BGR通道顺序变换为RGBA,QImage的格式为Format_RGB32,调用cvtColor实现(这里例程里调用的为BGR2RGB,然后QImage的格式为Format_RGB888,但我试验显示结果是有问题的,故自己调整了一下)。(后经实验,BGR2RGB,Format_RGB888这组参数对于webcam视频是正确的,对于我当时的实验照片是不正确的,格式的问题真是混乱!!!)实现代码如下:

[cpp]  view plain  copy
  1. cv::cvtColor(image, image, CV_BGR2RGBA);  
  2. QImage img = QImage((const unsigned char*)(image.data), image.cols, image.rows, QImage::Format_RGB32);  
  3. QLabel *label = new QLabel(this);  
  4. label->move(200, 50);  
  5. label->setPixmap(QPixmap::fromImage(img));  
  6. label->resize(label->pixmap()->size());      
  7. label->show();  

注意打开图片的路径不要有中文,最后的显示结果为


相关代码的下载地址为http://download.csdn.net/detail/yang_xian521/3793960


from: http://blog.csdn.net/yang_xian521/article/category/910716

你可能感兴趣的:(OpenCV)