图像的高级处理中,协方差矩阵计算是必不可少的,但opencv关于这方面的资料却相当少。

首先,利用matlab计算一下,便于比较:

  1. >> data=[1,2,3;10,20,30]
  2.  
  3. data =
  4.  
  5. 1 2 3
  6. 10 20 30
  7.  
  8. >> convar=cov(data)
  9.  
  10. convar =
  11.  
  12. 40.5000 81.0000 121.5000
  13. 81.0000 162.0000 243.0000
  14. 121.5000 243.0000 364.5000

在计算协方差矩阵时,在源数据矩阵中,默认以行为样本数,以列为维度。如果你是相反的,那么结果可能和我的不一样。

在opencv2中,先利用公式来进行计算:

代码:

  1. Mat data = (Mat_<float>(, ) << , , , , , );
  2. cout << "data:"<<endl << data << endl;
  3. Mat means(, data.cols, data.type(), Scalar::all());
  4. for (int i = ; i < data.cols; i++)
  5. means.col(i) = sum(data.col(i)) / data.rows; //计算列均值
  6. cout << "means:"<<endl << means << endl;
  7. Mat tmp = repeat(means, data.rows, );
  8. data = data - tmp; //源数据减去均值
  9. Mat covar = (data.t()*data) / (data.rows - ); // (X'*X)/n-1
  10. cout << "covar:"<<endl<< covar << endl;

结果:

  1. data:
  2. [1, 2, 3;
  3. 10, 20, 30]
  4. means:
  5. [5.5, 11, 16.5]
  6. covar:
  7. [40.5, 81, 121.5;
  8. 81, 162, 243;
  9. 121.5, 243, 364.5]
  10. 请按任意键继续. . .

结果和matlab计算是一样的。

还有一种比较简便的方法,那就是使用opencv自带的函数calcCovarMatrix来计算。

void calcCovarMatrix(InputArray samples, OutputArray covar, OutputArray mean, int flags, int ctype=CV_64F)

代码:

  1. Mat covar, means;
  2. Mat data = (Mat_<float>(, ) << , , , , , );
  3. cout << "data:" << endl << data << endl;
  4. calcCovarMatrix(data, covar, means, CV_COVAR_NORMAL | CV_COVAR_ROWS);
  5. cout << "means:" << endl << means << endl;
  6. cout << "covar:" << endl << covar << endl;

结果:

  1. data:
  2. [1, 2, 3;
  3. 10, 20, 30]
  4. means:
  5. [5.5, 11, 16.5]
  6. covar:
  7. [40.5, 81, 121.5;
  8. 81, 162, 243;
  9. 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学习:计算协方差矩阵的更多相关文章

  1. [zz]计算 协方差矩阵

    http://www.cnblogs.com/chaosimple/p/3182157.html http://blog.csdn.net/goodshot/article/details/86111 ...

  2. OpenCV2学习笔记(一)

    Mat - 图像的容器 在对图像进行处理时,首先需要将图像载入到内存中,而Mat就是图像在内存中的容器,管理着图像在内存中的数据.Mat是C++ 的一个类,由于OpenCV2中引入了内存自动管理机制, ...

  3. OpenCV2学习笔记(十四):基于OpenCV卡通图片处理

    得知OpenCV有一段时间.除了研究的各种算法的内容.除了从备用,据导游书籍和资料,尝试结合链接的图像处理算法和日常生活,第一桌面上(随着摄像头)完成了一系列的视频流处理功能.开发平台Qt5.3.2+ ...

  4. Caffe深度学习计算框架

    Caffe | Deep Learning Framework是一个清晰而高效的深度学习框架,其作者是博士毕业于UC Berkeley的 Yangqing Jia,目前在Google工作.Caffe是 ...

  5. OpenCV2学习笔记05:矩阵翻转

    对图像进行翻转或旋转可以使用cv::flip()函数,可以实现将一个二维矩阵沿X轴.Y轴或者同时沿XY轴翻转.函数原型如下: C++: void flip(InputArray src, Output ...

  6. OpenCV2学习笔记03:Qt中配置OpenCV环境

    在Qt中开发基于OpenCV的应用时,需要配置对应函数库到环境变量,这时候我们需要使用到qmake能够识别的变量来指定环境变量. INCLUDEPATH: 用于指定搜索头文件到文件夹路径. LIBS: ...

  7. OpenCV2学习笔记04:图像的读取与显示

    1. 图像读取:imread() Mat imread( ) 参数介绍: filename: 待加载的文件名称. flags: 此标志用来指定被加载图像的颜色类型(color type).这个标志的取 ...

  8. OpenCV2学习笔记02:MSVC2013搭建OpenCV开发环境

    我这里编译的库是通过手动编译的.只是需要注意的是,手动编译一般会产生大量的文件,差不多7个多G的样子,实在是有点浪费硬盘存储呀,其实我们可以删除掉没有用的东西.因为我们在编译的时候指定了一个目录比如我 ...

  9. OpenCV2学习笔记01:Linux下OpenCV开发环境的搭建

    个人已经厌倦了Windows下的开发方式,于是决定转到Linux平台上来,当然我也知道这个转变会很艰辛,但是我还是要坚持.所以,后面的所有开发我都会基于Linux和Qt,先从开发环境的搭建开始做起,当 ...

随机推荐

  1. 转载:sql关联查询

    inner join(等值连接)只返回两个表中联结字段相等的行 left join(左联接)返回包括左表中的所有记录和右表中联结字段相等的记录 right join(右联接)返回包括右表中的所有记录和 ...

  2. 关于报malformed or corrupted AST file: 'Unable to load module 的错~

    今天早上 一运行程序 居然报错,我都惊呆了,昨天明明好好的-但是百度是强大的- 报错内容: malformed or corrupted AST file: 'Unable to load modul ...

  3. js地理位置获取、显示、轨迹绘制

    JS新API标准 地理定位(navigator.geolocation) 基于 html5 geolocation来获取经纬度地址 Html5 Geolocation获取地理位置信息 HTML5获取地 ...

  4. Linux文件I/O学习

    Linux内核的VFS子系统: 文件描述符     对于内核而言,所有打开的文件都通过文件描述符引用.文件描述符是一个非负整数.当打开一个现有文件或创建一个新文件时,内核向进程返回一个文件描述符.当读 ...

  5. strcpy

    /********************** *C语言标准库函数strcpy的一种典型的工业级的最简实现 *返回值:目标串的地址. *对于出现异常的情况ANSI-C99标准并未定义,故由实现者决定返 ...

  6. 完全卸载VS2005或VS2008的步骤

    手动卸载步骤: Visual Studio Express Editions 进入控制面板,运行添加或删除程序  卸载 "MSDN Library for Visual Studio 200 ...

  7. SQL Server 2008 R2——VC++ ADO 操作 参数化查询

    ==================================声明================================== 本文原创,转载在正文中显要的注明作者和出处,并保证文章的完 ...

  8. nginx实现动态分离,解决css和js等图片加载问题

    改帖专门为使用nginx,通过nginx把请求转发到web服务器再返回客户端的时候,解决css和js和图片加载不出来的问题. 如果没安装nginx,请访问一下地址进行安装 http://www.cnb ...

  9. O(N)时间的排序

    题目:某公司有几万名员工,请完成一个时间复杂度为O(n)的算法对该公司员工的年龄作排序,可使用O(1)的辅助空间. 要注意分析题目,一般排序要么是O(n^2),要么是O(nlogn).但这里题目特别强 ...

  10. Mathout

    1. 用Maven搭建Mahout的开发环境,并完成PPT 26页,最简单的例子.要求有过程说明和截图. 2. 用案例的数据集,基于Mahout,任选一种算法,对任意一个女性用户进行协同过滤推荐,并解 ...