opencv中的安全指针和指针对齐
[转]http://hi.baidu.com/maxint/blog/item/fc817c2f29881f331e3089ef.html
1. 安全指针
从opencv2.0开始,很多C数据结构变成了C++的类,考虑到兼容性,保留旧的API。在内存管理方面,提供安全指针类Ptr,让在此以前旧的需要手动管理内存的数据结构(IplImage, CvMat等)无需手动Release,用法为:
Ptr<IplImage> img = cvReadImage("Lena.jpg");
Ptr是一个模板类,在opencv中定义如下:
template<typename _Tp> class Ptr{public: Ptr(); Ptr(_Tp* _obj); ~Ptr(); Ptr(const Ptr& ptr); Ptr& operator = (const Ptr& ptr); void addref();void release();void delete_obj();bool empty() const; _Tp* operator -> ();const _Tp* operator -> () const; operator _Tp* (); operator const _Tp*() const;protected: _Tp* obj; int* refcount;};
上述源码定义在原有的指针类加了个指针引用数(refcount),对一些操作符进行了重载(operator ->;())。值得注意的是,Ptr template 对指针指向的对象有一个要求,就是可以用 delete 操作土符来释放内存。你可能就想到 IplImage 就不满足这个要求了,这怎么办?可以使用模板特化(template specialization)重载 Ptr<Iplimage>::delete_obj() 函数:
template<> inline void Ptr<IplImage>::delete_obj(){ cvReleaseImage(&obj); }
2. 指针对齐(http://bytes.com/topic/c/answers/213142-what-pointer-alignment)
为什么要指针对齐? 这是因为在某些架构上,只有能被指定数(如4,16)整除的内存地址才能够被访问,否则程序会crash,或者出现错误的结果,或者数据的访问变慢。举个例子来说,很多系统都要求interger的地址从偶数开始。opencv2.0以上版本很多指针都是被对齐过的,使指针地址能够被16整除。opencv中的内存一般是通过malloc分配,不能保证都是都能被16整除,此时需要截断,但是剩下的内存要如何维护? CV2.0的这样维护的:在 malloc 是多申请一个指针的空间,这个指针指向 malloc 得到的真实内存地址,只在 free 时使用它。相关函数:
typedef unsigned char uchar;#define CV_MALLOC_ALIGN 16template<typename _Tp> static inline _Tp* alignPtr(_Tp* ptr, int n=(int)sizeof(_Tp)){ return (_Tp*)(((size_t)ptr + n-1) & -n);}__declspec(dllexport) void* fastMalloc( size_t size ){ uchar* udata = (uchar*)malloc(size + sizeof(void*) + CV_MALLOC_ALIGN); //HERE 多申请一个 void* 的空间用于存储 udata uchar** adata = alignPtr((uchar**)udata + 1, CV_MALLOC_ALIGN); adata[-1] = udata; //<- 存储 udata return adata;}__declspec(dllexport) void fastFree(void* ptr){ if(ptr) { uchar* udata = ((uchar**)ptr)[-1]; assert(udata < (uchar*)ptr && ((uchar*)ptr - udata) <= (ptrdiff_t)(sizeof(void*)+CV_MALLOC_ALIGN)); free(udata); }}
转载于:https://www.cnblogs.com/summerRQ/articles/2408767.html
opencv中的安全指针和指针对齐相关推荐
- OpenCV中图像Mat,二维指针和CxImage类之间的转换
在做图像处理中,常用的函数接口有Opencv中的Mat图像类,有时候需要直接用二维指针开辟内存直接存储图像数据,有时候需要用到CxImage类存储图像.本文主要是总结下这三类存储方式之间的图像数据的转 ...
- OpenCV中Mat,图像二维指针和CxImage类的转换
在做图像处理中,常用的函数接口有OpenCV中的Mat图像类,有时候需要直接用二维指针开辟内存直接存储图像数据,有时候需要用到CxImage类存储图像.本文主要是总结下这三类存储方式之间的图像数据的转 ...
- OpenCV 【一】—— OpenCV中数组指针、图像分块计算、指针取像素值与MatToEigen方法,内存对齐
{ Topic1: 高效开辟内存,使适用于大型数组.//开辟新数组,或者开辟新的0或者某一数值的数组/Mat或者Map直接使用memset //大数组操作效率较高 举例1:cv::Mat cv_ncc ...
- opencv获取mat的指针_数字图像处理之opencv中Mat数据操作
数字图像处理其实就是处理二维矩阵数据.利用opencv来学习处理算法是一种比较好的方式.学习opencv,主要就是调用其中的图像处理函数来实现各种操作.如果要得到想要的处理结果,还需要对图像处理算法有 ...
- C语言使用指针处理opencv中的Mat图像数据
1.在处理图像时,一般直接使用opencv中的imread函数获取图片,但是获取到图片后没有用到opencv中的其他算法时,直接用图片处理就会出现耗时严重的情况,所以需要将图片形式转换成指针数组形式处 ...
- 【OpenCV】OpenCV实战从入门到精通之 -- 指针访问、迭代器iterator、动态地址计算配合at元素
目录 1.指针访问像素 2.迭代器操作像素 3.动态地址计算 OpenCV中,有三种方式访问图像像素: 指针访问:C操作符[]: 迭代器iterator 动态地址计算 上述方法在访问速度上略有差异.d ...
- rtthread 字节对齐问题 int指针访问非对齐地址崩溃
rtthread 字节对齐问题 int指针访问非对齐地址崩溃 环境: SOC: i.MX RT1050 底板: 野火 RT1052 Kernel: rt-thread 背景: 我正在实现解析udp包, ...
- 关于C语言中的数组指针、指针数组以及二级指针
概念解释 数组指针:首先它是一个指针,它指向一个数组,即指向数组的指针:在32 位系统下永远是占4 个字节,至于它指向的数组占多少字节,不知道.数组指针指向的是数组中的一个具体元素,而不是整个数组,所 ...
- c++中关于char数组/char*指针/string类型
c++中关于char数组/char*指针/string 小渣渣一直被有关string和char[]以及char*的相关问题弄得痛不欲生,传参.返回值.函数调用等到底应该用哪种形式这真的是让小渣癫狂了, ...
最新文章
- 有一群200w年薪的朋友是什么感觉?谈一谈入学中国科学院大学的几点感受吧
- Google Chrome 72 丢弃HPKP,不再支持TLS1.0和TLS1.1!
- 直播 | LiveVideoStack Meet杭州:后直播时代技术
- SAP如何批量设置采购信息记录删除标记
- 32和64位jvm_我应该使用32位还是64位JVM?
- iview table 方法若干
- LeetCode-105:从前序与中序遍历序列构造二叉树
- 我学Delphi心得及笔记----内存(第七讲)
- keystore was tampered with,or password was incorrect解决办法
- 三个角度细谈:如何发挥朋友圈广告的威力
- vue 使用 :class 根据不同状态值设置状态文字颜色不同
- SyntaxError: Missing parentheses in call to 'print' 问题原因
- 分布式计算框架Hadoop原理及架构全解
- 成功人士每天早上的15个习惯
- SteamVR Unity Tool Kit(二):激光与移动
- OIM同步OID(OID-Connector 9.0.4.12)
- android 软键盘的从属关系,Android控件属性大全
- COOX培训材料 — PMT(5.物料配方工单)
- 数据库---数据查询
- GE反射内存卡的指标和型号
热门文章
- php 实现树状组织图插件,使用jstree插件实现树形结构
- python3语法糖_python的语法糖
- 语言迭代发_从今天开始,每天学点R语言~
- 多个折线样式_新技能get,折线图转化成多阶梯瀑布图
- 计算机组装与维修考试试卷,计算机组装与维修期末考试试卷..doc
- update yum 到指定版本_CentOS 使用yum update 更新时保留特定版本的软件
- 前台啊,就是这么杂!
- xml和html是兄弟还是父子?
- 十六进制转换html,如何使用JavaScript将十进制转换为十六进制?
- make,make install命令