opencv2学习:计算协方差矩阵
图像的高级处理中,协方差矩阵计算是必不可少的,但opencv关于这方面的资料却相当少。
首先,利用matlab计算一下,便于比较:
>> data=[1,2,3;10,20,30]
data =
1 2 3
10 20 30
>> convar=cov(data)
convar =
40.5000 81.0000 121.5000
81.0000 162.0000 243.0000
121.5000 243.0000 364.5000
在计算协方差矩阵时,在源数据矩阵中,默认以行为样本数,以列为维度。如果你是相反的,那么结果可能和我的不一样。
在opencv2中,先利用公式来进行计算:
代码:
Mat data = (Mat_<float>(, ) << , , , , , );
cout << "data:"<<endl << data << endl;
Mat means(, data.cols, data.type(), Scalar::all());
for (int i = ; i < data.cols; i++)
means.col(i) = sum(data.col(i)) / data.rows; //计算列均值
cout << "means:"<<endl << means << endl;
Mat tmp = repeat(means, data.rows, );
data = data - tmp; //源数据减去均值
Mat covar = (data.t()*data) / (data.rows - ); // (X'*X)/n-1
cout << "covar:"<<endl<< covar << endl;
结果:
data:
[1, 2, 3;
10, 20, 30]
means:
[5.5, 11, 16.5]
covar:
[40.5, 81, 121.5;
81, 162, 243;
121.5, 243, 364.5]
请按任意键继续. . .
结果和matlab计算是一样的。
还有一种比较简便的方法,那就是使用opencv自带的函数calcCovarMatrix来计算。
void calcCovarMatrix(InputArray samples, OutputArray covar, OutputArray mean, int flags, int ctype=CV_64F)
代码:
Mat covar, means;
Mat data = (Mat_<float>(, ) << , , , , , );
cout << "data:" << endl << data << endl;
calcCovarMatrix(data, covar, means, CV_COVAR_NORMAL | CV_COVAR_ROWS);
cout << "means:" << endl << means << endl;
cout << "covar:" << endl << covar << endl;
结果:
data:
[1, 2, 3;
10, 20, 30]
means:
[5.5, 11, 16.5]
covar:
[40.5, 81, 121.5;
81, 162, 243;
121.5, 243, 364.5]
和上面的结果完全一样。注意最后一个参数CV_COVAR_ROWS表示以行为样本,即一行为一个向量。如果你是以列为向量,则应换成CV_COVAR_COLS
标记位参数值极其意义
|
标志参数的具体标志值 |
意义 |
|
CV_COVAR_NORMAL |
计算均值和协方差 |
|
CV_COVAR__SCRAMBLED |
快速PCA”Scrambled”协方差 |
|
CV_COVAR_USE_AVERAGE |
输入均值而不是计算均值 |
|
CV_COVAR_SCALE |
重新缩放输出的协方差矩阵 |
这个函数的具体介绍可以参考官方文档:传送门
opencv2学习:计算协方差矩阵的更多相关文章
- [zz]计算 协方差矩阵
http://www.cnblogs.com/chaosimple/p/3182157.html http://blog.csdn.net/goodshot/article/details/86111 ...
- OpenCV2学习笔记(一)
Mat - 图像的容器 在对图像进行处理时,首先需要将图像载入到内存中,而Mat就是图像在内存中的容器,管理着图像在内存中的数据.Mat是C++ 的一个类,由于OpenCV2中引入了内存自动管理机制, ...
- OpenCV2学习笔记(十四):基于OpenCV卡通图片处理
得知OpenCV有一段时间.除了研究的各种算法的内容.除了从备用,据导游书籍和资料,尝试结合链接的图像处理算法和日常生活,第一桌面上(随着摄像头)完成了一系列的视频流处理功能.开发平台Qt5.3.2+ ...
- Caffe深度学习计算框架
Caffe | Deep Learning Framework是一个清晰而高效的深度学习框架,其作者是博士毕业于UC Berkeley的 Yangqing Jia,目前在Google工作.Caffe是 ...
- OpenCV2学习笔记05:矩阵翻转
对图像进行翻转或旋转可以使用cv::flip()函数,可以实现将一个二维矩阵沿X轴.Y轴或者同时沿XY轴翻转.函数原型如下: C++: void flip(InputArray src, Output ...
- OpenCV2学习笔记03:Qt中配置OpenCV环境
在Qt中开发基于OpenCV的应用时,需要配置对应函数库到环境变量,这时候我们需要使用到qmake能够识别的变量来指定环境变量. INCLUDEPATH: 用于指定搜索头文件到文件夹路径. LIBS: ...
- OpenCV2学习笔记04:图像的读取与显示
1. 图像读取:imread() Mat imread( ) 参数介绍: filename: 待加载的文件名称. flags: 此标志用来指定被加载图像的颜色类型(color type).这个标志的取 ...
- OpenCV2学习笔记02:MSVC2013搭建OpenCV开发环境
我这里编译的库是通过手动编译的.只是需要注意的是,手动编译一般会产生大量的文件,差不多7个多G的样子,实在是有点浪费硬盘存储呀,其实我们可以删除掉没有用的东西.因为我们在编译的时候指定了一个目录比如我 ...
- OpenCV2学习笔记01:Linux下OpenCV开发环境的搭建
个人已经厌倦了Windows下的开发方式,于是决定转到Linux平台上来,当然我也知道这个转变会很艰辛,但是我还是要坚持.所以,后面的所有开发我都会基于Linux和Qt,先从开发环境的搭建开始做起,当 ...
随机推荐
- 敏捷软件开发:原则、模式与实践——第10章 LSP:Liskov替换原则
第10章 LSP:Liskov替换原则 Liskov替换原则:子类型(subtype)必须能够替换掉它们的基类型(base type). 10.1 违反LSP的情形 10.1.1 简单例子 对L ...
- 敏捷软件开发:原则、模式与实践——第8章 SRP:单一职责原则
第8章 SRP:单一职责原则 一个类应该只有一个发生变化的原因. 8.1 定义职责 在SRP中我们把职责定义为变化的原因.如果你想到多于一个的动机去改变一个类,那么这个类就具有多于一个的职责.同时,我 ...
- node.js之excel文件读取
金天:学习一个新东西,就要持有拥抱的心态,如果固守在自己先前的概念体系,就会有举步维艰的感觉.node.js解析excel, 读取记录. 业务需求,从excel (xlsx, xls)导入数据. 备选 ...
- JRebel for Android 1.0发布!
什么是JRebel for Android? 一款Android studio插件——允许你修改正在运行中的应用程序,而且不必重新部署或重启.支持所有运行Android 4.0及以上版本的手机和平板. ...
- WebApi 使用PUT和DELETE时报405的问题
最近两天写了个项目,里面有一个接口是用谓词delete接收请求. 本地完全没问题,但是当发布到服务器上之后(IIS7.5),就报出 405.0 - Method Not Allowed 很明显是配置问 ...
- EasyUI ComboGrid 分页
一.使用场景 下拉框可以很方便地为我们提供选择功能,通过下拉框我们可以便捷地选择某个值,而不需要手动输入.在EasyUI中有ComboGrid与之对应.ComboGrid既可以当中下拉框来使用,又可以 ...
- 图片延迟加载(lazyload)的实现原理
此前在浏览一些网站的时候,发现他们网站的图片都是你“鼠标”滚到哪,图片才会加载显示.当时觉得好神奇,怎么会这么“跟手”呢. 核心原理是: 1 设置一个定时器,计算每张图片是否会随着滚动条的滚动,而出现 ...
- yum 安装包的用法
最近刚爆出linux下glibc有重大漏洞,修复方案为升级glibc库 RHEL/CentOS下一键即可修复 : sudo yum update glibc .或者如果本地有rpm包 直接 rpm - ...
- [转]后台页面访问权限:页面基类&内置票据认证 使用方法
本文转自:http://www.cnblogs.com/fishtreeyu/archive/2011/01/29/1947421.html 一般网站后台页面除了登录页面login.aspx未登录用户 ...
- ZooKeeper系列2:ZooKeeper的运行
问题导读1.如何启动ZooKeeper 服务?2.如何启动集群 1)单机模式 用户可以通过下面的命令来启动 ZooKeeper 服务: zkServer.sh start 复制代码 这个命令默认情况下 ...