opencv基础知识,《OpenCV教程——基础篇》
因为我们想找到矩阵的特征向量和特征值,我们想使用MTL库,因为MTL在成熟度和运行效率方面是有保证的。没想到用MTL库求特征向量矩阵和特征值还要依赖其他库,只好另辟蹊径。幸运的是,我找到了OpenCV,一个由intel资助的开源库。它的全称是开源计算机视觉库(意思是开源计算机视觉库)。
要下载OpenCV库,你可以在http://www.opencv.org.cn/index.php/Download.下载的OpenCV中文网站下载,我发现OpenCV库真的很人性化。——可以通过安装包安装。安装后已经有支持VS 2005的解决方案文件,基本不需要配置编译选项。因为我只想要里面的矩阵运算,所以这次只编译了cxcore项目(呵呵,进一步的学习以后再说)。运行VS 2005的build命令生成库文件,在调试模式下生成:cxcore.lib和cxcore100d.dll,在发布模式下生成cxcore100.dll和cxcore.lib(可以看到调试文件比发布文件多了一个字母D)。
现在正式开始使用Opencv库。当然,要使用它,您必须复制出相关的头文件。这里使用它的矩阵操作是把安装目录下的CV文件夹复制出来,然后包含在你的程序里。
使用库的第一个问题是实现从标准类型到库类型的转换(有时候我不明白为什么库不用标准C类型?比如char,int等。可能这是出于效率的考虑)。OpenCV库求特征值和特征向量的功能是:
void cvEigenVV( CvArr* mat,CvArr* evects,CvArr* evals,double EPS=0);
垫子
输入对称方阵。将在处理过程中更改。
事件
特征向量输出矩阵连续存储在行中。
评估
输出特征值矩阵,按降序存储(当然特征值和特征向量的排序是同步的)。
蓄电池
对角化的精度(通常情况下,DBL=10-15就足够了)。
开始测试,构建一个控制台程序并编写一个测试函数:
void TestOpenCV(void)
//a是输入对称方阵。
双a[5][5]=
{10.0, 1.0, 2.0, 3.0, 4.0},
{ 1.0, 9.0, -1.0, 2.0, -3.0},
{ 2.0, -1.0, 7.0, 3.0, -5.0},
{ 3.0, 2.0, 3.0, 12.0, -1.0},
{ 4.0, -3.0, -5.0, -1.0, 15.0}
//构造输入方阵
CvMat SrcMatrix=cvMat(5,5,CV_64FC1,a);
使用cvEigenVV函数要注意以下三点:
1.对称方阵、特征向量输出矩阵、特征值输出矩阵的构造必须分为静态数组和动态开内存数组。如果是静态数组,可以用上面的方法构造矩阵,如果是动态开内存数组,那么在构造矩阵类时要用下面的方法:
double * * pf matrix=new double *[nInBandNum];
double * * pf vector=new double *[nInBandNum];
呵呵,是不是感觉有点麻烦?我想找出原因,因为OpenCV的matrix类是一维数组,静态数组的地址是连续的,因为其他数组元素可以用数组的第一个地址直接访问,而多维动态数组的行和地址是不连续的,所以必须通过赋值来构造。
2.对称方阵、特征向量输出矩阵、特征值矩阵的行列必须匹配。比如对称方阵是5行5列,那么特征向量输出矩阵是5行5列,特征值矩阵是1行5列。
3.特征值矩阵按降序排列(从最大到最小)。
有兴趣的朋友可以看看cvEigenVV的源码是怎么求特征向量矩阵和特征值矩阵的。我大致看了一下,用的是雅可比法。
参考网站和文档:
1.http://www.opencv.org.cn/index.php
2.OpenCV参考手册,中文译者:余,中国科学院自动化研究所,自由软件协会,HUNNISH,阿苏数码
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。