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 }            

自己写一个方法读取。

转载于:https://www.cnblogs.com/chan20160228/p/5226250.html

3.2 矩阵和图像类型相关推荐

  1. 9.2 图像类型(灰度图像、彩色图像、二值图像以及图像间的转换)

    常用0表示黑色,255表示白色,用0到255之间的数表示灰度 1.灰度图像 例1:生成一个灰色图像,并显示 A = [0 230; 255 60; 30 100]; A = uint8(A); ims ...

  2. matlab中的图像类型

    MATLAB中的图像类型 在MATLAB中数组是最基本的数据结构,大部分图像用二维 数组即矩阵表示,矩阵中的一个元素对应一个像素.例如,一个由500行600列不同颜色点组成的图像可以用500*600的 ...

  3. Matlab图像处理基础(一)图像类型的转换

    图像类型转换 首先我们需要知道图像类型有哪几种:二值图像,灰度图像,真彩色图像,索引色图像 四种. 一. RGB图像转换为灰度图像 需要调用 rgb2gray() 函数,调用格式为: X =rgb2g ...

  4. 【MATLAB Image Processing Toolbox 入门教程六】“导入、导出和转换”之“图像类型转换Ⅰ——在不同图像类型之间转换”

    [MATLAB Image Processing Toolbox 入门教程六] 1 gray2ind函数 2 ind2gray函数 3 mat2gray函数 4 rgb2gray函数 5 rgb2in ...

  5. 图形图像类计算机,(计算机图形图像类型.ppt

    (计算机图形图像类型 教学目标: 如果要定义"数字图形"的概念,首先要弄清"图形"的含义."图形"一词在<现代汉语词典>里指的是 ...

  6. 【OpenCV】矩阵和图像的操作总结查询

     矩阵和图像操作 表3-3列出了一些操作矩阵图像的函数,其中的大部分对于图像处理非常有效.它们实现了图像处理中的基本操作,例如对角化.矩阵变换以及一些更复杂的诸如计算图像的统计操作.        ...

  7. R语言plotly可视化:plotly可视化基本散点图(指定图像类型、模式)、plotly可视化散点图(为不同分组数据配置不同的色彩)、ggplotly使用plotly包呈现ggplot2的可视化结果

    R语言plotly可视化:plotly可视化基本散点图(指定图像类型.模式).plotly可视化散点图(为不同分组数据配置不同的色彩).ggplotly使用plotly包呈现ggplot2的可视化结果 ...

  8. 【Matlab 控制】矩阵、图像操作基础

    Matlab矩阵.图像操作基础 1. 矩阵操作 计算特征值和特征向量 计算矩阵指数 2. 图像操作 显示单条曲线 显示多条曲线 设置曲线线宽 添加图例 添加x轴y轴标签 添加图像标题 3. 显示结果 ...

  9. ITK:读未知的图像类型

    ITK:读未知的图像类型 内容提要 C++实现代码 内容提要 读取一张未知图片 C++实现代码 #include "itkImageFileReader.h" #include & ...

最新文章

  1. 免费报名 | 微软全双工语音对话以及在智能硬件上的应用
  2. Azkaban入门(启动一个Simple Example)
  3. python处理excel表格实例-通过实例学习Python Excel操作
  4. 区块链金融应用论坛关于量化的分享
  5. 【错误记录】Flutter 混合开发报错 ( Android 端与 Flutter 端 EventChannel 初始化顺序错误导致无法通信 | EventChannel 通信流程 )
  6. “三农”谋定金融 中国农民丰收节交易会金融服务研讨会
  7. PMCAFF | 创业必读:如何打造一个团队从无到有,再到高效的管理方式
  8. C++ 输出当前所在的路径
  9. ajax+json字段变false,JS基础
  10. 工作113:添加echart折线图
  11. 【HDU - 6187】Destroy Walls(思维,最大生成树)
  12. 批量创建10个用户stu01-stu10,并且设置随机8位密码
  13. 3.3 腾讯云AI案例
  14. html点击按钮跳转到另一个界面_网页制作:一个简易美观的登录界面
  15. 科技狂人埃隆·马斯克
  16. python函数求导 不使用模块_Python sympy 模块常用功能(二)
  17. Intellij IDEA中使用git命令窗口
  18. 非关系型数据库NoSQL的崛起
  19. os.system获取返回值 python3 cmd 获取返回值
  20. LeetCode每日一题——Day21

热门文章

  1. Android源码分析--MediaServer源码分析(二)
  2. Android6.0的SMS(短信)源码分析--短信接收
  3. devc++鼠标变成了光标_游戏鼠标到底能不能提升你的实力?
  4. 所属文件不可访问_日志文件写入失败(permission denied)
  5. 排队接水pascal程序
  6. java中上传文件_Java中文件上传下载 --使用Minio
  7. java中实现接口采用的关键字是_一个Java类实现一个接口使用的是implements关键字。...
  8. Servlet(自己实现的Servlet)细节
  9. 人脸情绪识别系统第一次迭代总结
  10. WebSocket 详解