版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
OpenCV:Mat元素访问方法、性能、代码复杂度以及安全性分析欢迎转载,尊重原创,所以转载请注明出处:/bendanban/article/details/30527785本文讲述了OpenCV中几种访问矩阵元素的方法,在指定平台上给出性能比较,分析每种矩阵元素访问方法的代码复杂度,易用性。一、预备设置本文假设你已经正确配置了OpenCV的环境,为方便大家实验,在文中也给出了编译源程序的Makefile,其内容如代码段1所示。采用如代码段2所示的计时函数,这段代码你可以在我之前的博文中找到,abtic()可以返回微秒(10人-6秒)级,而且兼容Windows和Linux系统。本文使用彩色图像做实验,所以矩阵是2维的3通道的。[plain]viewplaincopyCC=g++CPPFLAGS=-O3'pkg-config--cflagsopencv'CPPLIB='pkg-config--libsopencv'4.OBJS=test.o6.main.exe:$(OBJS)$(CC)$(CPPFLAGS)$A-o$@$(CPPLIB)9.test.o:test.cpp$(CC)-c$(CPPFLAGS)$A-o$@12.clean:rm-rf*.outmain.exe*.o15.run:./main.exe代码段l.Makefile文件的内容[cpp]viewplaincopy#ifdefined(_WIN32)&&defined(_MSC_VER)#include<windows.h>doubleabtic(){__int64freq;__int64clock;QueryPerformanceFrequency((LARGE_INTEGER*)&freq);QueryPerformanceCounter((LARGE_INTEGER*)&clock);return(double)clock/freq*1000*1000;}#else#include<time.h>#include<sys/time.h>doubleabtic(){double result=0.0;struct timevaltv;gettimeofday(&tv,NULL);result =tv.tv_sec*1000*1000+tv.tv_usec;return result;}#endif/*_WIN32*/代码段2.计时函数abtic()的定义二测试算法文中用于测试的算法:将矩阵中每个元素乘以一个标量,写入一个新的矩阵,每个通道操作独立。如果用im(r,c,k)表示矩阵im的第r行、第c列、第k个通道的值的话,算法为:om(r,c,k)二im(r,c,k)*scale;其中scale是一个大于0、小于1的浮点数。三五种Mat元素的访问方法
方法1、使用Mat的成员函数at<>()Mat的成员函数at()是一个模板函数,我们这里用的是二维矩阵,所以我们使用的at()函数的声明如代码段3所示(取自OpenCV的源文件)。[cpp]viewplaincopy《1.template<typename_Tp>_Tp&at(inti0,inti1);代码段3.at()函数的声明代码段4是本文第二部分描述的算法的实现,矩阵元素使用at<>()函数来索引。[cpp]viewplaincopy《..8.9.10.for(intr=0;r<im.rows;r++){for(intc=0;c<im.cols;c++){pix=im.at<Vec3b>(r,c);pix=pix*scale;om.at<Vec3b>(r,c)=pix;}代码段4.使用at<>()函数访问矩阵元素注意:使用at函数时,应该知道矩阵元素的类型和通道数,根据矩阵元素类型和通道数来确定at函数传递的类型,代码段4中使用的是Vec3b这个元素类型,他是一个包含3个unsignedchar类型向量。之所以采用这个类型来接受at的返回值,是因为,我们的矩阵im是3通道,类型为unsignedchar类型的。方法2、使用Mat的成员函数ptr<>()此函数也是模板函数,我们将会用到的ptr函数声明如代码段5所示。此函数返回指定的数据行的首地址。[cpp]viewplaincopy=1.template<typename_Tp>_Tp*ptr(inti0=0);代码段5.ptr成员函数的声明使用ptr<>()成员函数完成本文第二部分所述算法的代码如代码段6所示。[cpp]viewplaincopy《Vec3b*ppix_im(NULL);Vec3b*ppix_om(NULL);for(intr=0;r<im.rows;r++)TOC\o"1-5"\h\z{ppix_im = im.ptr<Vec3b>(r);ppix_om = om.ptr<Vec3b>(r);for(intc=0;c<im.cols;c++){ppix_om[c]=ppix_im[c]*scale;}}代码段6.使用ptr访问矩阵元素方法3、使用迭代器这里使用的迭代器是OpenCV自己定义的。使用迭代器完成第二部分所述算法的代码如代码段7所示。[cpp]viewplaincopy《MatIterator_<Vec3b>it_im,itEnd_im;MatIterator_<Vec3b>it_om;it_im = im.begin<Vec3b>();itEnd_im = im.end<Vec3b>();it_om = om.begin<Vec3b>();for(; it_im!=itEnd_im;it_im++,it_om++){*it_om=(*it_im)*scale;}代码段7.使用迭代器访问矩阵元素方法4、使用Mat_ffi化索引Mat—这个类的元素访问比较容易一点,把原Mat类的对象可以直接赋值给Mat_对象,当然赋值操作并不会开辟新的数据空间,这点大家放心。也就是说使用Mat—时,不会在内存拷贝上花时间。使用这种方法完成第二部分所述算法的代码如代码段8所示。[cpp]viewplaincopy《Mat_<Vec3b>im_,om_;im_=im;om_=om;for(intr=0;r<im.rows;r++)TOC\o"1-5"\h\z{for(intc=0;c<im.cols;c++){om_(r,c)=im_(r,c)*scale;}}代码段8.使用Mat—访问矩阵数据元素方法5、使用OpenCV原有的实日我们的算法实际上OpenCV中已经有实现。就是x运算符重载,代码如代码段9所示。[cpp]viewplaincopyom=im*scale;代码段9.使用OpenCV的原有实现访问矩阵元素四、实验测试
为了测试方便,将前面的方法统一写到一个C++源文件test.cpp中,其内容如代码段10所示。[cpp]viewplaincopy1.1.> FileName:test.cpp> Author:aban> Mail:sawpara@126.com> CreatedTime:2014年06月13日星期五18时47分19秒.#include<iostream>#include<opencv2/opencv.hpp>usingnamespacecv;usingnamespacestd;13.#ifdefined(_WIN32)&&defined(_MSC_VER)#include<windows.h>doubleabtic(){__int64freq;__int64clock;QueryPerformanceFrequency((LARGE_INTEGER*)&freq);QueryPerformanceCounter( (LARGE_INTEGER*)&clock);return(double)clock/freq*1000*1000;}#else#include<time.h>#include<sys/time.h>doubleabtic(){double result=0.0;struct timevaltv;gettimeofday(&tv,NULL );result =tv.tv_sec*1000*1000+tv.tv_usec;return result;}#endif/*_WIN32*/34.#defineISSHOW036.intmain(intargc,char**argv){doubletRecorder(0.0);
Matim=imread("./bigim.tif");Matom;om.create(im.rows,im.cols,CV_8UC3);43.#ifISSHOWimshow("orignalImage",im);waitKey();#endif48.floatscale =150.0f/255.0f;50.//1.using at()tRecorder= abtic();Vec3bpix;for(intr=0;r<im.rows;r++)TOC\o"1-5"\h\z{for (int c=0;c<im.cols;c++){pix=im.at<Vec3b>(r,c);pix=pix*scale;om.at<Vec3b>(r,c)=pix;}}cout<<(abtic()-tRecorder)<<"usingat<>()"<<endl;#ifISSHOWimshow("ScaledImage:usingat<>()",om);waitKey();#endif68.//2. usingptrtRecorder=abtic();Vec3b *ppix_im(NULL);Vec3b *ppix_om(NULL);for(intr=0;r<im.rows;r++)TOC\o"1-5"\h\z{ppix_im=im.ptr<Vec3b>(r);ppix_om=om.ptr<Vec3b>(r);for (int c=0;c<im.cols;c++){ppix_om[c]=ppix_im[c]*scale;}}cout<<(abtic()-tRecorder)<<"usingptr<>()"<<endl;#ifISSHOW
84.imshow("ScaledImage:usingptr<>()",om);85.waitKey();#endif87.88.//3.usingiterator89.tRecorder=abtic();90.MatIterator_<Vec3b>it_im,itEnd_im;91.MatIterator_<Vec3b>it_om;92.it_im=im.begin<Vec3b>();93.itEnd_im=im.end<Vec3b>();94.it_om=om.begin<Vec3b>();95.for(;it_im!=itEnd_im;it_im++,it_om++)96.{97.*it_om=(*it_im)*scale;98.}99.cout<<(abtic()-tRecorder)<<"usingiterator"<<endl;100.#ifISSHOW101.imshow("ScaledImage:usingiterator",om);102.waitKey();#endif104.105.//4.usingMat_106.tRecorder=abtic();107.Mat_<Vec3b>im_,om_;108.im_=im;109.om_=om;110.for(intr=0;r<im.rows;r++)111.{112.for(intc=0;c<im.cols;c++)113.{114.om_(r,c)=im_(r,c)*scale;115.}116.}117.cout<<(abtic()-tRecorder)<<"usingMat_"<<endl;118.#ifISSHOW119.imshow("ScaledImage:usingMat_",om);120.waitKey();#endif122.123.//5.using*124.tRecorder=abtic();125.om=im*scale;126.cout<<(abtic()-tRecorder)<<"using*"<<endl;127.#ifISSHOW
imshow("ScaledImage:using*",om);waitKey();#endif131.return0;}代码段10.测试代码如果你想使用第一部分提到的Makefile,你需要将代码段10保存成test.cpp,或者保存成你希望的某个名字,但是同时应该修改Makfile中的所有"test.cpp”。在正确执行之前,将代码段10中的第40行代码改成你的图片名称。CPU:Intel(R)Pentium(R)CPUG840@2.80GHzG++:4.8.2OpenCV:2.4.93,实验结果编译选项使用-O3时,其中一次执行结果:[plain]viewplaincopy489570usingat<>()467315usingptr<>()468603usingiterator469041usingMat_621367using*编译选项使用-O0-g时,其中一次执行结果:[plain]viewplaincopy2.48216e+06usingat<>()2.15397e+06usingptr<>()3.807
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 基于NLP的情感分析工具课程设计课程设计
- 搜索引擎结果聚合课程设计
- 室内空气质量预警方案课程设计
- 储能机构课程设计
- 门店店长岗位门店管理考试试卷及答案
- 麻醉科医师岗位招聘考试试卷及答案
- 2026年中秋节假期初中中秋节民俗文化科普
- 高温天气健康防护指南课件
- 锰矿治理措施方案范本
- 幼儿夏日星空自然趣味启蒙科普课
- 2026年注册安全工程师考试(初级)版试题及答案
- 2026秋季新学期全体教师会议上校长讲话:今天我只讲一件事-开学头两周是这一学期的定盘期
- 2026年公司中秋、国庆安全应急预案
- 2026年8月昆明市第二人民医院融城老年病医院招聘合同制工作人员及见习人员7人考试参考题库及答案详解
- DB13(J)-T 8634-2025 低碳混凝土应用技术标准
- (2026秋新版)西师大版五年级数学上册全册教案
- 2026秋三年级数学脱式计算500道专项练习(分层训练+完整解析)
- 2026苏教版五年级数学上册第一单元第2课《图形的旋转》课件
- 2026语文新教材 23.马说八年级下册
- 太阳能转化原理与技术课件 第一章太阳能转换原理与技术
- 刚玉莫来石匣钵项目可行性研究报告
评论
0/150
提交评论