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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 80×86汇编语言_站长窝

    80×86汇编语言_站长窝[序言]旧版的”80×86汇编小站站长简单介绍”已经过时了,因此于2013年10月01日花费1个小时又一次更新和排版一次.[人生格言]1]一生都用头脑而不是情绪解决这个问题2]仅仅有偏执狂才会成功3]在最困难时都要保持一份幽默感4]吾生也有涯,而知也无涯,以有涯随无涯,殆已[简历]经常使用网名:猪头三出生日期:1981.XX.X…

    2022年10月13日
  • Ubuntu 12.04下解决Tomcat自启动问题

    当我们安装好Tomcat使用后发现,每次启动都需要在终端中手动键入sudo/var/tomcat/bin/startup.sh,那么我们怎么解决这个问题呢http://hovertree.com/

    2021年12月24日
  • steamvr插件怎么用_微信word插件加载失败

    steamvr插件怎么用_微信word插件加载失败本文基于SteamVR插件的开发文档翻译并总结SteamVR开发过程中的基本用法。本文总结汇总了SteamVR插件文档的内容,对文档部分内容进行了删减。目前仅仅只是翻译汇总,部分内容可能存在纰漏,后续会结合开发过程逐步更新修改此文章的内容。

    2022年9月4日
  • 串口服务器调试助手使用教程,comassistant串口调试助手使用说明.pdf

    串口服务器调试助手使用教程,comassistant串口调试助手使用说明.pdf作者:温子祺wenziqi@wenziqi@单片机多功能调试助手简介单片机多功能调试助手简介单单片片机机多多功功能能调调试试助助手手简简介介1111简介图1单片机多功能调试助手单片机多功能调试助手一款集串口/USB/网络调试、进制转换、字模与数码管字型码制作、常用校验值计算、UNICODE码转换、位图输出C文件等众多功能于一身的综合型调试软件,最值得庆幸的是该软件会一直保持更新,并支持在…

    2022年6月12日
  • SQL Server中的sp_executesql系统存储过程

    SQL Server中的sp_executesql系统存储过程sp_executesql语法 sp_executesql[@stmt=]stmt[    {,[@params=]N@parameter_name  data_type[,…n]}    {,[@param1=]value1[,…n]}] 参数[@stmt=]stmt 包含 Transact-SQL 语

    2022年5月21日
  • 新建表sql语句

    新建表sql语句一、新建表新建学生表(student):createtablestudent(idintnotnull,namevarchar2(50),sexvarchar2(25),birthdayvarchar2(225),createtimetimestamp,primarykey(id));给表和字段添加注释:commentonta

    2022年10月16日

发表回复

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

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