EigenVV,cvdiv,GetDims

来源:互联网 发布:linux运维面试题 编辑:程序博客网 时间:2024/05/16 08:54

EigenVV

计算对称矩阵的特征值和特征向量

void cvEigenVV( CvArr* mat, CvArr* evects, CvArr* evals, double eps=0 );
mat
输入对称方阵。在处理过程中将被改变。
evects
特征向量输出矩阵, 连续按行存储
evals
特征值输出矩阵,按降序存储(当然特征值和特征向量的排序是同步的)。
eps
对角化的精确度 (典型地, DBL_EPSILON=≈10-15 就足够了)。

函数 cvEigenVV 计算矩阵 A 的特征值和特征向量:

mat*evects(i,:)' = evals(i)*evects(i,:)' (在 MATLAB 的记法)

矩阵 A 的数据将会被这个函数修改。

目前这个函数比函数 cvSVD 要慢,精确度要低, 如果已知 A 是正定的,(例如, 它是一个协方差矩阵), 它通常被交给函数cvSVD 来计算其特征值和特征向量,尤其是在不需要计算特征向量的情况下

 

 

 

CvScalar s;
s=cvGet2D(img,i,j); //img就是IplImage指针了
如果图像是单通道的话就是只有s.val[0]有像素值
如果是3通道的就s.val[0]s.val[1]s.val[2]分别对应了像素的B GR这样够明了了吧?不过据说这个方法是比较慢的,但是好理解,你熟悉的话,
img->imageData 就是指向像素数据的指针,喜欢取哪个点就移动指针就OK了


cvMul(Ma, Mb,Mc);     // Ma.*Mb  -> Mc
cvDiv(Ma, Mb,Mc);     // Ma./Mb  -> Mc

 

 

 

  float vals[]={0.9 , 0.4, 0.5, 0.1};

 CvMat  rotmat;
 cvInitMatHeader(&rotmat,2,2,CV_32FC1,vals);
 cvDiv(NULL,&rotmat,&rotmat);
 cout<<CV_MAT_ELEM(rotmat,float,0,1);

 

 

 

 

GetDims,GetDimSize

返回数组维数和他们的大小或者殊维的大小

int cvGetDims( const CvArr* arr, int* sizes=NULL );int cvGetDimSize( const CvArr* arr, int index );
arr
输入数组.
sizes
可选的输出数组维尺寸向量,对于2D数组第一位是数组行数(高),第二位是数组列数(宽)
index
以0为基准的维索引下标(对于矩阵0意味着行数,1意味着列数,对于图象0意味着高,1意味着宽。

函数 cvGetDims返回维数和他们的大小。如果是 IplImage 或 CvMat 总是返回2,不管图像/矩阵行数。函数cvGetDimSize返回特定的维大小(每维的元素数)。例如,接下来的代码使用二种方法计算数组元素总数。

// via cvGetDims()int sizes[CV_MAX_DIM];int i, total = 1;int dims = cvGetDims( arr, size );for( i = 0; i < dims; i++ )    total *= sizes[i];// via cvGetDims() and cvGetDimSize()int i, total = 1;int dims = cvGetDims( arr );for( i = 0; i < dims; i++ )    total *= cvGetDimsSize( arr, i );
0 0