opencv 笔记(二)

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 中的数据相同


你可能感兴趣的:(Mat转变成IplImage)