OpenCV辅助对象(help objects)(3)——Ptr
OpenCV中的Ptr(智能指针)经过多次版本修改之后,在OpenCV4.0版本之后编译器需要指出C++11的编译器才能编译。Ptr类也完全进行了修改,将Ptr修改为了使用C++11中的shared_ptr 智能指针,Ptr只是对shared_ptr进行了简单的封装。细心读者发现关于Ptr这块,与OpenCV 3x系列版本有很大差别。
OpenCV版本改动记录:https://github.com/opencv/opencv/wiki/ChangeLog#version400
C++11中的shared_ptr已经完全支持在任何地方不需要使用手动删除相关指针的动作,从而完全非常方便的管理内存,避免了像C语言那样手动管理内存而造成内存泄漏的危险。
shared_ptr对遵循共享所有权概念,通过内部使用引用计数机制来实现。
当新的shared_ptr对象与指针关联时,则在其构造函数中,将与此管理的引用计数增加1.
当任何shared_ptr对象超出作用域时,则在其析构函数中,将它的关联计数减1,如果引用计数变为0,则表示没有其他shared_ptr对象与此内存管理,则会自动删除该内存。
对于shared_ptr详细解释可以推荐看下:https://blog.csdn.net/shaosunrise/article/details/85228823
对于整个智能指针的由来以及几种方法,建议可以读下《c++ Primer》第四版P419
Ptr
Ptr的定义在modules\core\include\opencv2\core\cvstd_wrapper.hpp文件中,其定义代码如下:
template<typename T>
struct Ptr : public std::shared_ptr<T>
{
#if 0using std::shared_ptr<T>::shared_ptr; // GCC 5.x can't handle this
#elseinline Ptr() CV_NOEXCEPT : std::shared_ptr<T>() {}inline Ptr(nullptr_t) CV_NOEXCEPT : std::shared_ptr<T>(nullptr) {}template<typename Y, typename D> inline Ptr(Y* p, D d) : std::shared_ptr<T>(p, d) {}template<typename D> inline Ptr(nullptr_t, D d) : std::shared_ptr<T>(nullptr, d) {}template<typename Y> inline Ptr(const Ptr<Y>& r, T* ptr) CV_NOEXCEPT : std::shared_ptr<T>(r, ptr) {}inline Ptr(const Ptr<T>& o) CV_NOEXCEPT : std::shared_ptr<T>(o) {}inline Ptr(Ptr<T>&& o) CV_NOEXCEPT : std::shared_ptr<T>(std::move(o)) {}template<typename Y> inline Ptr(const Ptr<Y>& o) CV_NOEXCEPT : std::shared_ptr<T>(o) {}template<typename Y> inline Ptr(Ptr<Y>&& o) CV_NOEXCEPT : std::shared_ptr<T>(std::move(o)) {}
#endifinline Ptr(const std::shared_ptr<T>& o) CV_NOEXCEPT : std::shared_ptr<T>(o) {}inline Ptr(std::shared_ptr<T>&& o) CV_NOEXCEPT : std::shared_ptr<T>(std::move(o)) {}// Overload with custom DefaultDeleter: Ptr<IplImage>(...)template<typename Y>inline Ptr(const std::true_type&, Y* ptr) : std::shared_ptr<T>(ptr, DefaultDeleter<Y>()) {}// Overload without custom deleter: Ptr<std::string>(...);template<typename Y>inline Ptr(const std::false_type&, Y* ptr) : std::shared_ptr<T>(ptr) {}template<typename Y = T>inline Ptr(Y* ptr) : Ptr(has_custom_delete<Y>(), ptr) {}// Overload with custom DefaultDeleter: Ptr<IplImage>(...)template<typename Y>inline void reset(const std::true_type&, Y* ptr) { std::shared_ptr<T>::reset(ptr, DefaultDeleter<Y>()); }// Overload without custom deleter: Ptr<std::string>(...);template<typename Y>inline void reset(const std::false_type&, Y* ptr) { std::shared_ptr<T>::reset(ptr); }template<typename Y>inline void reset(Y* ptr) { Ptr<T>::reset(has_custom_delete<Y>(), ptr); }template<class Y, class Deleter>void reset(Y* ptr, Deleter d) { std::shared_ptr<T>::reset(ptr, d); }void reset() CV_NOEXCEPT { std::shared_ptr<T>::reset(); }Ptr& operator=(const Ptr& o) { std::shared_ptr<T>::operator =(o); return *this; }template<typename Y> inline Ptr& operator=(const Ptr<Y>& o) { std::shared_ptr<T>::operator =(o); return *this; }T* operator->() const CV_NOEXCEPT { return std::shared_ptr<T>::get();}typename std::add_lvalue_reference<T>::type operator*() const CV_NOEXCEPT { return *std::shared_ptr<T>::get(); }// OpenCV 3.x methods (not a part of standard C++ library)inline void release() { std::shared_ptr<T>::reset(); }inline operator T* () const { return std::shared_ptr<T>::get(); }inline bool empty() const { return std::shared_ptr<T>::get() == nullptr; }template<typename Y> inlinePtr<Y> staticCast() const CV_NOEXCEPT { return std::static_pointer_cast<Y>(*this); }template<typename Y> inlinePtr<Y> constCast() const CV_NOEXCEPT { return std::const_pointer_cast<Y>(*this); }template<typename Y> inlinePtr<Y> dynamicCast() const CV_NOEXCEPT { return std::dynamic_pointer_cast<Y>(*this); }
}
经过多次版本更改之后,如今基本上就是对shared_ptr进行了再次封装,其使用方法和shared_ptr类似。
ptr简单使用用例:
#include <stdio.h>
#include "opencv2/opencv.hpp"using namespace cv;
using namespace std;void main()
{Ptr<Vec3i> p(new Vec3i);*p = Vec3i::all(10);cout << "p value= " << *p << endl;
}
运行结果:
p value= [10, 10, 10]
OpenCV辅助对象(help objects)(3)——Ptr相关推荐
- OpenCV辅助对象(help objects)(5)_DataType
cv::DataType<>为OpenCV中用于提取数据类型的模板,主要是利用C++ traits技术,实现算法与数据类型 的分离,增加算法兼容性,<learning OpenCV3 ...
- OpenCV辅助对象(help objects)(6)_InputArray和OutputArray
opencv中的cv:DataType<>解决了算法与数据类型分类的问题,使算法能够适应多种类型的数据,以及能够方便提取出数据类型.但是OpenCV的基本数据类型有多多,Mat matx, ...
- OpenCV辅助对象(help objects)(4)_Exception
OpenCV源码中一般程序如果遇到一些异常(比如空指针等之类的)需要跑出异常一般使用Exception类.Exception是OpenCV在C++std::exception异常中进行了再次封装. E ...
- OpenCV辅助对象(help objects)(2)_Range
Range在opencv中经常被用来表示一段连续的整数数字序列,整体数据结构比较简单,有两个元素start 和 end,分别为序列的开始和结束,取值范围为一个半开半闭空间: [start, end), ...
- OpenCV辅助对象(help objects)(1)_TermCriteria
OpenCV除了基本数据结构(Basic data types)之外还有很多的辅助结构才能使opencv使用越来越完善,下面来分析第一个辅助结构TermCriteria,该结构是OpenCV3中经过整 ...
- OpenCV的数据类型——辅助对象
在上一篇文章中,主要介绍了OpenCV的基础数据类型.接下来在本篇文章中将主要对OpenCV的辅助对象进行介绍. cv::TermCriteria类 在很多算法中都存在着循环嵌套,只有满足终止条件时才 ...
- OpenCV 实时对象跟踪(质心跟踪)
本文章先介绍对象跟踪过程,考虑对象跟踪的特点决定使用:质心跟踪算法,然后会一步一步说明质心跟踪算法的实现:最后是如何用python代码实现. 实验效果如下: 对象跟踪过程 进行一组初始的对象检测(如: ...
- OpenCV运行对象检测深度学习网络的实例(附完整代码)
OpenCV运行对象检测深度学习网络的实例 OpenCV运行对象检测深度学习网络的实例 OpenCV运行对象检测深度学习网络的实例 #include <fstream> #include ...
- OpenCV收集对象及其分割蒙版的数据集的实例(附完整代码)
OpenCV收集对象及其分割蒙版的数据集的实例 OpenCV收集对象及其分割蒙版的数据集的实例 OpenCV收集对象及其分割蒙版的数据集的实例 #include "opencv2/core. ...
最新文章
- 【机器学习】什么是机器学习?(上)
- 计算机二级asscii的知识点,计算机二级试题及答案
- 常用公有云接入——AZURE
- 【cocos2d-x从c++到js】14:注册函数
- HTML min/maxlength
- JS将字符串yyyyMMddHHmmss转Date
- WinAPI: SetTextJustification - 设置两端对齐
- js监听滚动条滚动事件
- 181201每日一句
- 视频实现blob加密
- 清华大学计算机与科学系张荷花简历,清华大学软件学院
- C++ 保留小数位数
- Keras学习教程七
- Spring框架学习 思维导图
- 【编译原理】词法分析(正规式与自动机)
- 一二线城市地价上涨 上市房企普遍收缩拿地规模
- 数字同步网时钟系统设计方案
- Electron和Vue
- 曼德布洛特(Mandelbrot)集合
- centos7 samba 离线安装_CentOS 7安装配置Samba服务器(挂载共享文件夹)