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()传递一个图像指针。

void cvSetImageROI( IplImage* p_w_picpath, CvRect rect );

void cvResetImageROI( IplImage* p_w_picpath );

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

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

// roi_add

#include

#include

intmain(intargc,char** argv)

{

IplImage* src;

if( argc == 7 && ((cvLoadImage(argv[1],1)) != 0 )) < /span>

{

intx = atoi(argv[2]);

inty = atoi(argv[3]);

intwidth = atoi(argv[4]);

intheight = atoi(argv[5]);

intadd = atoi(argv[6]);

cvSetImage ROI(src, cvRect(x,y,width,height));

cvAddS(src, cvScalar(add),src);

cvResetImageROI(src);

cvNamedWindow( "Roi_Add", 1 );

cvShowImage( "Roi_Add", src );

cvWaitKey();

}

return0;

}

使用例3-12中的代码把ROI集中于一张猫的脸部,并将其蓝色通道增加150后的效果.

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

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

// Assuming IplImage *interest_img; and

//   CvRect interest_rect;

//   Use widthStep to get a region of interest

//

// (Alternate method)

//

IplImage *sub_img = cvCreateImageHeader(

cvSize(

interest_rect.width,

interest_rect.height

),

interest_img->depth,

interest_img->nChannels

);

sub_img->origin = interest_img->origin;

sub_img->widthStep = interest_img->widthStep;

sub_img->p_w_picpathData = interest_img->p_w_picpathData +

interest_rect.y * interest_img->widthStep    +

interest_rect.x * interest_img->nChannels;

cvAddS( sub_img, cvScalar(1), sub_img );

cvReleaseImageHeader(&sub_img);

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

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

java+widthstep_关于IplImage中widthstep的大小与width,nchannels等的关系的问题相关推荐

  1. opencv 中x,y,height, width,rows,cols 的关系

    opencv中图像的x,y 坐标以及 height, width,rows,cols 他们的关系经常混淆. rows 其实就是行,一行一行也就是y 啦.height高度也就是y啦. cols  也就是 ...

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

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

  3. 图片大小/像素/分辨率之间有什么关系

    正文 字体大小:大 中 小 图片大小/像素/分辨率之间有什么关系 (2013-07-01 19:30:55) 转载▼ var tag=′像素,分辨率,英寸′;vartag='像素,分辨率,英寸';va ...

  4. java 文件追加 变大_用java写在doc中追加内容代码时,为什么它只能写入一次内容,后面都只是增加文件的大小,不增加内容啊?...

    用java写在doc中追加内容代码时,为什么它只能写入一次内容,后面都只是增加文件的大小,不增加内容啊? 答案:1  信息版本:手机版 电脑版 解决时间 2020-07-02 16:34 已解决 20 ...

  5. JAVA中的时间大小比较

    原文地址为: JAVA中的时间大小比较 1.时间的比较 import java.text.DateFormat; import java.text.ParseException; import jav ...

  6. java string与integer_Java中Integer和String浅谈

    http://qxzxcjq-126-com.iteye.com/blog/883283 Java中的基本数据类型有八种:int.char.boolean.byte.long.double.float ...

  7. java静态方法 问题_Java中堆、栈,静态方法和非静态方法的速度问题

    一.堆和栈的速度性能分析 堆和栈是JVM内存模型中的2个重要组成部分,自己很早以前也总结过堆和栈的区别,基本都是从存储内容,存储空间大小,存储速度这几个方面来理解的,但是关于堆和栈的存储速度,只知道堆 ...

  8. java string类api_JAVA中String类的常用方法API

    @[toc] 前言 String 类是我们日常经常使用的Java类,以下是对该类的信息汇总,类的关系图如下 String类关系图 创建: String s="hello!";//使 ...

  9. Java中内存中的Heap、Stack与程序运行的关系

    堆和栈的内存管理 栈的内存管理是顺序分配的,而且定长,不存在内存回收问题:而堆 则是随机分配内存,不定长度,存在内存分配和回收的问题: 堆内存和栈内存的区别可以用如下的比喻来看出:使用堆内存就象是自己 ...

  10. java 多线程性能_Java中多线程的性能比较

    java 多线程性能 Java中有多种用于多线程的技术. 可以通过同步关键字,锁或原子变量来并行化Java中的一段代码. 这篇文章将比较使用synced关键字ReentrantLock,getAndI ...

最新文章

  1. ElementUI项目中怎样引用Jquery
  2. 简单易懂的 pwnable.kr 第三题[bof]Writeupt
  3. 蓝桥杯2016省赛真题-剪邮票(dfs)
  4. cmail服务器安装后无法登录的解决办法
  5. Python 炫技操作:条件语句的七种写法,你都知道吗?
  6. ASP.NET保存信息总结(Application、Session、Cookie、ViewState和Cache等)
  7. Supervisor-类unix系统下的进程控制工具
  8. mediarecorder直播html5,html5 pc端录制视频+MediaStreamRecorder
  9. GaiGai----1
  10. 分布式监控报警平台Centreon之:Centreon简介
  11. java编程过程——流程图
  12. 海康威视工业相机使用
  13. learning and enjoying
  14. 微信如何保存文件?企业微信如何下载文件?
  15. 微信小程序——引入第三方图标、图标组件
  16. vue input数字输入校验
  17. C/C++关于string.h头文件和string类
  18. JS将秒数换算成时分秒 以及转化为年月日 时分秒
  19. 使用Java将阿拉伯数字转换为中文数字(适配小数转换)
  20. 罗赖马山(Mount Roraima)+天使瀑布(Angel Fall)

热门文章

  1. PDMS Pipeline Tool 教程(七):错误代码
  2. 电脑突然调节不了亮度?让我教你来恢复
  3. 《python黑帽子 黑客与渗透测试编程之道》第二章-网络基础 tcp、udp客户端、服务端
  4. 卸载不了mysql2008_你还在为无法完美卸载SQL Server 2008 R2而烦恼吗?
  5. 爬取美女图片(python源码)
  6. 酷Q on Docker 2.0
  7. 酷q点歌机器人软件_【酷q机器人下载】酷q机器人官方下载 V5.14.8A 最新版-七喜软件园...
  8. STM32固件库详解
  9. camshift算法的应用
  10. (连载)用python在excel中对财务报表项目进行提取和计算