一、前言

Mat中的step为构成图像的层次,考虑到Mat多应用于二维图像,本文讨论二维图像step的含义和应用。二维图像数据存储示意图如下:

如上图所示,该二维图像大小为5*6,图中元素I位于第2行第4列,该元素可具有多个通道,可为1、2、3、4;常见通道数为1或3,相应为灰度图像或RGB图像,RGB图像的通道排列为B分量、G分量、R分量。
二、Mat::setp、Mat::step1
       对于二维图像, setp、step1均为2维,意义为:
setp[0]: 线的数据量大小,单位为字节
setp[1]: 点的数据量大小,单位为字节
step1(0): 线的通道数量
step1(1): 点的通道数量

上述线、点为构成二维图像数据的层次,例如第2行第4列元素,线、点序号为1、3。

三、示例
       以下对分别对8UC3类型、16UC3类型二维数据进行测试说明

//main.cpp
#include <iostream>#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/imgproc/imgproc.hpp>using namespace cv;
using namespace std;
int M = 5;
int N  = 6;int main()
{int n = M*N*3;uchar * data8UC3 = new uchar[n];short * data16UC3 = new short[n];for (int i = 0; i < n; ++i){data8UC3[i] = i;data16UC3[i] = i;}Mat mat8UC3(M, N, CV_8UC3, data8UC3);Mat mat16UC3(M, N, CV_16UC3, data16UC3);cout << "*************************8UC3类型二维数据**************************\n";cout << "step[0]:" << mat8UC3.step[0]   //18,线大小,单位字节,8UC3,则每个通道数据只需1字节<< "\nstep[1]:" << mat8UC3.step[1]      //3,点大小,单位字节<< "\nstep1(0):" << mat8UC3.step1(0)   //18, 线的通道数<< "\nstep1(1):" << mat8UC3.step1(1);  // 3,点的通道数cout << "\n\ncout直接输出矩阵:\n" << mat8UC3<< "\n";cout << "\nm.addr(i,j) = m.data + step[0]*i + step[1]*j方式输出矩阵:\n";uchar *p8UC3 = mat8UC3.data;for (int i = 0; i < M; ++i){for (int j = 0; j < N; ++j){std:cout << (int)*(p8UC3 + mat8UC3.step[0] * i + mat8UC3.step[1] * j + 0) << " "<< (int)*(p8UC3 + mat8UC3.step[0] * i + mat8UC3.step[1] * j + 1) << " "<< (int)*(p8UC3 + mat8UC3.step[0] * i + mat8UC3.step[1] * j + 2) << " ";}std::cout << "\n";}cout << "\n*************************16UC3类型二维数据**************************\n";cout << "step[0]:" << mat16UC3.step[0]    //36,线大小,单位字节,16UC3,则每个通道数据只需2字节<< "\nstep[1]:" << mat16UC3.step[1]    //6,点大小,单位字节<< "\nstep1(0):" << mat16UC3.step1(0)   //18, 线的通道数<< "\nstep1(1):" << mat16UC3.step1(1);  // 3,点的通道数cout << "\n\ncout直接输出矩阵:\n" << mat16UC3 << "\n";cout << "\nm.addr(i,j) = m.data + step1(0)*i + step1(1)*j方式输出矩阵:\n";short *p16UC3 = (short*)mat16UC3.data;for (int i = 0; i < M; ++i){for (int j = 0; j < N; ++j){cout << (int)*(p16UC3 + mat16UC3.step1(0) * i + mat16UC3.step1(1) * j + 0) << " "<< (int)*(p16UC3 + mat16UC3.step1(0) * i + mat16UC3.step1(1) * j + 1) << " "<< (int)*(p16UC3 + mat16UC3.step1(0) * i + mat16UC3.step1(1) * j + 2) << " ";}std::cout << "\n";}delete data8UC3;delete data16UC3;return 0;
}

四、程序运行结果

可见单个通道的数据量不为1字节时,由Mat::data指针访问数据,必须使用step1(0)、step1(1),更细致了解访问Mat中的每个像素值可看这篇博文http://blog.csdn.net/xiaowei_cqu/article/details/19839019

二维图像中Mat::setp、Mat::step1理解相关推荐

  1. 拉普拉斯算子属于卷积方法吗_二维图像中的Laplace算子和图论中的Laplacian矩阵...

    最近在阅读 如何理解 Graph Convolutional Network(GCN)?​www.zhihu.com 接触到了图论中的Laplacian矩阵,定义为 , 是Laplacian矩阵, 是 ...

  2. 二维图像中的Hessian矩阵(及MATLAB代码)

    文章目录 一.图像中Hessian矩阵的定义及公式推导 二.MATLAB代码 一.图像中Hessian矩阵的定义及公式推导 对于二维图像 f ( x , y ) f(x,y) f(x,y),在点 x ...

  3. OpenCV图像处理:基于RANSAC的二维图像中直线、圆及椭圆的检测 C++

    基于ransac的直线.圆及椭圆检测算法C++代码 LINK: https://github.com/Yiphy/Ransac-2d-Shape-Detection # Ransac-2d-Shape ...

  4. 【多传感融合】优达学城多传感融合学习笔记(二)——将激光雷达点云俯视图映射到二维图像

    将激光雷达点云俯视图映射到二维图像 目录 将激光雷达点云俯视图映射到二维图像 简介 实现方法 参考代码 简介 本节讲解如何将激光雷达点云俯视图(仅考虑水平坐标)映射到二维图像中,其中涉及到激光雷达点云 ...

  5. 三维激光点云到二维图像的投影

    Camera系列文章 传感器融合是将多个传感器采集的数据进行融合处理,以更好感知周围环境:这里首先介绍Camera的相关内容,包括摄像头及图像知识基本介绍,OpenCV图像识别(特征提取,目标分类等) ...

  6. python怎么画简单图片-Python绘制简易的二维图像

    大家好,我是飞向天空的牛. 最近学习了一下用Python绘制简易的二维图像,代码如下图所示:绘图代码 文本如下: import matplotlib.pyplot as plt import nump ...

  7. 【MATLAB】二维绘图 ( 绘制二维图像 | 设置图像样式 )

    文章目录 一.绘制二维图像 1.二维绘图步骤 2.二维绘图步修饰 3.代码示例 二.设置图像参数 1.图像参数 2.代码示例 一.绘制二维图像 1.二维绘图步骤 绘图前需要给定 xxx 轴 , yyy ...

  8. 程序员用「美貌」突破二维图像的人脸识别

    GitChat 作者:于航 原文: 如何利用"女装术"突破基于二维图像的人脸识别 关注微信公众号:「GitChat 技术杂谈」 一本正经的讲技术 [不要错过文末彩蛋] 首先声明,这 ...

  9. python画车辆轨迹图_如何利用 Python 绘制酷炫的 车辆轨迹 — 速度时空图?三维数据用二维图像呈现...

    说明:本文系交通攻城狮原创文章,如需转载请私信联系,侵权必究. 2020,第 30 期,编程笔记 建议直接阅读精编版:如何利用 Python 绘制酷炫的 车辆轨迹 - 速度时空图?三维数据用二维图像呈 ...

  10. python绘制曲线y=2x+5_Python绘制简易的二维图像

    大家好,我是飞向天空的牛. 最近学习了一下用Python绘制简易的二维图像,代码如下图所示:绘图代码 文本如下: import matplotlib.pyplot as plt import nump ...

最新文章

  1. boot访问resources下边的图片_SpringBoot系列之JDBC数据访问
  2. 【Windows 逆向】使用 CE 工具挖掘关键数据内存真实地址 ( CE 找出子弹数据内存地址是临时地址 | 挖掘真实的子弹数据内存地址 )
  3. java各层级限流对比,面试官说:来谈谈限流-从概念到实现,一问你就懵逼了?...
  4. 《TableStore最佳实践:GEO索引打造店铺搜索系统》
  5. node.js 使用domain模块捕获异步回调中的异常
  6. python_day4作业
  7. [笔记二]Essential JavaScript Design Patterns For Beginners
  8. 接口中的静态方法作用_接口一定要实现,才能为自己所用
  9. Trustzone OP-TEE 在QEMU平台上的编译、运行与测试
  10. python隐藏窗口_python怎么隐藏界面?
  11. 《心理学与生活》发展与教育(上)
  12. 计算机没有显示远程桌面连接,连接远程桌面时出现:“这台计算机没有远程桌面客户端访问许可”,怎么处理?...
  13. Termux – Android运行aarch64 – Linux – 安卓设备建站 – 让旧安卓设备老树新花
  14. Android 动画之一 Drawable Animation —— 逐帧(Frame)动画
  15. 极客标签:可能是目前最好的前端代码学习工具
  16. python优秀代码写法笔记
  17. 开源社区的由来(转载)
  18. 【数电实验】触发器及其应用
  19. 高温预警c语言,高温预警信号分为几个等级
  20. 在PowerPoint中插入Flash动画

热门文章

  1. 华硕天选笔记本电脑启动机器后搜索不到网络
  2. 费马大定理与费马小定理
  3. 美团2020校招测试方向笔试题
  4. linux中iso源码解压_linux下解压iso镜像文件方法
  5. 使用计算机时要注意防,计算机使用的几个基本技巧
  6. Keil编译后Code RO Data Rw Data ZI的含义
  7. 解决IOS微信SDK初始化失败
  8. 电脑开机计算机配置,电脑开机显示正在配置更新请勿关闭计算机 重新启动之后,电脑里的数...
  9. 服务器数据抓包(原来微信图片真的可以抓包看的)
  10. UEFI——PCD研究