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. qttest1::qttest1(QWidget *parent, Qt::WFlags flags)
  3. : QMainWindow(parent, flags)
  4. {
  5. ui.setupUi(this);
  6. }
  7. qttest1::~qttest1()
  8. {
  9. }
  10. void qttest1::on_OpenImage_clicked()
  11. {
  12. }

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

[cpp] view plain copy
  1. #ifndef QTTEST1_H
  2. #define QTTEST1_H
  3. #include <QtGui/QMainWindow>
  4. #include <QFileDialog>
  5. #include "ui_qttest1.h"
  6. #include <opencv2/core/core.hpp>
  7. #include <opencv2/highgui/highgui.hpp>
  8. class qttest1 : public QMainWindow
  9. {
  10. Q_OBJECT
  11. public:
  12. qttest1(QWidget *parent = 0, Qt::WFlags flags = 0);
  13. ~qttest1();
  14. private:
  15. Ui::qttest1Class ui;
  16. cv::Mat image;  // cv图片
  17. private slots:
  18. void on_OpenImage_clicked();
  19. };
  20. #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学习笔记(二十一)——绘图函数core OpenCV学习笔记(二十二)——粒子滤波跟踪方法 OpenCV学习笔记(二十三)——OpenCV的GUI之凤凰涅槃Qt OpenCV学习笔记(二十相关推荐

  1. python3.4学习笔记(二十一) python实现指定字符串补全空格、前面填充0的方法

    python3.4学习笔记(二十一) python实现指定字符串补全空格.前面填充0的方法 Python zfill()方法返回指定长度的字符串,原字符串右对齐,前面填充0. zfill()方法语法: ...

  2. Matlab 二维绘图函数(plot类)

    plot 功能 绘制二维图形的最基本函数. 语法 //x为向量时,以x的元素值为纵坐标,x的序号为横坐标绘制曲线. //x为矩阵时,以其序号为横坐标,按列绘制每列元素值相对于其序号的曲线. polt( ...

  3. Python气象绘图笔记——常用气象绘图函数脚本封装与使用记录

    由于工作需要,将对我常用的python绘图脚本进行封装,为了防止代码丢失.忘记使用流程等,写个博客记录下. 要加载的包 import os import matplotlib.ticker as mt ...

  4. 高等数学学习笔记——第二十一讲——函数的一致连续性

    1. 问题引入--函数在一点连续的定义及几何意义 2. 函数一致连续的定义 3. 一致连续与连续的关系:若函数在开区间内一致连续,则其在该区间内连续 4. 一致连续的几何解释(例:正弦函数的一致连续性 ...

  5. matlab简易二维绘图函数的命令为,MATLAB绘图函数

    一.MATLAB通用图形函数命令 命令1 figure 功能创建一个新的图形对象.图形对象为在屏幕上单独的窗口,在窗口中可以输出图形. 用法figure 用缺省的属性值创建一个新的图形对象. 命令2 ...

  6. MATLAB各种二维绘图函数

    函数名 图形类型 bar 长条图 errorbar 图形加上误差分析 hist 累计图 rose 极坐标图 fill 实心圆 feather 羽毛图 fplot 较精确的函数图形 polar 极坐标图 ...

  7. Computer Vision: A Modern Approach - 计算机视觉书籍阅读笔记 -第十一章 - 跟踪

    Book name : Computer Vision: A Modern Approach Book URL: https://www.academia.edu/38213969/Computer_ ...

  8. MATLAB二维绘图(二)向图中添加标题,坐标轴,图标和文字信息

    MATLAB二维绘图(二)向图中添加标题,坐标轴,图标和文字信息 1.添加标题.图例.x轴信息和y轴信息,示例: %% 添加标题 clear; clc; close all; x = 0:0.1:2* ...

  9. opencv图像处理-常见绘图函数

    介绍 opencv 中常用的一些绘图函数 cv.line(),cv.circle(),cv.rectangle(),cv.ellipse(),cv.putText()等. 在上述所有功能中,有一些常见 ...

最新文章

  1. IP-GUARD内网安全监管系统
  2. vue ---- webpack中loader
  3. DevExpress LookUpEdit 初始化(数据加载) 底层类
  4. vs2015无法编辑html,连发Lianfa娱乐app -连发Lianfa娱乐appV6.2.84
  5. 机器人教室外墙_智慧教室解决方案-机器人创客教室布局设计
  6. Python绘图 好用的网址
  7. vulnhub DriftingBlues: 6
  8. 线性回归中的交互效应(interaction)
  9. 怎么把b站的视频保存到本地
  10. 跨境erp系统功能分析
  11. Unity—英雄无敌(前方高能)
  12. Zabbix 4.2 支持 Prometheus 数据收集
  13. 清华大学提出APDrawingGAN:人脸照片秒变艺术肖像画,已被CVPR 2019录取
  14. SP3232串口上电瞬间发乱码问题
  15. linux怎么看go写的程序进程,Linux中查看进程状态信息-Go语言中文社区
  16. cardinality mysql_Cardinality统计取值不准确导致MYSQL选错索引
  17. Autodesk Maya软件介绍
  18. matlab susan,SUSAN算法的matlab代码
  19. java excel异步导出_Java导出Excel
  20. R语言 先验概率分布与后验概率分布的计算

热门文章

  1. python连接数据库示例(东西写得很详细,剽过来了)
  2. 《经济学人》:Facebook 的 Libra 项目预示着一场消费革命
  3. “最害怕过周末”、“希望每天都干活”、“水电费又白交了”
  4. 感受亚马逊:“抠门”的巨无霸电商如何炼成
  5. 基因组与数据整合:DNA应用开发正在临近
  6. 多核学习在图像分类中的应用
  7. Java 8 - 收集器Collectors_分组groupingBy
  8. Redis进阶-string底层数据结构精讲
  9. Spring Cloud【Finchley】-07Feign构造多参数GET/POST请求
  10. 实战SSM_O2O商铺_41【前端展示】店铺列表页面Dao+Service+Controller层的实现