- 1、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
Opencv2.4.6自带文档中文笔记(core)
2 .1 (一)Mat 矩阵中数据指针 Mat.data 是 uchar 类型指针,CV_8U 系列可以通过计算指针位置快速地定 位矩阵中的任意元素。 二维单通道元素可以用 Mat::at(i, j)访问,i 是行序号,j 是列序号。 但对于多通道的非 unsigned char 类型矩阵来说,以上方法都不好 (注:后来知道可以通过类型转换, 用指针访问 data 数据,见后文)。可以用 Mat::ptr()来获得指向某行元素的指针,在通过行数与通道数 计算相应点的指针。 参照 OpenCV 的Mat::at() 函数,写了一个访问二维 Mat 矩阵的两个简单的小函数,没有边界检查。 #include opencv2/core/core.hpp templatetypename ItemType ItemType* getMatPointPtr(cv::Mat src, int i , int j , int c = 0) { ItemType* curRow = src.ptrItemType(i); return curRow + j * src.channels() + c; } templatetypename ItemType ItemType getMatPoint(cv::Mat src, int i , int j , int c = 0) { ItemType* curRow = src.ptrItemType(i); return *(curRow + j * src.channels() + c); } OpenCV 中的Mat::at()代码有严格的边界检测,Mat::ptr()也有边界检测,但代码中没有检测j 是否越界。 以上为推荐使用的情况,下边的不推荐使用。 可以通过转换指针类型,访问非 uchar 类型的 Mat 元素。 例如:图像是CV_64FC1 格式,可以将 Mat.data 指针直接转换成 double*类型: // imgMat is a image. double* pimg = (double*)(imgMat.data) 也可以用 C++ 中的显式转换符 static_cast,不过要通过 void*类型过渡: void* pvoid = static_castvoid*(imgMat.data); double* pimg = static_castdouble*(pvoid); 这种方式在 Debug 模式下速度提升非常显著,但没有任何的边界检查和异常处理,使用时必须十分小 心。使用 Mat::ptr 的速度和直接使用这种方法差不多,多一层保护总比没有保护强。 (二)Mat 是一个类,由两个数据部分组成:矩阵头 (包含矩阵尺寸,存储方法,存储地址等信息) 和一个指向存储所有像素值的矩阵 (根据所选存储方法的不同矩阵可以是不同的维数)的指针。矩阵 头的尺寸是常数值,但矩阵本身的尺寸会依图像的不同而不同,通常比矩阵头的尺寸大数个数量级。 因此,当在程序中传递图像并创建拷贝时,大的开销是由矩阵造成的,而不是信息头。 OpenCV 引用计数系统。其思想是 Mat 的每个对象具有其自己的头,但可能他们通过让他们矩阵指针 指向同一地址的两个实例之间共享该矩阵。此外,拷贝运算符将只能复制矩阵头部,也还将复制指针 到大型矩阵,但不是矩阵本身。 Mat A,C;//仅创建了头部 A= imread(argv[1],CV_LOAD_IMAGE_COLOR);//分配矩阵 Mat B(A); //使用复制构造函数 C=A; 以上代码中的所有 Mat 对象最终都指向同一个也是唯一一个数据矩阵。他们头不同,但是使用的其中 任何一个对矩阵进行任何修改,也将影响所有其他的。在实践中的不同对象只是提供相同的底层数据 不同的访问方法,然而,它们的头部是不同的。真正有趣的部分是您可以创建仅指向完整数据的一小 部分的头。例如,要在图像中创建兴趣区域 ( ROI) 您只需创建一个新头设置新边界: Mat D(A,Rect(10,10,100,100)); Mat E =A(Range:all(),Range(1,3)); //行列边界 如果矩阵属于多个 Mat 对象,那么当不再需要它时谁来负责清理?最后使用它的对象。对于引用计数 的机制,每当有人复制 Mat 对象的头,矩阵的计数器被增加。每当一个头被清除,此计数器被下调。 当该计数器变为零,矩阵也就被释放了。因为有时会仍然也要复制矩阵的本身,存在着 clone()
您可能关注的文档
最近下载
- 人教版高中物理必修第一册全册教学课件.pptx
- VDA6.3-2023过程审核条例.xls VIP
- 儿童青少年近视防控宣讲课件ppt.pptx VIP
- 格大全(电气装置安装工程质量检验及评定规程).doc VIP
- 第一单元第二课《表现形式》课件++2025-2026学年人教版(2024)初中美术七年级上册.pptx VIP
- 桩基础水平承载力设计与计算-刘金砺_180.pdf VIP
- 第2课 小鸟展翅(教学设计)五年级上册信息技术海南版.docx VIP
- 钢结构检修规程.pdf VIP
- 上海万科翡翠滨江一期12#商办机电、消防工程技术标.pdf
- 医学课件:介入放射学(全套课件328页).ppt VIP
文档评论(0)