- 1、本文档共36页,可阅读全部内容。
- 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 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()
您可能关注的文档
- NCR TMS产品介绍 v2.0.pdf
- NEC3200放映机杜比软件中文说明.pdf
- NCStudio 用户手册.pdf
- nc现金管理V55.pdf
- NetBotz 综述.pdf
- NC6-流程平台.pdf
- NEW-刘细丰《薪酬管理参考习题》(二级).pdf
- NEC进修医生讲课.pdf
- NetCTOSS2.0页面布局设计说明书.pdf
- NETCOM-200IE高性能隔离型二串口服务器用户手册 V1.00.pdf
- 四川省德阳市罗江中学2025届高三考前热身化学试卷含解析.doc
- 山东省枣庄现代实验学校2025届高三下学期第五次调研考试化学试题含解析.doc
- 吉林省长春市十一高中等九校教育联盟2025届高三一诊考试生物试卷含解析.doc
- 2025届江苏省盐城市伍佑中学高考仿真模拟化学试卷含解析.doc
- 2025届广西贺州中学高考冲刺押题(最后一卷)生物试卷含解析.doc
- 安徽省池州市贵池区2025届高三第一次模拟考试生物试卷含解析.doc
- 宁夏银川一中2025届高三(最后冲刺)化学试卷含解析.doc
- 广东省广州市增城区四校联考2025届高考压轴卷化学试卷含解析.doc
- 2025届邯郸市第一中学高考生物必刷试卷含解析.doc
- 2025届安徽省安庆市石化第一中学高考仿真卷化学试卷含解析.doc
文档评论(0)