opencv 笔记(二)

来源:互联网 发布:java软件编程培训中心 编辑:程序博客网 时间:2024/06/06 01:45

Mat 转变成IplImage* 类型

Mat srcImg;                         // Mat type variable .IplImage *dst = NULL;         // Initialize by NULL.srcImg = imread(imagePath);         // read image;         dst = &(IplImage(srcImg));    // Mat to IplImage Pointer dst = NULL;                   // set as NULL.


Mat I;IplImage* pI     = &I.operator IplImage();CvMat* mI        =  &I.operator CvMat();




高斯平滑

  GaussianBlur( image, out, Size( 3, 3 ), 0, 0 );



均值滤波

Blur( image, out, Size( 3, 3 ) );



两个矩阵合并

有的时候我们需要将几个矩阵按行或者按列进行合并成一个大矩阵,这在Matlab里面非常的简单,但在OpenCV里面并没有这样的方法,现在我在OpenCV的源码里面发现合并矩阵的方法,分享给大家。

    A = [1 2 3 4];    B = [2 3 4 5];    C = [A;B];

上面的是Matlab语言的矩阵合并,非常的简洁简单。接下来我给出OpenCV的两个矩阵的合并代码.

Mat mergeRows(Mat A, Mat B){    CV_ASSERT(A.cols == B.cols&&A.type() == B.type());    int totalRows = A.rows + B.rows;    Mat mergedDescriptors(totalRows, A.cols, A.type());    Mat submat = mergedDescriptors.rowRange(0, A.rows);    A.copyTo(submat);    submat = mergedDescriptors.rowRange(A.rows, totalRows);    B.copyTo(submat);    return mergedDescriptors;}


OpenCV中与matlab中相对应的函数(可以自行对应到2.0或3.0版本)

1、matlab中的imread相当于OpenCV中的imread

2、matlab中的zeros函数相当于OpenCV中的cvSetZero函数。

3、matlab中的两矩阵点乘 .* 相当于OpenCV中的cvMul函数。

4、matlab中的两矩阵点除 ./ 相当于OpenCV中的cvDiv函数。

5、matlab中的两矩阵相加 + 相当于OpenCV中的cvAdd函数。

6、matlab中的两矩阵相减 - 相当于OpenCV中的cvSub函数。

7、matlab中的矩阵和一个常量相加 A + a 相当于OpenCV中的cvAddS函数 cvAdds(matA, cvScalar(a), matB)。

8、matlab中的矩阵和一个常量相减 A - a 相当于OpenCV中的cvSubS函数 cvSubS(matA, cvScalar(a), matB)。

9、matlab中的给矩阵赋一初值 A(:, :) = a 相当于OpenCV中的cvSet函数 cvSet(matA, cvScalar(a))。

10、matlab中取矩阵某一部分赋给另一矩阵 A = B(i : j, m : n) 相当于OpenCV中的cvGetSubRect 函数,cvGetSubRect(mat1, mat2, rect)。

11、matlab中取矩阵最大值、最小值 max(max(A))、min(min(A)) 相当于OpenCV中的cvMinMaxLoc函数 cvMinMaxLoc(A, minloc, maxloc)。

12、matlab中两矩阵相乘 A * B 相当于OpenCV中的cvMatMul函数,cvMatMul(A, B, C)。

13、matlab中计算两个三维向量的叉积 C = cross(A, B) 相当于OpenCV中的cvCrossProduct函数,cvCrossProduct(A, B, C)。

14、matlab中计算向量的范数 c = norm(A) 相当于OpenCV中的cvNorm函数,c = cvNorm(A)。

下面是matlab中的定义,对应需要考虑OpenCV中的实现
1、如果A为矩阵n=norm(A) 返回A的最大奇异值,即max(svd(A))n=norm(A,p) 根据p的不同,返回不同的值 p 返回值 1 返回A中最大一列和,即max(sum(abs(A)))  2 返回A的最大奇异值,和n=norm(A)用法一样 inf 返回A中最大一行和,即max(sum(abs(A’))) ‘fro’  A和A‘的积的对角线和的平方根,即sqrt(sum(diag(A'*A)))2、如果A为向量norm(A,p)返回向量A的p范数。即返回 sum(abs(A).^p)^(1/p),对任意 1<p<+∞.norm(A)返回向量A的2范数,即等价于norm(A,2)。norm(A,inf) 返回max(abs(A))norm(A,-inf) 返回min(abs(A))

15、matlab中求二维矩阵的奇异值分解 [u s v] = svd(A, 0) 相当于OpenCV中的cvSVD函数 cvSVD(A, s, u, v)。

16、matlab中两矩阵左除 c = a / b 相当于OpenCV中的cvInvert、cvMatMul两函数即:cvInvert(a, d); cvMatMul(d, b, c)。

17、matlab中的求矩阵的逆inv函数 A = inv(B) 相当于OpenCV中的cvInvert函数:cvInvert(B,A)。

18、matlab中的矩阵除以一个数A/a相当于OpenCV中的函数cvConvertScale

19、matlab中的求和函数sum相当于OpenCV中的函数cvSum

20、matlab中将world coordinate中的点矩阵X变到camera coordinate中的变换R*X+T可以用函数cvMatMulAdd实现,但需注意,translation是一个3行N列的矩阵。

21、matlab中矩阵乘一个常数可用cvConvertScale实现。



calcCovarMatrix函数求协方差矩阵存在的问题
opencv中求得的协方差矩阵比matlab中的大(n-1)倍!(n是矩阵的行数)
也就是得到协方差矩阵后需要除以(行数-1) 才和matlab 中的数据相同


0 0