学习Opencv的小心得

最近有学习一下OPencv,发现里面的水还是很深,并没有我想的那么简单。我现在的项目主要是关于一些数学计算,里面包括一些矩阵的计算,有用到矩阵乘法,于是对于我 这种菜鸟来说,当然第一想到的就是百度。没想到这一坑还不浅,让我的项目陷入深深的泥潭。百度首先都是介绍 Opencv1.0 里面的CvMat 是,它是一个结构体,一般的矩阵乘法用的是CvGEMM();
CvGEMM(const CvArr* src1, //目标矩阵1,
const CvArr* src2, //目标矩阵2
double alpha, //1号矩阵系数
const CvArr* src3, //加权矩阵
double beta , //2号矩阵系数
CvArr* dst) //结果矩阵

dst=(alpha*scr1)x(scr2)+(beta*src3);
如果仅仅是给大家介绍CvGEMM()函数,我想这篇博客也就没有其任何意义。
项目里我开始用的是Mat,Mat是一个类,一般对类进行操作是比较方便的,定义的变量也会随着类执行完后在析构函数内被释放掉。百度上比较坑人的就是,当你搜索矩阵乘法的时候,各种关于CvMat的一般矩阵乘法公式出现在你的面前,当然CvMat是可以解决矩阵乘法,可是你看看上面的函数参数,就会知道,这个还是不是很简单,特别是给CvMat赋初值的时候,还会用到数组,这个当你需要用到动态数组的时候就会出问题了,我现在还没有解决我程序的一个关于CvMat的bug。有大神看到的话,可以一起交流。但是如果我们用Mat就会好很多,它会对内存进行动态管理,不需要手动的操作,一些简单的矩阵操作也不需要用到函数,直接相乘,相加就好。例如下面(A,B表示矩阵(Mat),):
- 矩阵A与矩阵B相乘:A*B
- 矩阵A与矩阵B相加:A+B
- 矩阵的缩放:alpha*A
- 矩阵的叉乘和点乘:A.cross(B),A.dot(B)
- 矩阵的逆:A.inv();/Mat::inv()
- 矩阵的转置: A.t();
可以用外部函数实现更多关于矩阵的计算:
- 矩阵的加减乘除:add();subtract();multiply();divide();
- 矩阵的加权计算:void addWeighted(
InputArray src1,
double alpha,
InputArray src2,
double beta,
double gamma,
OutputArray dst,
int dtype=-1)
dst(I)=src1(I)∗alpha+src2(I)∗beta+gamma
- 列表内容

.矩阵的逆:double invert(
InputArray src,
OutputArray dst,
int flags=DECOMP_LU)
需要指出的是:DECOMP_LU是高斯消元法,其局限性是只能计算非奇异矩阵
DECOMP_SVD:采用的是奇异值分解法
DECOMP_CHOLESKY:采用的是Cholesky分解。其局限性也是只能计算非奇异的方形矩阵

  • .
    矩阵的转置:transpose(A,B);
    其中B为A的转置

  • 矩阵的行列式:determinant(A),直接返回行列式的值,需要指出的是 矩阵的类型必须是CV_32F或CV_64F的方阵

你可能感兴趣的:(opencv)