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, 与手动计算结果相同。

OpenCV基础——IplImage中的widthStep相关推荐

  1. OpenCV里IplImage的widthStep参数 和width参数

    一直以为IplImage结构体中的widthStep元素大小等于width*nChannels,大错特错!(为了快速访问,要内存对齐啊)查看OpenCV2.1的源码,在src/cxcore/cxarr ...

  2. imutils基础(7)使用 OpenCV 查找轮廓中的极值点

    今天,我将使用 OpenCV 和 Python 根据轮廓查找极值点. 在本博客的其余部分,我将演示如何根据轮廓找到极北.极南.极东和极西 (x, y) 坐标,如本博文顶部的图像所示. 虽然这项技能本身 ...

  3. OpenCV基础(基于Opencv4.4+VS2019)

    OpenCV基础(基于Opencv4.4+VS2019) 1.OpenCV介绍 OpenCV是计算机视觉开源库,主要算法涉及图像处理和机器学习相关方法. 是Intel公司贡献出来的,俄罗斯工程师贡献大 ...

  4. 用openCV去除文字中乱入的线条

    用openCV去除文字中乱入的线条 原文:http://blog.csdn.net/sinat_28309919/article/details/73604109 目录(?)[+] 今天上午,朋友发来 ...

  5. Python 计算机视觉(二) —— OpenCV 基础

    目录 1. 安装配置 2. OpenCV 基础语法 (1)读取图像并显示 (2)调整显示窗口大小 (3)调整图像尺寸大小 (4)图像灰度处理 3. 几何图形绘制 (1)绘制线段 (2)绘制矩形 (3) ...

  6. OpenCV基础篇之读取显示图片

    程序及分析 /* * FileName : read.cpp * Author : xiahouzuoxin @163.com * Version : v1.0 * Date : Tue 13 May ...

  7. linux opencv cmake,OpenCV基础篇之使用CMake管理工程

    OpenCV基础篇之使用CMake管理工程 程序及分析 /* * FileName : read.cpp * Author  : xiahouzuoxin @163.com * Version  : ...

  8. 利用Opencv在PictureControl中显示照片

    利用Opencv在PictureControl中显示IplImage格式的照片. bool MyDlg::IfExistFile(CString strFilePath) {CFile file;if ...

  9. c++ opencv实现区域填充_Python+OpenCV基础教程2:平滑图像

    学习模糊/平滑图像,消除噪点.图片等可到源码处下载. 01 目标 02 教程 滤波与模糊 推荐大家先阅读:番外篇:卷积基础(图片边框),有助于理解卷积和滤波的概念. 关于滤波和模糊,很多人分不清,我来 ...

  10. opencv基础:罗德里格斯旋转公式(Rodrigues' rotation formula)推导 rodrigues()函数原理

    参考:1-https://openhome.cc/Gossip/WebGL/Rodrigues.html(比较好的理解流程) 2-https://www.cnblogs.com/wtyuan/p/12 ...

最新文章

  1. 为什么有些公司不愿意微服务化,因为“太南了”
  2. deepin关机卡桌面_喜大普奔:发现一个惊艳的电脑操作系统Deepin
  3. android GLSurfaceView渲染模式
  4. 《聚爆Implosion》性能精析:这是我们测过性能最棒的手游
  5. 不要被约束的意思_不要再奢望你会变得自律了丨“他律”比“自律”更重要
  6. python线程任务run_Python线程类| 带有示例的run()方法
  7. mysql中文注入_SQL注入之Mysql报错注入
  8. WordPress 默认主题自定义页面模板
  9. GitLab 简易指引(三):备份与恢复
  10. pytorch读取单通道图片
  11. 【Kafka】kafka zk下注册的信息 get /brokers/ids/1 “host“:null “port“:-1
  12. Traditional industries like notebook computers seem
  13. 1月13 ROS中的TF与URDF——机器人(1.1位姿几何基础——刚体位置和姿态描述)
  14. 扎克伯格让员工学会高效工作的26张PPT
  15. 【书籍阅读】-人在回路机器学习 Human-in-the-Loop Machine Learning(一)
  16. JSON对象与JSON模式
  17. python tokenize()_tokenize- 用于Python源代码的Python – Python语言服务(Python教程)(参考资料)...
  18. Java bean 复制克隆工具
  19. 初识CornerNet
  20. 数据结构与算法(1)--二叉树

热门文章

  1. Visio 2019/2016中文版零基础入门视频教程
  2. exe4j生成的exe反编译
  3. CentOS8安装MySQL可视化客户端
  4. 计算机研究生复试常见面试题——计算机网络部分
  5. xshell5安装包(百度云),官方免费版,不会强制更新,没有标签限制(2019-4-4)
  6. FSCapture录屏软件
  7. (没用,只是学习贴,可能永不会更新)Js 写《智慧树》自动评论脚本
  8. 注册测绘师复习方法,注册测绘师考试心得
  9. 哨兵系列卫星_美国宇航局 quot;哨兵6quot;海平面与气候观测卫星发射任务将于11月进行...
  10. Log4cpp 配置文件格式说明