五种Mat元素的访问方法.doc

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

五种Mat元素的访问方法 方法1、使用Mat的成员函数at() ??? Mat的成员函数at()是一个模板函数,我们这里用的是二维矩阵,所以我们使用的at()函数的声明如代码段3所示(取自OpenCV的源文件)。 [cpp]?view plaincopy templatetypename?_Tp?_Tp?at(int?i0,?int?i1);?? 代码段3?.at()函数的声明 ????代码段4是本文第二部分描述的算法的实现,矩阵元素使用at()函数来索引。 [cpp]?view plaincopy Vec3b?pix;?? for?(int?r?=?0;?r??im.rows;?r++)?? {?? ??for?(int?c?=?0;?c??im.cols;?c++)?? ??{????? ????pix?=?im.atVec3b(r,c);?? ????pix?=?pix*scale;?? ????om.atVec3b(r,c)?=?pix;?? ??}????? }?? 代码段4. 使用at()函数访问矩阵元素 ????注意:使用at函数时,应该知道矩阵元素的类型和通道数,根据矩阵元素类型和通道数来确定at函数传递的类型,代码段4中使用的是Vec3b这个元素类型,他是一个包含3个unsigned char类型向量。之所以采用这个类型来接受at的返回值,是因为,我们的矩阵im是3通道,类型为unsigned char类型的。 方法2、使用Mat的成员函数ptr() ??? 此函数也是模板函数,我们将会用到的ptr函数声明如代码段5所示。此函数返回指定的数据行的首地址。 [cpp]?view plaincopy templatetypename?_Tp?_Tp*?ptr(int?i0=0);?? 代码段 5. ptr成员函数的声明 ??? 使用ptr()成员函数完成本文第二部分所述算法的代码如代码段6所示。 [cpp]?view plaincopy Vec3b?*ppix_im(NULL);?? Vec3b?*ppix_om(NULL);?? for?(int?r?=?0;?r??im.rows;?r++)?? {?? ??ppix_im?=?im.ptrVec3b(r);?? ??ppix_om?=?om.ptrVec3b(r);?? ??for?(int?c?=?0;?c??im.cols;?c++)?? ??{?? ?????ppix_om[c]?=?ppix_im[c]*scale;?? ??}?? }?? 代码段 6. 使用ptr访问矩阵元素 方法3、使用迭代器 ??? 这里使用的迭代器是OpenCV自己定义的。使用迭代器完成第二部分所述算法的代码如代码段7所示。 [cpp]?view plaincopy MatIterator_Vec3b?it_im,?itEnd_im;?? MatIterator_Vec3b?it_om;?? it_im????=?im.beginVec3b();?? itEnd_im?=?im.endVec3b();?? it_om????=?om.beginVec3b();?? for?(;?it_im?!=?itEnd_im;?it_im++,?it_om++)?? {?? ??*it_om?=?(*it_im)*scale;?? }?? 代码段 7. 使用迭代器访问矩阵元素 方法4、使用Mat_简化索引 ??? Mat_这个类的元素访问比较容易一点,把原Mat类的对象可以直接赋值给Mat_对象,当然赋值操作并不会开辟新的数据空间,这点大家放心。也就是说使用Mat_时,不会在内存拷贝上花时间。使用这种方法完成第二部分所述算法的代码如代码段8所示。 [cpp]?view plaincopy Mat_Vec3b?im_,?om_;?? im_?=?im;?? om_?=?om;?? for?(int?r?=?0;?r??im.rows;?r++)?? {?? ??for?(int?c?=?0;?c??im.cols;?c++)?? ??{?? ????om_(r,c)?=?im_(r,c)?*?scale;?? ??}?? }?? 代码段 8. 使用Mat_访问矩阵数据元素 方法5、使用OpenCV原有的实现 ??? 我们的算法实际上OpenCV中已经有实现。就是×运算符重载,代码如代码段9所示。 [cpp]?view plaincopy om?=?im*scale;?? 代码段 9. 使用OpenCV的原有实现访问矩阵元素 四、实验测试 1、测试代码 ??? 为了测试方便,将前面的方法统一写到一个c++源文件test.cpp中,其内容如代码段10所示。 [cpp

文档评论(0)

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

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

1亿VIP精品文档

相关文档