您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 质量控制/管理 > 五种Mat元素的访问方法
五种Mat元素的访问方法方法1、使用Mat的成员函数at()Mat的成员函数at()是一个模板函数,我们这里用的是二维矩阵,所以我们使用的at()函数的声明如代码段3所示(取自OpenCV的源文件)。[cpp]viewplaincopy1.templatetypename_Tp_Tp&at(inti0,inti1);代码段3.at()函数的声明代码段4是本文第二部分描述的算法的实现,矩阵元素使用at()函数来索引。[cpp]viewplaincopy1.Vec3bpix;2.for(intr=0;rim.rows;r++)3.{4.for(intc=0;cim.cols;c++)5.{6.pix=im.atVec3b(r,c);7.pix=pix*scale;8.om.atVec3b(r,c)=pix;9.}10.}代码段4.使用at()函数访问矩阵元素注意:使用at函数时,应该知道矩阵元素的类型和通道数,根据矩阵元素类型和通道数来确定at函数传递的类型,代码段4中使用的是Vec3b这个元素类型,他是一个包含3个unsignedchar类型向量。之所以采用这个类型来接受at的返回值,是因为,我们的矩阵im是3通道,类型为unsignedchar类型的。方法2、使用Mat的成员函数ptr()此函数也是模板函数,我们将会用到的ptr函数声明如代码段5所示。此函数返回指定的数据行的首地址。[cpp]viewplaincopy1.templatetypename_Tp_Tp*ptr(inti0=0);代码段5.ptr成员函数的声明使用ptr()成员函数完成本文第二部分所述算法的代码如代码段6所示。[cpp]viewplaincopy1.Vec3b*ppix_im(NULL);2.Vec3b*ppix_om(NULL);3.for(intr=0;rim.rows;r++)4.{5.ppix_im=im.ptrVec3b(r);6.ppix_om=om.ptrVec3b(r);7.for(intc=0;cim.cols;c++)8.{9.ppix_om[c]=ppix_im[c]*scale;10.}11.}代码段6.使用ptr访问矩阵元素方法3、使用迭代器这里使用的迭代器是OpenCV自己定义的。使用迭代器完成第二部分所述算法的代码如代码段7所示。[cpp]viewplaincopy1.MatIterator_Vec3bit_im,itEnd_im;2.MatIterator_Vec3bit_om;3.it_im=im.beginVec3b();4.itEnd_im=im.endVec3b();5.it_om=om.beginVec3b();6.for(;it_im!=itEnd_im;it_im++,it_om++)7.{8.*it_om=(*it_im)*scale;9.}代码段7.使用迭代器访问矩阵元素方法4、使用Mat_简化索引Mat_这个类的元素访问比较容易一点,把原Mat类的对象可以直接赋值给Mat_对象,当然赋值操作并不会开辟新的数据空间,这点大家放心。也就是说使用Mat_时,不会在内存拷贝上花时间。使用这种方法完成第二部分所述算法的代码如代码段8所示。[cpp]viewplaincopy1.Mat_Vec3bim_,om_;2.im_=im;3.om_=om;4.for(intr=0;rim.rows;r++)5.{6.for(intc=0;cim.cols;c++)7.{8.om_(r,c)=im_(r,c)*scale;9.}10.}代码段8.使用Mat_访问矩阵数据元素方法5、使用OpenCV原有的实现我们的算法实际上OpenCV中已经有实现。就是×运算符重载,代码如代码段9所示。[cpp]viewplaincopy1.om=im*scale;代码段9.使用OpenCV的原有实现访问矩阵元素四、实验测试1、测试代码为了测试方便,将前面的方法统一写到一个c++源文件test.cpp中,其内容如代码段10所示。[cpp]viewplaincopy1./*************************************************************************2.FileName:test.cpp3.Author:aban4.Mail:sawpara@126.com5.CreatedTime:2014年06月13日星期五18时47分19秒6.************************************************************************/7.8.9.#includeiostream10.#includeopencv2/opencv.hpp11.usingnamespacecv;12.usingnamespacestd;13.14.#ifdefined(_WIN32)&&defined(_MSC_VER)15.#includewindows.h16.doubleabtic(){17.__int64freq;18.__int64clock;19.QueryPerformanceFrequency((LARGE_INTEGER*)&freq);20.QueryPerformanceCounter((LARGE_INTEGER*)&clock);21.return(double)clock/freq*1000*1000;22.}23.#else24.#includetime.h25.#includesys/time.h26.doubleabtic(){27.doubleresult=0.0;28.structtimevaltv;29.gettimeofday(&tv,NULL);30.result=tv.tv_sec*1000*1000+tv.tv_usec;31.returnresult;32.}33.#endif/*_WIN32*/34.35.#defineISSHOW036.37.intmain(intargc,char**argv)38.{39.doubletRecorder(0.0);40.Matim=imread(./bigim.tif);41.Matom;42.om.create(im.rows,im.cols,CV_8UC3);43.44.#ifISSHOW45.imshow(orignalImage,im);46.waitKey();47.#endif48.49.floatscale=150.0f/255.0f;50.51.//1.usingat()52.tRecorder=abtic();53.Vec3bpix;54.for(intr=0;rim.rows;r++)55.{56.for(intc=0;cim.cols;c++)57.{58.pix=im.atVec3b(r,c);59.pix=pix*scale;60.om.atVec3b(r,c)=pix;61.}62.}63.cout(abtic()-tRecorder)usingat()endl;64.#ifISSHOW65.imshow(ScaledImage:usingat(),om);66.waitKey();67.#endif68.69.//2.usingptr70.tRecorder=abtic();71.Vec3b*ppix_im(NULL);72.Vec3b*ppix_om(NULL);73.for(intr=0;rim.rows;r++)74.{75.ppix_im=im.ptrVec3b(r);76.ppix_om=om.ptrVec3b(r);77.for(intc=0;cim.cols;c++)78.{79.ppix_om[c]=ppix_im[c]*scale;80.}81.}82.cout(abtic()-tRecorder)usingptr()endl;83.#ifISSHOW84.imshow(ScaledImage:usingptr(),om);85.waitKey();86.#endif87.88.//3.usingiterator89.tRecorder=abtic();90.MatIterator_Vec3bit_im,itEnd_im;91.MatIterator_Vec3bit_om;92.it_im=im.beginVec3b();93.itEnd_im=im.endVec3b();94.it_om=om.beginVec3b();95.for(;it_im!=itEnd_im;it_im++,it_om++)96.{97.*it_om=(*it_im)*scale;98.}99.cout(abtic()-tRecorder)usingiteratorendl;100.#ifISSHOW101.imshow(ScaledImage:usingiterator,om);102.waitKey();103.#endif104.105.//4.usingMat_106.tRecorder=abtic();107.Mat_Vec3bim_,om_;108.im_=im;109.om_=om;110.for(intr=0;rim.rows;r++)111.{112.for(intc=0;cim.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();121.#endif122.123.//5.using*124.tRecorder=abtic();125.om=im*scale;126.cout(abtic()-tRecorder)using*endl;127.#ifISSHOW128.imshow(ScaledImage:using*,om);129.waitKey();130.#endif131.132.return0;133.}代码段10.测试代码如果你想使用第一部分提到的Makefile,你需要将代码段10保存成test.cpp,或者保存成你希望的某个名字,但是同时应该修改Makfile中的所有“test.cpp”。在正确执行之前,将代码段10中的第40行代码改成你的图片名称。
本文标题:五种Mat元素的访问方法
链接地址:https://www.777doc.com/doc-2742635 .html