OpenCV基础——IplImage中的widthStep

OpenCV基础——IplImage中的widthStepIplImage有两个属性容易导致错误:width和widthStep前者是表示图像的每行像素数,后者指表示存储一行像素需要的字节数。在OpenCV里边,widthStep必须是4的倍数,从而实现字节对齐,有利于提高运算速度。如果8U单通道图像宽度为3,那么widthStep是4,加一个字节补齐。这个图像的一行需要4个字节,只使用前3个,最后一个空着。也就是一个宽3高3的图像的…

大家好,又见面了,我是你们的朋友全栈君。

IplImage有两个属性容易导致错误:width和widthStep

前者是表示图像的每行像素数,后者指表示存储一行像素需要的字节数。

 在OpenCV里边,widthStep必须是4的倍数,从而实现字节对齐,有利于提高运算速度。

 如果8U单通道图像宽度为3,那么widthStep是4,加一个字节补齐。这个图像的一行需要4个字节,只使用前3个,最后一个空着。

也就是一个宽3高3的图像的imageData数据大小为4*3=12字节。

 

查看OpenCV2.1的源码

在src/cxcore/cxarray.cpp文件中,找到cvInitImageHeader函数,函数中对widthStep大小赋值如下:

image->widthStep =

(((image->width * image->nChannels *(image->depth & ~IPL_DEPTH_SIGN) + 7)/8)+ align – 1) & (~(align – 1));                                             

其中IPL_DEPTH_SIGN的定义可以在cxtypes.h中找到,定义为:#define IPL_DEPTH_SIGN 0x80000000, align的大小为CV_DEFAULT_IMAGE_ROW_ALIGN,其大小在cxmisc.h中定义为:#define  CV_DEFAULT_IMAGE_ROW_ALIGN 4,depth取8位深度。

根据上式,已知IPL_DEPTH_SIGN、align、depth 的大小,分别手动计算如下图像的widthStep:

图像宽度     图像通道数              计算得到的widthStep

3                    3                             12

3                    1                             4

5                    3                            16

5                    1                             8

7                    3                             24

7                    1                             8

4                    3                             12

4                    1                             4

为了进一步验证手算的正确性,我们编程实现输出widthStep的大小,程序如下

例:IplImage* cvCreateImage(CvSize cvSize(int width, int height), int depth, int channels):

 IplImage *image_33 = cvCreateImage(cvSize(3, 3), 8, 3);
 IplImage *image_31 = cvCreateImage(cvSize(3, 3), 8, 1);
 IplImage *image_53 = cvCreateImage(cvSize(5, 3), 8, 3);
 IplImage *image_51= cvCreateImage(cvSize(5, 3), 8, 1);
 IplImage *image_73 = cvCreateImage(cvSize(7, 3), 8, 3);
 IplImage *image_71 = cvCreateImage(cvSize(7, 3), 8, 1);

 printf(“%d, %d, %d, %d, %d, %d”, image_33->widthStep,image_31->widthStep,
     image_53->widthStep,image_51->widthStep,image_73->widthStep,image_71->widthStep);

运行结果为:12, 4, 16, 8, 24, 8, 与手动计算结果相同。

 

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/131706.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 新游戏世界合集全文_经典种田文完结推荐

    新游戏世界合集全文_经典种田文完结推荐送给所有爱玩游戏的老鸟们 老游戏中有大量经典作品,其中中文的HGAME更是经典中的经典! ◆告别的年代失色的回忆?——新系统下经典老游戏重玩全攻略◆  “新”与“老”当然是相对的,不过在开篇之前有必要确定我们的讨论范畴,这里的“老”是指为Win98之前的操作系统,包括DOS和Win32/95,而新系统则是指Win98/2000/XP。毫无疑问,有很多老游戏都很值得我们来重温,但重

    2022年9月21日
    3
  • linux命令行安装gcc_linux用yum安装gcc

    linux命令行安装gcc_linux用yum安装gcc目前,GCC可以用来编译C/C++、FORTRAN、JAVA、OBJC、ADA等语言的程序,可根据需要选择安装支持的语言。下面由学习啦小编为大家整理了linux下安装gcc命令的方法,希望大家喜欢!linux下安装gcc命令1下载在GCC网站上或者通过网上搜索可以查找到下载资源。目前GCC的最新版本为4.2.1。可供下载的文件一般有两种形式:gcc-4.1.2.tar.gz和gcc-4.1.2…

    2022年10月13日
    5
  • 数据收集渠道_数据挖掘数据集

    数据收集渠道_数据挖掘数据集HuggingFace–TheAIcommunitybuildingthefuture.MachineLearningDatasets|PapersWithCode

    2022年10月16日
    3
  • SM4算法设计原理

    SM4算法设计原理SM4分组密码算法描述:SM4分组密码算法是一个迭代分组密码算法,由加解密算法和密钥扩展算法组成。SM4分组密码算法采用非平衡Feistel结构,分组长度为128b密钥长度为128b。加密算法与密钥扩展算法均采用非线性迭代结构。加密运算和解密运算的算法结构相同,解密运算的轮密钥的使用顺序与加密运算相反。密钥及密钥参量:SM4分组密码算法的加密密钥长度为128b,表示为MK=(MK0,M…

    2025年6月10日
    3
  • 与运算或运算非运算异或运算是什么_俄称击退乌军进攻

    与运算或运算非运算异或运算是什么_俄称击退乌军进攻按位与运算符(&)参加运算的两个数据,按二进制位进行“与”运算。运算规则:0&0=0;  0&1=0;   1&0=0;    1&1=1;      即:两位同时为“1”,结果才为“1”,否则为0例如:3&5 即00000011&00000101=00000001  因此,3&5的值得1。 另,负数按补码形式参加按位与运算。“与运算”的特殊用途:(1

    2025年6月8日
    4
  • 无线充qi协议c语言详解,QI无线充通信协议数据包格式解析

    无线充qi协议c语言详解,QI无线充通信协议数据包格式解析QI通信数据格式编码:协议规定时钟信号的频率应该是Fclk=2(4%)KHZ,所以每一位的传输时间约500us,如图所示数据0:500us的高电平,或者500us的低电平数据1:250us高电平+250us低电平,或者250us低电平+250us高电平电源接收端(移动设备端)采用11位异步串行格式传输数据字节数据编码格式为:起始位0、8位数据位、一个奇偶校验位(如果数据字节包含…

    2022年6月18日
    46

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号