3.2 矩阵和图像类型

CvArr—>CvMat—>IplImage

CvMat矩阵结构

在OpenCV中没有vector结构,只有列矩阵。

1  cvMat* cvCreateMat(int rows, int cols, int type);  //新建一个二维矩阵

type在这里可以是任何预定义的类型,预定义结构为 CV_<bit_length>(S|U|F)C<numbers_of_channels>,例如CV_32FC1,CV_8UC3。

 1 //CvMat结构:矩阵头
 2 typedef struct CvMat{
 3     int type;
 4     int step;
 5     int* refcount;    //仅英特尔使用
 6     union{
 7         uchar* ptr;
 8         short* s;
 9         int* i;
10         float* f1;
11         double* db;
12     }data;
13     union{
14         int rows;
15         int heights;
16     };
17     union{
18         int cols;
19         int width;
20     };
21 }CvMat;
 1 //创建一个指定行和列,数据类型的矩阵
 2 CvMat* cvCreateMat(int rows, int cols, int type);
 3 
 4 //仅创建矩阵头,不为数据分配内存
 5 CvMat* cvCreateMatHeader(int rows, int cols, int type);
 6 
 7 //用已经存在的CMat结构初始化矩阵头
 8 CvMat* cvInitMatHeader(
 9     cvMat* mat,
10     int rows,
11     int cols,
12     int type,
13     void* data = NULL,
14     int step = CV_AUTOSTEP
15 );
16 
17 //类似cvInitMatHeader(),但是为CMat分配了内存
18 CvMat cvMat(
19     int rows,
20     int cols,
21     int type,
22     void* data = NULL
23 );
24 
25 //用现有矩阵创建一个新的矩阵
26 CvMat* cvCloneMat(const CvMat* mat);
27 
28 //释放矩阵,包括矩阵头和数据
29 void cvReleaseMat(CvMat** mat);
矩阵的创建和释放
 1 #include "cv.h"
 2 
 3 int main(int argc, char** argv)
 4 {
 5     float vals[] = {0.866025, -0.500000, 0.500000, 0.866025};
 6 
 7     CvMat rotmat;
 8 
 9     cvInitMatHeader(
10             &rotmat,
11             2,
12             2,
13             CV_32FC1,
14             vals
15         );
16     return 0;
17 }
用固定数据创建一个OpenCV矩阵

 矩阵数据的存取

1、简单的方法

1 //利用CV_MAT_ELEM()宏存取矩阵
2 CvMat* mat = cvCreateMat(5, 5, CV_32FC1);
3 float element_3_2 = CV_MAT_ELEM(*mat, float, 3, 2);
1 //利用CV_MAT_ELEM_PTR()为矩阵设置一个数值
2 CvMat* mat = cvCreateMat(5, 5, CV_32FC1);
3 float element_3_2 = 7.7;
4 *((float*)CV_MAT_ELEM_PTR(*mat, 3, 2)) = element;

2、麻烦的方法

 1 //指针访问矩阵结构,如果是仅仅读取数据可用cvGet*D,返回矩阵元素值
 2 uchar* cvPtr1D(
 3     const CvArr* arr,    //矩阵指针参数
 4     int idx0,            //表示索引的整数值
 5     int* type = NULL    //可选参数,代表输出值的类型
 6 );
 7 
 8 uchar* cvPtr2D(
 9     const CvArr* arr,
10     int idx0,
11     int idx1,
12     int* type = NULL
13 );
14 
15 uchar* cvPtr3D(
16     const CvArr* arr,
17     int idx0,
18     int idx1,
19     int* type = NULL
20 );
21 
22 uchar* cvPtrND(
23     const CvArr* arr,
24     int* idx,
25     int* type = NULL,
26     int create_node = 1,
27     unsigned* precalc_hashaval = NULL
28 );
 1 //累加一个三通道矩阵中的所有元素
 2 float sum(const CvMat* mat){
 3 float s = 0.0f;
 4 for(int row=0; row<mat->rows; row++){
 5     const float* ptr = (const float*)(mat->data.ptr + row * mat->step);  //指向每一行的头指针
 6         for(int col=0; col<mat->cols; col++){
 7             s += *ptr++;  //先算*ptr,然后ptr++
 8         }
 9     }
10     return s;
11 }            

自己写一个方法读取。

posted @ 2016-02-29 07:34  chan21252  阅读(669)  评论(0编辑  收藏  举报