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相关推荐

  1. OpenCV辅助对象(help objects)(5)_DataType

    cv::DataType<>为OpenCV中用于提取数据类型的模板,主要是利用C++ traits技术,实现算法与数据类型 的分离,增加算法兼容性,<learning OpenCV3 ...

  2. OpenCV辅助对象(help objects)(6)_InputArray和OutputArray

    opencv中的cv:DataType<>解决了算法与数据类型分类的问题,使算法能够适应多种类型的数据,以及能够方便提取出数据类型.但是OpenCV的基本数据类型有多多,Mat matx, ...

  3. OpenCV辅助对象(help objects)(4)_Exception

    OpenCV源码中一般程序如果遇到一些异常(比如空指针等之类的)需要跑出异常一般使用Exception类.Exception是OpenCV在C++std::exception异常中进行了再次封装. E ...

  4. OpenCV辅助对象(help objects)(2)_Range

    Range在opencv中经常被用来表示一段连续的整数数字序列,整体数据结构比较简单,有两个元素start 和 end,分别为序列的开始和结束,取值范围为一个半开半闭空间: [start, end), ...

  5. OpenCV辅助对象(help objects)(1)_TermCriteria

    OpenCV除了基本数据结构(Basic data types)之外还有很多的辅助结构才能使opencv使用越来越完善,下面来分析第一个辅助结构TermCriteria,该结构是OpenCV3中经过整 ...

  6. OpenCV的数据类型——辅助对象

    在上一篇文章中,主要介绍了OpenCV的基础数据类型.接下来在本篇文章中将主要对OpenCV的辅助对象进行介绍. cv::TermCriteria类 在很多算法中都存在着循环嵌套,只有满足终止条件时才 ...

  7. OpenCV 实时对象跟踪(质心跟踪)

    本文章先介绍对象跟踪过程,考虑对象跟踪的特点决定使用:质心跟踪算法,然后会一步一步说明质心跟踪算法的实现:最后是如何用python代码实现. 实验效果如下: 对象跟踪过程 进行一组初始的对象检测(如: ...

  8. OpenCV运行对象检测深度学习网络的实例(附完整代码)

    OpenCV运行对象检测深度学习网络的实例 OpenCV运行对象检测深度学习网络的实例 OpenCV运行对象检测深度学习网络的实例 #include <fstream> #include ...

  9. OpenCV收集对象及其分割蒙版的数据集的实例(附完整代码)

    OpenCV收集对象及其分割蒙版的数据集的实例 OpenCV收集对象及其分割蒙版的数据集的实例 OpenCV收集对象及其分割蒙版的数据集的实例 #include "opencv2/core. ...

最新文章

  1. 【机器学习】什么是机器学习?(上)
  2. 计算机二级asscii的知识点,计算机二级试题及答案
  3. 常用公有云接入——AZURE
  4. 【cocos2d-x从c++到js】14:注册函数
  5. HTML min/maxlength
  6. JS将字符串yyyyMMddHHmmss转Date
  7. WinAPI: SetTextJustification - 设置两端对齐
  8. js监听滚动条滚动事件
  9. 181201每日一句
  10. 视频实现blob加密
  11. 清华大学计算机与科学系张荷花简历,清华大学软件学院
  12. C++ 保留小数位数
  13. Keras学习教程七
  14. Spring框架学习 思维导图
  15. 【编译原理】词法分析(正规式与自动机)
  16. 一二线城市地价上涨 上市房企普遍收缩拿地规模
  17. 数字同步网时钟系统设计方案
  18. Electron和Vue
  19. 曼德布洛特(Mandelbrot)集合
  20. centos7 samba 离线安装_CentOS 7安装配置Samba服务器(挂载共享文件夹)

热门文章

  1. nodejs项目如何部署到服务器上?
  2. 微信小程序(应用号)调试工具内测破解方法
  3. jeecg 如何重新加载当前渲染tab页面
  4. 《JEECG_v3 开发手册》文档发布通知
  5. Mac安装与配置idea及tomcat
  6. MongoDB数据建模介绍
  7. 阿里云 API 签名机制的 Python 实现
  8. IDEA中一个工程多个模块(module)分别提交到不同的git服务器
  9. 安全狗结合服云,网络管理倍儿轻松
  10. mysql 实现master-slave 同步