一:CvMat* cvInitMatHeader( CvMat* mat, int rows, int cols, int type,void* data=NULL, int step=CV_AUTOSTEP ); mat 指针指向要被初始化的矩阵头. rows 矩阵的行数. cols 矩阵的列数. type 矩阵元素类型. data 可选的,将指向数据指针分配给矩阵头. step 排列后的数据的整个行宽。默认状态下。使用 STEP 的最小可能值。比如假定矩阵的行与行之间无隙
double a[] = { 1, 2, 3, 4
5, 6, 7, 8, 9, 10, 11, 12 }; double b[] = { 1, 5, 9, 2, 6, 10, 3, 7, 11, 4, 8, 12 }; double c[9];// c 数组存贮 a(3x4) 和 b(4x3) 矩阵的积 CvMat Ma, Mb, Mc ; cvInitMatHeader( &Ma, 3, 4, CV_64FC1, a );//创建矩阵,按行存储的 cvInitMatHeader( &Mb, 4, 3, CV_64FC1, b ); cvInitMatHeader( &Mc, 3, 3, CV_64FC1, c );cvMatMulAdd( &Ma, &Mb, 0, &Mc );
cvReleaseMat(&Ma);
cvReleaseMat(&Mb);
cvReleaseMat(&Mc);
还有一种初始化矩阵:
double a[] = { 1, 2, 3, 4,
5, 6, 7, 8,
9, 10, 11, 12 };
CvMat Ma=cvMat(3, 4, CV_64FC1, a);
二:
cvMat存储矩阵的方法
cvGetRealND();返回单通道数组的指定元素
double cvGetReal1D( const CvArr* arr, int idx0 ); double cvGetReal2D( const CvArr* arr, int idx0, int idx1 ); double cvGetReal3D( const CvArr* arr, int idx0, int idx1, int idx2 ); double cvGetRealND( const CvArr* arr, int* idx ); arr 输入数组,必须是单通道. idx0 元素下标的第一个成员,以 0 为基准 idx1 元素下标的第二个成员。以 0 为基准 idx2 元素下标的第三个成员。以 0 为基准 idx 元素下标数组
返回特殊的数组元素
cvSetRealND();//改动指定数组元素值
void cvSetReal1D( CvArr* arr, int idx0, double value ); void cvSetReal2D( CvArr* arr, int idx0, int idx1, double value ); void cvSetReal3D( CvArr* arr, int idx0, int idx1, int idx2, double value ); void cvSetRealND( CvArr* arr, int* idx, double value ); arr 输入数组. idx0 元素下标的第一个成员。以 0 为基点 idx1 元素下标的第二个成员。以 0 为基点 idx2 元素下标的第三个成员,以 0 为基点 idx 元素下标数组 value 指派的值
cvGetND();//返回特殊的数组元素 多通道的 CvScalar cvGet1D( const CvArr* arr, int idx0 ); CvScalar cvGet2D( const CvArr* arr, int idx0, int idx1 ); CvScalar cvGet3D( const CvArr* arr, int idx0, int idx1, int idx2 ); CvScalar cvGetND( const CvArr* arr, int* idx ); arr 输入数组. idx0 元素下标第一个以 0 为基准的成员 idx1 元素下标第二个以 0 为基准的成员 idx2 元素下标第三个以 0 为基准的成员 idx 元素下标数组
cvSetND();//改动指定的数组?多通道的
void cvSet1D( CvArr* arr, int idx0, CvScalar value ); void cvSet2D( CvArr* arr, int idx0, int idx1, CvScalar value ); void cvSet3D( CvArr* arr, int idx0, int idx1, int idx2, CvScalar value ); void cvSetND( CvArr* arr, int* idx, CvScalar value ); arr 输入数组 idx0 元素下标的第一个成员,以 0 为基点 idx1 元素下标的第二个成员,以 0 为基点 idx2 元素下标的第三个成员,以 0 为基点 idx 元素下标数组 value 指派的值
voidcvmSet( CvMat* mat, int row, int col, double value );//设置单通道浮点矩阵的指定元素 mat 矩阵. row 行下标,以 0 为基点. col 列下标,以 0 为基点. value 矩阵元素的新值
doublecvmGet( const CvMat* mat, int row, int col );//返回单通道浮点矩阵指定元素 mat 输入矩阵. row 行下标。以 0 为基点. col 列下标,以 0 为基点
#include "cv.h" #include "highgui.h" #include <stdio.h> #include <math.h> #include <string.h> #pragma comment(lib, "cv.lib") #pragma comment(lib, "cxcore.lib") #pragma comment(lib, "highgui.lib") main() { CvMat Ma; CvMat Mb; CvMat *Mc; int i,j; double a[] = { 1, 2, 3, 4}; double b[] = { 1, 2, 3, 4 }; double c[]={0}; Mc=cvCreateMat(2,2,CV_64FC1); Ma=cvMat(2, 2, CV_64FC1, a); Mb=cvMat(2, 2, CV_64FC1, b); //cvTranspose(&Ma, Mc);//Ma的转置存储在Mc中,不能对自己进行转置 cvMatMul(&Ma, &Mb, Mc); cvmSet(Mc,1,1,3);//设置2行2列的值为3 //cvInitMatHeader(&Ma, 3, 4, CV_64FC1, a,CV_AUTOSTEP); for(i=0;i<2;i++) for(j=0;j<2;j++) printf("%f ",cvGetReal2D(Mc,i,j)); //printf("%f ",cvGet2D(Mc,i,j)); }