二维图像中Mat::setp、Mat::step1理解
一、前言
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理解相关推荐
- 拉普拉斯算子属于卷积方法吗_二维图像中的Laplace算子和图论中的Laplacian矩阵...
最近在阅读 如何理解 Graph Convolutional Network(GCN)?www.zhihu.com 接触到了图论中的Laplacian矩阵,定义为 , 是Laplacian矩阵, 是 ...
- 二维图像中的Hessian矩阵(及MATLAB代码)
文章目录 一.图像中Hessian矩阵的定义及公式推导 二.MATLAB代码 一.图像中Hessian矩阵的定义及公式推导 对于二维图像 f ( x , y ) f(x,y) f(x,y),在点 x ...
- OpenCV图像处理:基于RANSAC的二维图像中直线、圆及椭圆的检测 C++
基于ransac的直线.圆及椭圆检测算法C++代码 LINK: https://github.com/Yiphy/Ransac-2d-Shape-Detection # Ransac-2d-Shape ...
- 【多传感融合】优达学城多传感融合学习笔记(二)——将激光雷达点云俯视图映射到二维图像
将激光雷达点云俯视图映射到二维图像 目录 将激光雷达点云俯视图映射到二维图像 简介 实现方法 参考代码 简介 本节讲解如何将激光雷达点云俯视图(仅考虑水平坐标)映射到二维图像中,其中涉及到激光雷达点云 ...
- 三维激光点云到二维图像的投影
Camera系列文章 传感器融合是将多个传感器采集的数据进行融合处理,以更好感知周围环境:这里首先介绍Camera的相关内容,包括摄像头及图像知识基本介绍,OpenCV图像识别(特征提取,目标分类等) ...
- python怎么画简单图片-Python绘制简易的二维图像
大家好,我是飞向天空的牛. 最近学习了一下用Python绘制简易的二维图像,代码如下图所示:绘图代码 文本如下: import matplotlib.pyplot as plt import nump ...
- 【MATLAB】二维绘图 ( 绘制二维图像 | 设置图像样式 )
文章目录 一.绘制二维图像 1.二维绘图步骤 2.二维绘图步修饰 3.代码示例 二.设置图像参数 1.图像参数 2.代码示例 一.绘制二维图像 1.二维绘图步骤 绘图前需要给定 xxx 轴 , yyy ...
- 程序员用「美貌」突破二维图像的人脸识别
GitChat 作者:于航 原文: 如何利用"女装术"突破基于二维图像的人脸识别 关注微信公众号:「GitChat 技术杂谈」 一本正经的讲技术 [不要错过文末彩蛋] 首先声明,这 ...
- python画车辆轨迹图_如何利用 Python 绘制酷炫的 车辆轨迹 — 速度时空图?三维数据用二维图像呈现...
说明:本文系交通攻城狮原创文章,如需转载请私信联系,侵权必究. 2020,第 30 期,编程笔记 建议直接阅读精编版:如何利用 Python 绘制酷炫的 车辆轨迹 - 速度时空图?三维数据用二维图像呈 ...
- python绘制曲线y=2x+5_Python绘制简易的二维图像
大家好,我是飞向天空的牛. 最近学习了一下用Python绘制简易的二维图像,代码如下图所示:绘图代码 文本如下: import matplotlib.pyplot as plt import nump ...
最新文章
- boot访问resources下边的图片_SpringBoot系列之JDBC数据访问
- 【Windows 逆向】使用 CE 工具挖掘关键数据内存真实地址 ( CE 找出子弹数据内存地址是临时地址 | 挖掘真实的子弹数据内存地址 )
- java各层级限流对比,面试官说:来谈谈限流-从概念到实现,一问你就懵逼了?...
- 《TableStore最佳实践:GEO索引打造店铺搜索系统》
- node.js 使用domain模块捕获异步回调中的异常
- python_day4作业
- [笔记二]Essential JavaScript Design Patterns For Beginners
- 接口中的静态方法作用_接口一定要实现,才能为自己所用
- Trustzone OP-TEE 在QEMU平台上的编译、运行与测试
- python隐藏窗口_python怎么隐藏界面?
- 《心理学与生活》发展与教育(上)
- 计算机没有显示远程桌面连接,连接远程桌面时出现:“这台计算机没有远程桌面客户端访问许可”,怎么处理?...
- Termux – Android运行aarch64 – Linux – 安卓设备建站 – 让旧安卓设备老树新花
- Android 动画之一 Drawable Animation —— 逐帧(Frame)动画
- 极客标签:可能是目前最好的前端代码学习工具
- python优秀代码写法笔记
- 开源社区的由来(转载)
- 【数电实验】触发器及其应用
- 高温预警c语言,高温预警信号分为几个等级
- 在PowerPoint中插入Flash动画