IplImage的像素的访问.doc

  1. 1、本文档共6页,可阅读全部内容。
  2. 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
IplImage的像素的访问

IplImage的像素的访问 当处理图象数据时,通常需要快速高效。使用如cvSet*D或和它等效的函数会造成调用时的开销。我们应该尽可能使用直接存取图象内部数据的方法。有了IplImage内部结构的知识,我们现在可以理解最好的方法。 尽管通常OpenCV提供很多对图象的操作优化良好的例程,但是经常会有些任务是库里找不到包装好的例程的。下面我们考虑一个例子,我们想要把三通道HSV图象的饱合度调整为255(8位图象的最大值)而保持色调不变。要完成这个任务最好是我们自己处理图象的每个象素。这和我们前边对矩阵的操作相似,但在IplImage和CvMat之间也有一些主要的不同。例3-11演示了高效的方式。 例3-11,把HSV图象的S、V分量最大化: void saturate_sv( IplImage* img ) { ??? for( int y=0; yimg-height; y++ ) { ??????? uchar* ptr = (uchar*) (img-imageData + y * img-widthStep); ??????? for( int x=0; ximg-width; x++ ) { ??????????? ptr[3*x+1] = 255; ??????????? ptr[3*x+2] = 255; ??????? } ??? } } 我们只是简单的直接计算相关行y最左边的象素的指针ptr(We simply compute the pointer ptr directly as the head of the relevant row y)。从那里为参考,我们引用第x列的饱合度数值。因为图象是三通道的,第c通道的地址为3*x+c。 在OpenCV中,一副HSV图象和RGB图象,除了对通道的翻译有所不同,其它是没有区别的。因此由一副HSV图象构建一副RGB图象实际所有的操作完全只在“数据”区域。在图象头中,没有任何成员用来表明数据通道的意义。 IplImage和CvMat相比一个重要的不同是imageData的行为。CvMat的数据元素是一个联合体,所以必须说明你想要的指针类型;imageData是一个byte型(uchar*)。我们已经知道被指向的数据不一定是uchar类型,这意味着当对指针作算术运算时,你可以简单的加上widthSetp(同样是以字节数为度量的)而不用担心实际的数据类型,直需在做完加法后,把你计算所得的指针转换成你想要的数据类型。总结:当对矩阵操作时,你必须对偏移量进行缩减,因为数据指针可能不是byte型;而当对图象操作时,你可以使用“看上去”那么多的偏移量,因为数据指针永远是byte型,因此在你准备使用它时,只需把整部分做类型转换。? 访问图象数据的补充资料 资料来源:OpenCV中文网站 (1) 假设你要访问第k通道、第i行、第j列的像素。 (2) 间接访问: (通用,但效率低,可访问任意格式的图像) 对于单通道字节型图像: IplImage* img=cvCreateImage(cvSize(640,480),IPL_DEPTH_8U,1); CvScalar s; s=cvGet2D(img,i,j);// get the (i,j) pixel value printf(intensity=%f\n,s.val[0]); s.val[0]=111; cvSet2D(img,i,j,s);// set the (i,j) pixel value? 对于多通道字节型/浮点型图像: IplImage* img=cvCreateImage(cvSize(640,480),IPL_DEPTH_32F,3); CvScalar s; s=cvGet2D(img,i,j);// get the (i,j) pixel value printf(B=%f, G=%f, R=%f\n,s.val[0],s.val[1],s.val[2]); s.val[0]=111; s.val[1]=111; s.val[2]=111; cvSet2D(img,i,j,s);// set the (i,j) pixel value? (3) 直接访问: (效率高,但容易出错) 对于单通道字节型图像: IplImage* img=cvCreateImage(cvSize(640,480),IPL_DEPTH_8U,1); ((uchar *)(img-imageData + i*img-widthStep))[j]=111;? 对于多通道字节型图像: IplImage* img=cvCreateImage(cvSize(640,480),IPL_DEPTH_8U,3); ((uchar *)(img-im

您可能关注的文档

文档评论(0)

xcs88858 + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

版权声明书
用户编号:8130065136000003

1亿VIP精品文档

相关文档