原文地址:关于IplImage中widthstep的大小与width,nchannels等的关系的问题作者:皮皮虾-佐罗

width是图像宽度,可为任意值;widthstep是行字节数,应该是4的倍数,不一定等于width,nchannels为图像通道数。
#define WIDTHBYTES(bits) (((bits)+31)/32*4) 看看这个公式你就明白了。

对ROI和widthStep的补充

ROI和widthStep在实际工作中有很重要的作用,在很多情况下,使用它们会提高计算机视觉代码的执行速度。这是因为它们允许对图像的某一小部分进行操作,而不是对整个图像进行运算。在OpenCV中,普遍支持ROI和widthStep,函数的操作被限于感兴趣区域。要设置或取消ROI,就要使用cvSetImageROI()和cvResetImageROI()函数。如果想设置ROI,可以使用函数cvSetImageROI(),并为其传递一个图像指针和矩形。而取消ROI,只需要为函数cvResetImageROI()传递一个图像指针。

  1. void cvSetImageROI( IplImage* image, CvRect rect );
  2. void cvResetImageROI( IplImage* image );

为了解释ROI的用法,我们假设要加载一幅图像并修改一些区域,如例3-12的代码,读取了一幅图像,并设置了想要的ROI的x,y,width和height的值,最后将ROI区域中像素都加上一个整数。本例程中通过内联的cvRect()构造函数设置ROI。通过cvResetImageROI()函数释放ROI是非常重要的,否则,将忠实地只显示ROI区域。

例3-12:用imageROI来增加某范围的像素

  1. // roi_add <image> <x> <y> <width> <height> <add>
  2. #include <cv.h>
  3. #include <highgui.h>
  4. int main(int argc, char** argv)
  5. {
  6. IplImage* src;
  7. if( argc == 7 && ((src=cvLoadImage(argv[1],1)) != 0 ))
  8. {
  9. int x = atoi(argv[2]);
  10. int y = atoi(argv[3]);
  11. int width = atoi(argv[4]);
  12. int height = atoi(argv[5]);
  13. int add = atoi(argv[6]);
  14. cvSetImage ROI(src, cvRect(x,y,width,height));
  15. cvAddS(src, cvScalar(add),src);
  16. cvResetImageROI(src);
  17. cvNamedWindow( "Roi_Add", 1 );
  18. cvShowImage( "Roi_Add", src );
  19. cvWaitKey();
  20. }
  21. return 0;
  22. }

使用例3-12中的代码把ROI集中于一张猫的脸部,并将其蓝色通道增加150后的效果如图3-3所示。【45~46】

(点击查看大图)图3-3:在猫脸上用ROI增加150像素的效果

通过巧妙地使用widthStep,我们可以达到同样的效果。要做到这一点,我们创建另一个图像头,让它的width和height的值等于interest_rect的width和height的值。我们还需要按interest_rect起点设置图像起点(左上角或者左下角)。下一步,我们设置子图像的widthStep与较大的interest_img相同。这样,即可在子图像中逐行地步进到大图像里子区域中下一行开始处的合适位置。最后设置子图像的imageDate指针指向兴趣子区域的开始,如例3-13所示。

例3-13:利用其他widthStep方法把interest_img的所有像素值增加1

  1. // Assuming IplImage *interest_img; and
  2. //   CvRect interest_rect;
  3. //   Use widthStep to get a region of interest
  4. //
  5. // (Alternate method)
  6. //
  7. IplImage *sub_img = cvCreateImageHeader(
  8. cvSize(
  9. interest_rect.width,
  10. interest_rect.height
  11. ),
  12. interest_img->depth,
  13. interest_img->nChannels
  14. );
  15. sub_img->origin = interest_img->origin;
  16. sub_img->widthStep = interest_img->widthStep;
  17. sub_img->imageData = interest_img->imageData +
  18. interest_rect.y * interest_img->widthStep    +
  19. interest_rect.x * interest_img->nChannels;
  20. cvAddS( sub_img, cvScalar(1), sub_img );
  21. cvReleaseImageHeader(&sub_img);

看起来设置和重置ROI更方便一些,为什么还要使用widthStep?原因在于有些时候在处理的过程中,想在操作过程中设置和保持一幅图像的多个子区域处于活动状态,但是ROI只能串行处理并且必须不断地设置和重置。

最后,我们要在此提到一个词-- 掩码或模板,在代码示例中cvAddS()函数允许第四个参数默认值为空:const CvArr* mask=NULL。这是一个8位单通道数组,它允许把操作限制到任意形状的非0像素的掩码区,如果ROI随着掩码或模板变化,进程将会被限制在ROI和掩码的交集区域。掩码或模板只能在指定了其图像的函数中使用。

关于IplImage中widthstep的大小与width,nchanne相关推荐

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

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

  2. android各目录大小,Android 基础篇 — 放不同drawable文件夹中图片的大小

    我们接着上篇文章Android 基础篇 - 不同DPI取哪个本地文件夹中的资源 讲,文末尾提到一个问题,为什么不同drawable文件夹中的图片大小在终端设备会不一样? 1 准备 在drawable- ...

  3. C# 设置Word文档中图片的大小

    在创建Word文档时,我们经常需要向文档中插入图片,但插入图片的大小有时候可能会太大或太小,这时候我们就需要对图片的大小进行调整,使得图片与文章更加协调.美观.这篇文章将介绍如何使用Free Spir ...

  4. echart vue 图表大小_vue中echarts图表大小适应窗口大小且不需要刷新案例

    我就废话不多说了,大家还是直接看代码吧~ 内容如下: // 基于准备好的dom,初始化echarts实例 let myChart = this.$echarts.init(document.getEl ...

  5. 在Markdown中更改图像大小

    本文翻译自:Changing image size in Markdown I just got started with Markdown. 我刚开始使用Markdown. I love it, b ...

  6. html按钮怎么修改大小设置吗,如何在HTML中编辑按钮大小?

    如何在HTML中编辑按钮大小?使用HTML设计按钮之类的东西不是首选的方式.(1999年我开始建网站的时候,我们就是这么做的,但是现在有更好的方法了.) 我假定您不熟悉CSS以及如何将CSS文件导入到 ...

  7. 使用OpenCV测量图像中物体的大小

    本文翻译自pyimagesearch技术博客上的一篇文章,<Measuring size of objects in an image with OpenCV>,原文作者:Adrian R ...

  8. 一键调整Word中所有图片的大小

    这是利用AHK实现一键调整Word中所有图片的大小,方便批量打印图片. ;----------------------------------------- ; 一键调整Word中所有图片的大小 By ...

  9. matlab 中图的大小_MATLAB画图之自定义图片大小

    解决问题:使用MATLAB的plot函数画图时弹出图片的大小和位置修改. MATLAB画图的几个概念: screen: 屏幕: figure: 弹出来的对话框:figure变化,screen不会变化: ...

  10. css中字的大小,字体大小大于CSS中设置的大小

    当我将字体大小设置为特定像素高度时,计算出的字体大小是我在CSS中设置的大小的1.333倍.但是,如果我将字体大小设置为百分比,则使用正确的大小.这种情况发生在我尝试的每个浏览器中,包括Firefox ...

最新文章

  1. 关于素数常用结论--威尔逊定理、欧拉定理、费马小定理、米勒罗宾算法
  2. 使用Ajax的Time实现倒计时功能
  3. SQL Server返回当前实例系统日期和时间的函数
  4. C语言编辑飘扬的红旗代码,C语言 飘动的红旗(要有旗杆)
  5. ANDROID开发中注意不同手机CPU架构对SO文件的不同需求。
  6. Zabbix安装记录
  7. 精小的无线接收模块22MM直径硬币大小QI协议
  8. python爬虫之ip代理参数/动态加载数据抓取
  9. Excel做题记录——整数规划优化模型
  10. PLC编程入门基础知识
  11. cad图纸比对lisp_cad图纸怎么找出差异?教你怎么对比CAD图纸版本差异
  12. 乐助手电脑版 v3.0.4.33284 官方版
  13. Zookeeper2.基于zk的开发入门
  14. 大邑移动团支部学校联谊活动
  15. JDBC(powernode CD2206)详尽版(内含教学视频、源代码、SQL文件)
  16. 二代测序技术之illumina测序技术原理简介
  17. matlab制作天体运动动画,天体运动 动态演示
  18. SystemVerilog中随机的constrain语法
  19. 优化企业银行账户服务器,农业银行多措并举优化企业账户服务
  20. 7-14 十六进制转十进制

热门文章

  1. git代码管理可视化工具 :Sourcetree(mac环境)
  2. matlab深度学习之LSTM预测
  3. 热门加壳工具VMProtect v3.1发布,新增内存保护,性能改进|附下载
  4. linux 更新软件命令 失败,(2015.1.13 更新)联合DSDT和SSDT进行反编译——减少DSDT和SSDT错误的尝试...
  5. IEEE-access 模板LaTeX Error: Something's wrong--perhaps a missing \item.
  6. 文件转Base64格式
  7. 互联网+商业计划书(模版)
  8. 用matlab做bp神经网络预测,matlab神经网络怎么预测
  9. 姜小凡:物理世界的数据越来越有价值
  10. dos格式化linux,linux mformat命令对MS-DOS文件系统的磁盘进行格式化