图像间距pitch是什么?(linesize、stride)(指图像中的一行图像数据所占的存储空间的长度)
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)(指图像中的一行图像数据所占的存储空间的长度)相关推荐
- 剑指offer:大恒图像
大恒图像:成立于1991年,专注于视觉部件.视觉系统及互联网医疗相关产品研发.生产和营销的高科技企业. 旗下产品信息: 1.图像采集卡 摄像机等输入的模拟图像信号经过A/D转换,或将数字摄像机的输出信 ...
- 如何在Tensorflow.js中处理MNIST图像数据
by Kevin Scott 凯文·斯科特(Kevin Scott) 如何在Tensorflow.js中处理MNIST图像数据 (How to deal with MNIST image data i ...
- pcl中ransac提取直线_复杂场景中的一个图像配准思路
在很多时候,我们可能需要使用到图像的识别与配准工作,来判断某个特征或者是划出某个特定特征的位置.现在的深度学习已经能够比较好地解决这个问题,比如常见的YOLO,可以利用几行设定代码就能够划出所需要识别 ...
- 视觉中的经典图像特征小结(一): 颜色直方图, HOG, LBP
[普兒原创, 如有错误和纰漏欢迎指正. 更新中...] 1. 颜色直方图 颜色空间在本质上是定义在某种坐标系统下的子空间,空间中的每一个坐标表示一种不同的颜色.颜色空间的目的在于给出某种颜色标准,使得 ...
- WPF中GDI+图形图像的绘制:(五)绘制图像——蒙板效果
这里要实现的效果指的是对图片像素点区域进行颜色叠加,首先要做的是得到图片非透明部分的区域,效果如图: 实现步骤:1.在主窗体添加控制控件: <Label Grid.Row="4&quo ...
- halcon 图像差分_halcon纹理分析例子detect_mura_defects_texture.hdev 高纹理图像中的mura缺陷检测...
目标:实现高纹理图像中缺陷的检测(黑色). 思路为: 1.对彩色图像进行R G B分解,选取B作为后续图像. 2. 生成背景模板,将图像傅里叶变换到频域中,通过高斯滤波,然后傅里叶反变换回来,得到的图 ...
- OpenCV中的图像处理 —— 图像阈值+图像平滑+形态转换
OpenCV中的图像处理 -- 图像阈值+图像平滑+形态转换 目录 OpenCV中的图像处理 -- 图像阈值+图像平滑+形态转换 1. 图像阈值 1.1 简单阈值 1.2 自适应阈值 1.3 Otsu ...
- 图像特征算法(三)——ORB算法简述及Python中ORB特征匹配实践
计算机视觉专栏传送 上一篇:图像特征算法(二)--SURF算法简述及Python标记SURF特征检测实践 下一篇:持续创作中- 目录 计算机视觉专栏传送 一.ORB算法 1.算法简介 2.FAST寻找 ...
- Qt 中获取摄像头图像数据的方法
Qt 中获取摄像头图像数据的方法 在 Qt 中提供了 QCamera 类用来操作摄像头.(这里的摄像头指的是电脑上常用的那种 USB 摄像头或网络摄像头,暂时还不支持工业相机.)摄像头获取的实时图像可 ...
最新文章
- 设计模式(一)工厂模式Factory(创建型)
- html入门学习(一)
- 如何给SAP云平台的账号分配Leonardo机器学习服务的实例
- html里下拉标记,HTML: select 标签
- c语言二维数组代码,C语言之二维数组(示例代码)
- 微型计算机原理计算两数和,微型计算机原理及汇编语言 第2章-2 补码及加减运算.ppt...
- 阻止xap文件在浏览器中缓存
- 以两种异步模型应用案例,深度解析Future接口
- 用Angular制作单页应用视图切换动画
- NUC1372 Bull Math【大数】
- Java中对象的串行化(Serialization)和transient关键字
- error: ac_nonexistent.h: No such file or directory
- fatal: ‘http://git.#####.com/test-auto/stability.git/‘ 鉴权失败
- easyui使用datagrid时deleteRow删除后行号问题
- 手机号码是如何构成的?
- MySQL数据表中的数据单表查询
- 计算机毕业设计java+ssm酒店管理系统(源码+系统+mysql数据库+Lw文档)
- 想在Android应用程序中将XLS文件转换为PDF吗?看完这篇教程就懂了
- c语言标识符的开头字母能不能大写,C语言-标识符
- 基于opencv的SFR算法
热门文章
- iphone ios 如何开发升级适配 iphone5 4inch
- 【Shall脚本】定时在线备份上传
- 日语单词检索 WebService 试运行 和简单说明
- 如何将SP1集成到Office 2007安装包
- LSMW批处理使用方法(04)_步骤3上
- SAP SD信用控制管理
- SAP 登陆界面菜单文本修改 (Modification of SAP Logon Menu text)
- 用数据可视化解读:为何2亿国人爱钓鱼
- jni直接转byte_JNI再探之JNI 数据类型及Java与C++之间互调
- java 日期 减法_JAVA日期加减运算