关于OpenCV中矩阵调用自带函数的问题

 

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;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值