width

图像的宽度,就是像素的个数

间距(pitch)

在图像数据传输和显示的过程中有一个不常用的参数:间距。

它有很多的别名,

  • 在使用d3d(Direct3D,是微软为提高3D游戏在Windows中的显示性能而开发的显示程序接口)显示的时候,它叫pitch
  • 在用ffmpeg解码的时候,它叫linesize
  • 在用ffmpeg转换格式的时候,它叫stride

统一以间距来表示。

这个参数看起来似乎没什么用,因为它的值和图像的宽度一样。但是那是大多数情况下,一旦遇到它和宽度不一样的时候,如果你不了解它的含义,那么程序肯定要出问题。可是为什么有时候它等于宽度,有时候又不等于呢?这就和它的含义有关了。

我们都知道现在计算机的cpu都是32位或者64位的cpu,他们一次最少读取4、8个字节,如果少于这些,反而要做一些额外的工作,会花更长的时间。所有会有一个概念叫做内存对齐,将结构体的长度设为4、8的倍数。

间距也是因为同样的理由出现的。因为图像的操作通常按行操作的,如果图像的所有数据都紧密排列,那么会发生非常多次的读取非对齐内存。会影响效率。而图像的处理本就是一个分秒必争的操作,所以为了性能的提高就引入了间距这个概念。

间距就是指图像中的一行图像数据所占的存储空间的长度,它是一个大于等于图像宽度的内存对齐的长度。这样每次以行为基准读取数据的时候就能内存对齐,虽然可能会有一点内存浪费,但是在内存充裕的今天已经无所谓了。

间距的值

所以如果图像的宽度如果是内存对齐长度的整数倍,那么间距就会等于宽度,而现在的cpu通常一次读取都是4个字节,而我们通常见到的分辨率都是4的整数倍,所以我们通常发现间距和图像的宽度一样(这里通常指rgb32格式或者以通道表示的yuv420p格式的y通道)。但是如果遇到一些少见的分辨率时间距和图像的宽度就不一样。

还有一种情况是显卡,因为显卡是独立工作的,所以显卡可能和cpu的内存对齐位数是不同的,此时间距就可能和cpu上的有很大差别,例如NVIDA显卡(它的内存对齐位数超大),通常在用d3d显示的时候会用到间距。所以如果你的d3d显示程序在Intel的显卡上显示正常,而在NVIDA显卡上显示不正常,先不要怀疑显卡驱动,先看看你有没有正确处理间距的问题。

间距的处理

那么对于间距和宽度不同的时候要如何处理呢?在不同的情况下,处理不同,但是只要把握一个核心—内存对齐,就能理解。

在使用d3d做图像显示的时候,在获取显示内存空间的时候通常会获取到一个参数pitch,就是我们的间距。显卡每次都将pitch长度的数据当做一行。我们将图像数据复制过去得时候要一行一行复制,每次下一行数据的目的起始位置都是上一行的起始位置加上间距。

如果是yv12这种通道表示的数据,u、v通道要相应的将行距除2。间距导致的空间内容可以不用置空。(?不太理解,可能是我没有了解过YUV图像数据格式的原因

在ffmpeg解码的时候,解码后会获取到一个参数linesize,其实也是间距。从解码后的数据内存中将数据拷贝出来的时候,需要一行一行拷贝,每一行数据的起始位置都是上一行的起始位置加上间距,一行的真正的图像数据长度就是图像宽度(通道类型要相应除倍数)。

在用ffmpeg进行图像格式转换的时候,需要传入一个参数stride,其实也是间距。只不过这次不需要复杂的处理,只需要知道传入ffmpeg进行转换的图像数据使用的间距,然后传入就行,ffmpeg会自动根据这个值进行相应的处理。

一般视频、图像存储在内存时,图像的每一行末尾也许包含一些扩展的内容,这些扩展的内容只影响图像如何存储在内存中,但是不影响图像如何显示出来;

参考文章:图像Width和Pitch

图像间距pitch是什么?(linesize、stride)(指图像中的一行图像数据所占的存储空间的长度)相关推荐

  1. 剑指offer:大恒图像

    大恒图像:成立于1991年,专注于视觉部件.视觉系统及互联网医疗相关产品研发.生产和营销的高科技企业. 旗下产品信息: 1.图像采集卡 摄像机等输入的模拟图像信号经过A/D转换,或将数字摄像机的输出信 ...

  2. 如何在Tensorflow.js中处理MNIST图像数据

    by Kevin Scott 凯文·斯科特(Kevin Scott) 如何在Tensorflow.js中处理MNIST图像数据 (How to deal with MNIST image data i ...

  3. pcl中ransac提取直线_复杂场景中的一个图像配准思路

    在很多时候,我们可能需要使用到图像的识别与配准工作,来判断某个特征或者是划出某个特定特征的位置.现在的深度学习已经能够比较好地解决这个问题,比如常见的YOLO,可以利用几行设定代码就能够划出所需要识别 ...

  4. 视觉中的经典图像特征小结(一): 颜色直方图, HOG, LBP

    [普兒原创, 如有错误和纰漏欢迎指正. 更新中...] 1. 颜色直方图 颜色空间在本质上是定义在某种坐标系统下的子空间,空间中的每一个坐标表示一种不同的颜色.颜色空间的目的在于给出某种颜色标准,使得 ...

  5. WPF中GDI+图形图像的绘制:(五)绘制图像——蒙板效果

    这里要实现的效果指的是对图片像素点区域进行颜色叠加,首先要做的是得到图片非透明部分的区域,效果如图: 实现步骤:1.在主窗体添加控制控件: <Label Grid.Row="4&quo ...

  6. halcon 图像差分_halcon纹理分析例子detect_mura_defects_texture.hdev 高纹理图像中的mura缺陷检测...

    目标:实现高纹理图像中缺陷的检测(黑色). 思路为: 1.对彩色图像进行R G B分解,选取B作为后续图像. 2. 生成背景模板,将图像傅里叶变换到频域中,通过高斯滤波,然后傅里叶反变换回来,得到的图 ...

  7. OpenCV中的图像处理 —— 图像阈值+图像平滑+形态转换

    OpenCV中的图像处理 -- 图像阈值+图像平滑+形态转换 目录 OpenCV中的图像处理 -- 图像阈值+图像平滑+形态转换 1. 图像阈值 1.1 简单阈值 1.2 自适应阈值 1.3 Otsu ...

  8. 图像特征算法(三)——ORB算法简述及Python中ORB特征匹配实践

    计算机视觉专栏传送 上一篇:图像特征算法(二)--SURF算法简述及Python标记SURF特征检测实践 下一篇:持续创作中- 目录 计算机视觉专栏传送 一.ORB算法 1.算法简介 2.FAST寻找 ...

  9. Qt 中获取摄像头图像数据的方法

    Qt 中获取摄像头图像数据的方法 在 Qt 中提供了 QCamera 类用来操作摄像头.(这里的摄像头指的是电脑上常用的那种 USB 摄像头或网络摄像头,暂时还不支持工业相机.)摄像头获取的实时图像可 ...

最新文章

  1. 设计模式(一)工厂模式Factory(创建型)
  2. html入门学习(一)
  3. 如何给SAP云平台的账号分配Leonardo机器学习服务的实例
  4. html里下拉标记,HTML: select 标签
  5. c语言二维数组代码,C语言之二维数组(示例代码)
  6. 微型计算机原理计算两数和,微型计算机原理及汇编语言 第2章-2 补码及加减运算.ppt...
  7. 阻止xap文件在浏览器中缓存
  8. 以两种异步模型应用案例,深度解析Future接口
  9. 用Angular制作单页应用视图切换动画
  10. NUC1372 Bull Math【大数】
  11. Java中对象的串行化(Serialization)和transient关键字
  12. error: ac_nonexistent.h: No such file or directory
  13. fatal: ‘http://git.#####.com/test-auto/stability.git/‘ 鉴权失败
  14. easyui使用datagrid时deleteRow删除后行号问题
  15. 手机号码是如何构成的?
  16. MySQL数据表中的数据单表查询
  17. 计算机毕业设计java+ssm酒店管理系统(源码+系统+mysql数据库+Lw文档)
  18. 想在Android应用程序中将XLS文件转换为PDF吗?看完这篇教程就懂了
  19. c语言标识符的开头字母能不能大写,C语言-标识符
  20. 基于opencv的SFR算法

热门文章

  1. iphone ios 如何开发升级适配 iphone5 4inch
  2. 【Shall脚本】定时在线备份上传
  3. 日语单词检索 WebService 试运行 和简单说明
  4. 如何将SP1集成到Office 2007安装包
  5. LSMW批处理使用方法(04)_步骤3上
  6. SAP SD信用控制管理
  7. SAP 登陆界面菜单文本修改 (Modification of SAP Logon Menu text)
  8. 用数据可视化解读:为何2亿国人爱钓鱼
  9. jni直接转byte_JNI再探之JNI 数据类型及Java与C++之间互调
  10. java 日期 减法_JAVA日期加减运算