OpenCV学习心得——基础篇——了解OpenCV数据类型——辅助对象、工具函数与模板结构

OpenCV学习心得——基础篇——了解OpenCV数据类型——辅助对象、工具函数与模板结构
FOR THE SIGMA
FOR THE GTINDER
FOR THE ROBOMASTER

简介:

这一系列的学习心得第一轮将参考《学习OpenCV3》一书

操作系统版本:Ubuntu16.04(在这里博主在Linux下进行运行的)
http://www.ubuntu.org.cn/download/desktop 桌面版ubuntu16.04 下载

电子版书籍下载地址
暂无资源

内容:

辅助对象
这种主要针对于控制各种各样的算法(例如终止算法)和各种在容器上的操作(比如ranges或者slices)非常有用。
其中还有一种非常重要的对象,智能指针cv::Ptr。深入cv::Ptr,检查集成进OpenCV的C++接口的垃圾收集系统(这种系统会将我们从对象的申请和释放中解放出来)。

cv::TermCritera类
很多算法都需要一个终止条件以确定何时退出。其终止条件不是达到允许的有限迭代次数(称为COUNT或MAX_ITER),
就是某种形式的误差参数-EPS,而cv::TermCriteria类则把一个或两个终止条件封装。他有三个个成员变量(type,maxCount以及epsilon)进行直接设置。
通过构造函数TermCriteria(int type, int maxCount, double epsilon)
变量type设置:cv::TermCriteria::COUNT或者TermCriteria::EPS(也可以用位运算符 | )

cv::Range类
用于确定一个连续的整数序列。cv::Range对象有两个元素start和end,与cv::TermCriteria类似。
通过结构函数cv::Range(int start, int end)
例如cv::Range(0,4)范围的值为0,1,2,3 ,也就是说不包括end值。

当然使用size( )函数可以得到一个range类的元素数量,在上面的例子中,rgb.size( )等于4。
empty( )用与测试一个range是否含有元素。
cv::Range::all( ) 可以用在任何需要获得对象可用范围的时候

cv;:Ptr类
智能指针,c++中是一个非常有用的类型。它运行我们创建一个对象的引用,然后把它传递到各处。可以创建更多的对该对象的引用,然后所有这些引用都会被计数。当引用超出范围,智能指针的引用计数就会减少。一旦所有的引用(指针的实例)消失,这个对象便自动清理(释放)。

调用cv::Ptr p(new cv::Matx33f) 或是 cv::Ptr p = makePtrcv::Matx33f( )的形式实现。
当得到一个智能指针p,就可以创建其他相同类型的对象,而不需要把一个指向新的对象的指针传递给它们。
例如:你可以创建Ptr q, 当你把p的值传递给q时,在后台的某个地方,智能指针就开始执行“智能”行为。你可以发现,像一个正常的指针一样,这里仍然只有一个实际上的cv::Mat33f实例,而p和q同时指向它,不同之处在于,p与q都知道它们只是两个指针中的一个。当p被释放时,q就能知道它是原始矩阵仅存的引用,当q也要被释放时也会释放它的原始矩阵。
函数addref( )与release( ) :用于增加或减少指针内部的引用计数。
函数empty( ) :用于确定一个智能指针是否指向一个已经被释放掉的对象。
函数delete_obj( ) :引用计数为零时自动调用的函数。
例如:

template<> inline void cv::Ptr<IplImage>::delete_obj( ) 
{
  		cvReleaseImage(&obj);
}

参考:https://blog.csdn.net/sinat_31337047/article/details/61931130

cv::Exception类和异常处理
这是OpenCV使用异常来处理错误。它继承自STL的异常类std::exception。但这只是处于cv::命名空间,使其有别于其他从std::exception中继承而来的对象。
成员:
code :数字的错误码代表
err:表示产生异常的错误的字符串
func:错误发生的函数名
file:错误发生的文件
line:错误出现在文件中的行数。
其中err,func和files全部都是STL字符串。
CV_Error(errorcode, description) 会生成并抛出一个有固定文字描述的异常。
CV_Error_(errorcode,printf_fmt_str,[ printf-args ] )工作同上,但是允许你使用类似printf格式字的符串和参数代替固定的描述。
CV_Assert(condition)和CV_DbgAssert(condition)都会测试程序中所设定的条件,如果条件不符合则抛出异常。

cv::DataType<>模板
参考:https://blog.csdn.net/Du_Shuang/article/details/82715227

cv::InputArray类和cv::OutputArray类
主要区别在于前者假设为常量(只读),而后者是可变量,它们可以让你使用任何数组类型,包括单一的cv::Scalar。

工具函数
cv::alignPtr( ) :对齐指针到给定字节数

template<T> T* cv::alignPr(T* ptr,int n = sizeof(T));

cv::alignSize( ) :将缓存区大小与给定的字节数对齐

size_t cv::alignSize(size_t sz, int n = sizeof(T);

cv::allocate( ) :分配一个C风格的数组对象

template<T> T* cv::allocate(size_t sz);

与数组形式的new相似,都分配了含n个T类型对象的c风格数组,为每个对象调用默认构造函数并返回指向数组中第一个对象的指针。

cvCeil( )^a : 近视一个浮点数x到不小于x的最近的整数(向上取整)

int cvCeil(float x);

cv::cubeRoot( ) :计算一个数的立方根(正值负值皆可以计算,返回对应的数值)

float cv::cubeRoot( float x);

cv::CV_Assert( ) :如果给定的条件不为真,则抛出异常
CV_Error( ) :构造cv::Exception (从固定的字符串)并抛出异常的一个宏
CV_Error_( ) :构造cv::Exception (从格式化的字符串)并抛出异常的一个宏

cv::dealloate( ) :释放一个c风格的数组对象
与数组形式的deleta相似,都释放含n个T类型对象的c风格数组,为每个对象调用了析构函数。而这个用于释放由于cv::allocate( )分配的对象。传递给cv::deallocate( ) 的元素n必须与一开始cv::allocate( )分配的对象数量相同。

cv::error( ) : 指出错误并抛出异常

cv::fastAtan2( ) :向量的二维角度的计算

float cv::fastAtan2(float y, float x);  #y,x input value (32-bit float)

该函数计算了x,y对的反正切并返回从圆点到指示点的角度。这个结果以0.0~360.0之间的角度表示。

cv::fastFree( ) :释放一个内存缓存区(cv::fastMalloc( )分配的)

void cv::fastFree(void* ptr);

cv::fastMalloc( ) :分配一个对齐的内存缓存区

void* cv::fastMalloc(size_t size);

cvFloor( ) :近似一个浮点数x到不大于x的最近的整数(向下取整)

int cvFloor(float x);

如果输入的值超过32位整数能表示的范围,结果会是undefined

cv::format( ) :以sprintf类似格式创建一个STL字符串

string cv::format(const char* fmt)

cv::getCPUTickCount( ) :从内部CPU计时器获得tick计数

cv::getNumThreads( ) :获得当前opencv使用的线程数

int cv::getNumThreads(void)

cv::getOptimalDFTSize( ) :计算要传输给cv::DFT( )的数组的最适宜大小

int cv::getOptimalDFTSize(int n);

cv::getThreadNum( ) :获得当前线程的索引(需要添加OpenMP支持

int cv::getThreadNum(void)

cv::getTickCount( ):获得每秒的tick数(返回与一些体系结构相关的)

int64 cv::getTickCount(Void);

不受到线程跑在哪个核和CPU频率自动节流等底层问题的影响。

cv::getTickFrequenc( ) :计算时钟时间(秒)和抽象的ticks之间的转换。

double cv::getTickFrequency(void);

cvIsInf( ) 判定一个浮点数x是否无穷

int cvIsInf(double x );

cvIsNaN( ) :判定一个浮点数x是否不是一个数

int cvIsNan( double x );

cvRound( ) :近似一个浮点数x到最近的整数

int cvRoun( double x );

cv::setNumThreads( ) : 设定Opencv使用的线程数

void cv::setNumThreads( int nthreads );

cv::setUseOptimized( ) :开启或关闭优化代码(SSE2等)

void cv::setUseOptimized( bool on_off );

cv::useOptimized( ) :指示代码优化的启用

bool cv::useOptimized(void);
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值