关于IplImage中widthstep的大小与width,nchannels等的关系的问题_widthstep

关于IplImage中widthstep的大小与width,nchannels等的关系的问题_widthstephttp://www.niubb.net/a/2015/12-02/1104644.html话题:widthstepwidth是图像宽度,可为任意值;widthstep是行字节数,应该是4的倍数,不一定等于width,nchannels为图像通道数。#defineWIDTHBYTES(bits)(((bits)+31)/32*4)看看这个公式你就明白了。对RO

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

http://www.niubb.net/a/2015/12-02/1104644.html

话题:widthstep

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

对ROI和widthStep的补充

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

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

为了解释ROI的用法,我们假设要加载一幅图像并修改一些区域,如例3-12的代码,读取了一幅图像,并设置了想要的ROI的x,y,width和height的值,最后将ROI区域中像素都加上1个整数。本例程中通过内联的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】

关于IplImage中widthstep的大小与width,nchannels等的关系的问题
(点击查看大图)图3-3:在猫脸上用ROI增加150像素的效果

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

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

  1. // AssumingIplImage *interest_img; and
  2. // CvRectinterest_rect;
  3. // Use widthStepto get a region of interest
  4. //
  5. // (Alternatemethod)
  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只能串行处理并且必须不断地设置和重置。

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

分享:黑翼天使 > 关于IplImage中widthstep的大小与width,nchannels等的关系的问题

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

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/145974.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • 简单理解冯诺依曼计算机模型[通俗易懂]

    引入计算机是如何工作的,冯诺依曼体系结构是最好的体现,如图1。冯诺依曼结构是由数学家冯·诺依曼提出,主要由运算器、控制器、存储器、输入设备、输出设备5部分组成。要点1.数据和指令一视同仁,都采用二进制存储。2.按照程序顺序执行,也就是按照顺序从内存中一条一条读取指令。组成1.运算器:顾名思义,主要进行计算,算术运算、逻辑运算等都由它来完成。2.存储器:这里存储器只是内存,不包括内存,用于存储数据、指令信息。3.控制器:控制器是是所有设备的调度中心,系统的正常运行都是有它来调配。4.输入设

  • 设计模式奠基石——UML关系转化为代码

    设计模式奠基石——UML关系转化为代码

    2021年11月16日
  • C++实现矩阵类(附代码和功能)

    C++实现矩阵类(附代码和功能)本文由两部分组成,第一部分介绍一个在win10系统上运行的exe程序,第二部分介绍通过C++实现矩阵运算的方法(功能会更强大,但不如exe文件操作方便)。用户界面如下,能够实现矩阵的加、减、乘、除运算,以及矩阵的转置,求逆,求行列式的值等。读者可以在下载该程序,直接在自己的电脑上运行。下载地址:https://download.csdn.net/do…

  • chmod 命令用法

    chmod 命令用法指令名称:chmod使用权限:所有使用者使用方式:chmod[-cfvR][–help][–version]modefile…说明:Linux/Unix的档案调用权限分为三级:档案拥有者、群组、其他。利用chmod可以藉以控制档案如何被他人所调用。参数:mode:权限设定字串,格式如下:[ugoa…][[±=][rwxX]…][,…],其中u表示该档案的拥有者,g表示与该档案的拥有者属于同一个群体(group)者,o表示其他以外的人,a表示这

  • SSDP协议基础_最核心的协议

    SSDP协议基础_最核心的协议http://net.zdnet.com.cn/network_security_zone/2010/0715/1814422.shtmlSSDP协议,不知道大家是否听说过呢?这个协议的使用多出现在端口当中。下面我们就来了解一下这个协议的具体内容吧。什么是SSDP协议呢?SS

    2022年10月11日
  • Android 电话自己主动接听和挂断具体解释「建议收藏」

    Android 电话自己主动接听和挂断具体解释

发表回复

您的电子邮箱地址不会被公开。

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