Opencv2.4.6自带文档中文笔记(core).pdf

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

文档评论(0)

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

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

1亿VIP精品文档

相关文档