CvMat* mat1=cvCreate(3,3,CV_64FC1);
CvMat* mat2=cvCreate(3,3,CV_64FC1);
CvMat* mat3=cvCreate(3,3,CV_64FC1);
cvmSet(mat1,0,1,9);
cvmSet(mat1,2,1,3);
cvmSet(mat1,1,1,6);
cvmSet(mat1,0,1,1);
cvmSet(mat1,2,1,1);
cvmSet(mat1,1,1,1);
此时可以直接调用cvSum、cvMul等函数。而下面的情况不能直接调用前面的这些函数:
double a[]={3,5,2,2};
double b[]={3,1,2,7};
CvMat mat1=cvMat(2,2,CV_64FC1,a);
CvMat mat2=cvMat(2,2,CV_64FC1,b);
而此时不能直接调用cvMul、cvSum之类的函数,在mat1之前加“&”也无济于事,因为这些函数要求输入矩阵的指针。
为了解决这个问题,我做了一个变通,矩阵的指针也就是矩阵的首地址,如何获取矩阵的首地址呢,我们来看一下矩阵
头的结构:
typedef struct CvMat
{
int type; /* CvMat 标识 (CV_MAT_MAGIC_VAL), 元素类型和标记 */
int step; /* 以字节为单位的行数据长度*/
int* refcount; /* 数据引用计数 */
union
{
uchar* ptr;
short* s;
int* i;
float* fl;
double* db;
} data; /* data 指针 */
#ifdef __cplusplus
union
{
int rows;
int height;
};
union
{
int cols;
int width;
};
#else
int rows; /* 行数 */
int cols; /* 列数*/
#endif
} CvMat;
可见type是CvMat的第一个成员,那么它的地址和矩阵的首地址也就是矩阵的指针所指向的地址是一致的,
我们可以这样调用cvMul、cvSum,如下所示:
cvMul(& src1.type, &src2.type,& dst.type, 1 );
CvScalar sum = cvSum(&mat1.type).val[0];
附:
typedef struct CvScalar
{
double val[4]
}CvScalar;