当前位置: 首页 > news >正文

OpenCV的数据类型二

文章目录

  • 前言
  • 1.帮助类
    • 1.1 cv::TermCriteria类
      • 1.1.1 应用举例
    • 1.2 cv::Range 类
      • 1.2.1 学习链接
    • 1.3 cv::Ptr 模板和垃圾回收
      • 1.3.1 学习链接
    • 1.4 cv::Exception类和异常处理
      • 1.4.1 学习链接
    • 1.5 cv::DataType<>模板
    • 1.6 cv::InputArray和cv::OutputArray
      • 1.6.1​定义​:
      • 1.6.2 说明:
      • 1.6.3学习链接
  • 2.工具函数
    • 2.1 cv::alignPtr()
      • 2.1.1 学习链接
    • 2.2 cv::alignSize()
    • 2.3 cv::allocate()
    • 2.4 cv::deallocate()
    • 2.5 cv::fastFree()
    • 2.6 cv::fastMalloc()
    • 2.7 cv::cubeRoot()
    • 2.8 cv::CV_Assert()
      • 2.8.1 学习链接
    • 2.9 cv::fastAtan2()
    • 2.10 cv::format()
    • 2.11 cv::getCPUTickCount()
    • 2.12 cv::getNumThreads()
    • 2.13 cv::setNumThreads()
    • 2.14 cv::getThreadNum()
    • 2.15 cv::getOptimalDFTSize()
    • 2.16 cv::getTickCount()获得系统的tick数
    • 2.17 cv::getTickFrequency()
    • 2.18 cv::setUseOptimized()
    • 2.19 cv::useOptimized()
    • 2.20 CV_Error() & CV_Error_()
    • 2.21 cv::error()
    • 2.22 cvIsInf()
    • 2.23 cvIsNaN()
    • 2.24 cvRound()
    • 2.25 cvCeil()
    • 2.26 cvFloor()
  • 3.参考链接

前言

1.帮助类

1.1 cv::TermCriteria类

  定义迭代算法终止条件的类。相机用法可参考链接OpenCV库成员——TermCriteria类

默认构造和有参构造

cv::TermCriteria::TermCriteria()	cv::TermCriteria::TermCriteria(int 	type,int 	maxCount,double 	epsilon 
)		

type:判定迭代终止的条件类型。
  有3种形式:
  1).TermCriteria::COUNT 最大迭代次数;
  2).TermCriteria::EPS 要求的收敛阈值;
  3).TermCriteria::COUNT + TermCriteria::EPS 达到2个条件之一即可。
maxCount:即最大迭代次数。
epsilon:即要求的收敛阈值。

1.1.1 应用举例

//构造函数
cv::TermCriteria(int type, int maxCount, double epsilon); 
cv::TermCriteria tc;
tc.type = cv::TermCriteria::COUNT | cv::TermCriteria::EPS;
tc.maxCount = 1000;
tc.epsilon = 10;cv::TermCriteria t(cv::TermCriteria::COUNT | cv::TermCriteria::EPS, 1000, 1.0);

1.2 cv::Range 类

  cv::Range类用于确定一个连续的整数序列。cv::Range对象有两个元素start和end。

class CV_EXPORTS Range
{
public:Range();Range(int _start, int _end);int size() const; //得到元素数量bool empty() const; //判断是否为空static Range all(); //可以用在任何需要获得对象可用范围的时候,不是很懂?int start, end;
};
函数说明
cv::Range::size()返回一个range对象的元素数量
cv::Range::empty()返回一个range对象是否含有元素
cv::Range::all()获得对象可用范围

1.2.1 学习链接

  1.cv::Range 类详解

1.3 cv::Ptr 模板和垃圾回收

  1.C++中的智能指针采用引用计数的方式来标识指针的被引用次数,当引用增加时计数会加1,引用减小时计数会减1;
  2.当引用计数为0即指针不再需要时,就会被销毁。
  3.OpenCV3中的cv::Ptr<>与c++智能指针的作用相同。
v使用时需要让Ptr包裹想要创建的指针类型,例如:

cv::Ptr<Matx33f> p(new cv::Matx33f);
cv::Ptr<Matx33f> p = makePtr<cv::Matx33f>();
函数说明
cv::Ptr::addref()增加指针内部的引用计数
cv::Ptr::release()减少指针内部的引用计数
cv::Ptr::empty()确定一个智能指针是否指向一个已经被释放掉的对象
int main() 
{cv::Ptr<cv::Matx33f> p = new(cv::Matx33f);p[0] = {1,2,2,3,4,5,6,7,8};std::cout << p[0] << std::endl;std::cout << "hello world" << std::endl;return 0;
}

  ​cv::Ptr<>​​​中最后一个要了解的成员是​​delete_obj()​​,这是一个引用计数为零时自动调用的函数。默认情况下,这个函数定义了但不做任何事情。

1.3.1 学习链接

  1.智能指针类和OpenCV的Ptr模板类
  2.Ptr类模板

1.4 cv::Exception类和异常处理

  OpenCV使用异常来处理错误,OpenCV继承自STL的异常类,​​std::exception​​​定义了它自己的异常类型​​cv::Exception​​(区别在于在命名空间cv内)。

类成员含义
code一个数字的错误码
err产生异常的错误的字符串
func错误发生的函数名
file错误发生的文件
line错误发生在文件中的行数

err、func、line全部都是STL字符串

有几个内置宏用于自己生产异常:

  1.CV_Error:生产并抛出一个有固定文字描述的异常;
  2.CV_Error(errorcode, printf_fmt_str, [printf-args]):以同样的方式工作,但允许你使用类似printf格式字符串和参数代替固定的描述;
  3.CV_Assert(condition)CV_DbgAssert(condition)都会测试程序中所设定的条件(contidion),如果条件不符合则抛出异常。

1.4.1 学习链接

  待补充

1.5 cv::DataType<>模板

  当OpenCV库函数需要传递特定数据类型的概念时,它们会创建一个​​cv::DataType<>​​​类型的对象。​​cv::DataType<>​​本身是一个模板,传递的实际对象是这个模板的特化。

1.6 cv::InputArray和cv::OutputArray

  在OpenCV中,有两个代理类是经常出现的:InputArrayOutputArray,它巧妙地利用了C++的定义转换,辅助完成对矩阵的管理。

1.6.1​定义​:

typedef const _InputArray& InputArray;
typedef InputArray InputArrayOfArrays;
typedef const _OutputArray& OutputArray;
typedef OutputArray OutputArrayOfArrays;
typedef const _InputOutputArray& InputOutputArray;
typedef InputOutputArray InputOutputArrayOfArrays;

  cv::InputArray类 和cv::OutputArray类的区别:前者为常量(只读),后者为可变量。

1.6.2 说明:

  InputArray是一个代理类,用于将只读输入数组传递到OpenCV函数中。

1.6.3学习链接

  1.基本结构对象-cv::_InputArray
  2.OpenCV源码详解之InputArray, OutputArray

2.工具函数

  1.OpenCV提供一些专用功能,可用于更有效地处理计算机视觉应用中普遍出现的数学和其他问题。它们被称为工具函数。
  2.工具函数包含数学操作、测试、错误生产、内存与线程处理、优化及其他的工具。
在这里插入图片描述

序号函数名称描述
1cv::alignPtr()对齐指针到给定字节数
2cv::alignSize()将缓冲区大小与给定的字节数对齐
3cv::allocate()分配一个C风格的数组对象
4cv::cubeRoot()计算一个数的立方根
5cv::CV_Assert()如果给出的条件不为真,则抛出异常
6cv::deallocate()释放一个C风格的数组对象
7cv::error()指示错误并抛出异常
8cv::fastAtan2()向量的二维角度的计算
9cv::fastFree()释放一个内存缓冲区
10cv::fastMalloc()分配一个对齐的内存缓冲区
11cv::format()以sprintf类型格式创建一个STL字符串
12cv::getCPUTickCount()从内部CPU计时器获得tick计数
13cv::getNumThreads()cv::getNumThreads()
14cv::getOptimalDFTSize()计算要传递给cv::DFT()的数组的最适宜大小
15cv::getThreadNum()获得当前线程的索引
16cv::getTickCount()获得系统的tick计数
17cv::getTickFrequency()获得每秒的tick数
18cv::setNumThreads()设定OpenCV使用的线程数
19cv::setUseOptimized()开启或关闭优化代码(SSE2等)
20cv::useOptimized()指示代码优化的启用
21CV_Error()构造cv:Exception(从固定的字符串)并抛出异常的一个宏
22CV_Error_()构造cv:Exception(从格式化的字符串)并抛出异常的一个宏
23cvIsInf()判断一个浮点数x是否无穷
24cvIsNaN()判断一个浮点数x是否不是一个数
25cvRound()判断一个浮点数x到最近的整数
26cvCeil()近似一个浮点数x到不小于x的最近的整数(向上取整)
27cvFloor()近似一个浮点数x到不大于x的最近的整数(向下取整)

2.1 cv::alignPtr()

  该函数主要是将给定的指针按照给定的自己来对齐,API形式如下:

template<typename _Tp> static inline _Tp* alignPtr(_Tp* ptr, int n=(int)sizeof(_Tp))

  其中ptr为传递的原内存地址, n为按照需要的字节数对齐,默认情况下是按照指针的类型进行对齐
  函数返回值为对齐后的指针地址。其函数实现比较简单

template<typename _Tp> static inline _Tp* alignPtr(_Tp* ptr, int n=(int)sizeof(_Tp))
{CV_DbgAssert((n & (n - 1)) == 0); // n is a power of 2return (_Tp*)(((size_t)ptr + n-1) & -n);}

2.1.1 学习链接

  Opencv辅助函数

2.2 cv::alignSize()

size_t cv::alignSize
( // minimum size >='sz' divisible by 'n'
size_t sz, // size of buffer
int n = sizeof(T) // align to block size, a power of 2
);

  给定一个数量n(一般是从sizeof()返回的值)和一个来自缓存sz的大小,alignSize()计算此缓冲区应该的大小,以便包含大小为n个整数的对象。这便是最小的大于或等于sz除以n的数。计算使用了下面的公式:

(sz + n-1) & -n

2.3 cv::allocate()

template<T> T* cv::allocate( // Return pointer to allocated buffer
size_t sz // buffer size, multiples of sizeof(T)
);

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

2.4 cv::deallocate()

template<T> void cv::deallocate(
T* ptr, // Pointer to buffer to free
size_t sz // size of buffer, multiples of sizeof(T)
);

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

2.5 cv::fastFree()

void* cv::fastMalloc( // Pointer to allocated buffersize_t size // Size of buffer to allocate
);

  这个函数的工作机制和malloc()类似,但是因为它做了缓存区内存大小对齐,所以执行速度更快。这意味着,如果传递的缓存区大小超过16bit,那么返回的缓存区会被对齐到16bit的边界。

2.6 cv::fastMalloc()

void cv::fastFree(void* ptr // Pointer to buffer to be freed
);

  这个函数释放由cv::fastMalloc()分配的内存。

2.7 cv::cubeRoot()

float cv::cubeRoot( // Return value is 32-bit floatfloat x // input value (32-bit float)
);

  该函数返回变量x的立方根。x可正可负。

2.8 cv::CV_Assert()

// example
CV_Assert( x!=0 )

  CV_Assert()是一个宏,它会测试传递给它的表达式,如果那个表达式是False,它会抛出一个异常。而CV_DbgAssert()只在debug版本中测试。

#include <opencv2/opencv.hpp>
using namespace cv;int main() {Mat image = imread("image.jpg", IMREAD_GRAYSCALE);// 检查图像是否加载成功CV_Assert(!image.empty());// 检查图像的尺寸CV_Assert(image.cols > 0 && image.rows > 0);// 执行图像处理操作Mat processedImage;threshold(image, processedImage, 128, 255, THRESH_BINARY);imshow("Processed Image", processedImage);waitKey(0);return 0;
}

2.8.1 学习链接

  1.CV_Assert用法

2.9 cv::fastAtan2()

float cv::fastAtan2( // Return value is 32-bit floatfloat y, // y input value (32-bit float)float x // x input value (32-bit float)
);

  这个函数计算了x,y对应的反正切所对应的角度,并以0.0~360.0之间的角度表示。

2.10 cv::format()

string cv::format( // Return STL-stringconst char* fmt, // formatting string, as sprintf()... // vargs, as sprintf()
);

  1.这个函数本质上与标准库中的sprintf()相同,但是,它不需要从访问者中获得一个字符缓存区,而是构建一个STL字符串并返回它。
  2.它对Exception()构造函数格式化错误信息很有用。

2.11 cv::getCPUTickCount()

int64 cv::getCPUTickCount( void ); // long int CPU for tick count

  int64 cv::getCPUTickCount( void ); // long int CPU for tick count

2.12 cv::getNumThreads()

int cv::getNumThreads( void ); // total threads allocated to OpenCV

  返回当前OpenCV适用的线程数。

2.13 cv::setNumThreads()

void cv::setNumThreads( int nthreads ); // Set number of threads OpenCV can use

  如果在OpenCV库编译时添加了OpenMP支持,这个函数可以设定OpenCV在并行的OpenMP区域使用的线程数。

2.14 cv::getThreadNum()

int cv::getThreadNum( void ); // int, id of this particular thread

  如果在OpenCV库编译时添加了OpenMP支持,则会返回当前执行的线程的索引。

2.15 cv::getOptimalDFTSize()

int cv::getOptimalDFTSize( int n ); // best size array to use for dft, >= n

  常用在dft()函数中,一般输入为图像的实际大小,并返回你应该传递给cv::dft()的最佳数组大小。

2.16 cv::getTickCount()获得系统的tick数

//在程序开头进行读取当前系统的tick数,作为起始点
t = (double)cv::getTickCount(); // getTickcount函数:返回从操作系统启动到当前所经过的毫秒
// getTickFrequency函数:返回每秒的计时周期数
t = ((double)cv::getTickCount() - t) / cv::getTickFrequency(); //在程序末尾计算经过的时间,

  我们可以写一个计算摄像头的帧率的小程序:

#include "pch.h"
#include <iostream>
#include <opencv2/opencv.hpp>using namespace cv;
using namespace std;int main()
{Mat frame;VideoCapture capture(0);  //定义一个视频流对象double fps;char string[10];namedWindow("Camera FPS");double t = 0;while (1){t = (double)getTickCount();if (waitKey(1) == 1)break;if (capture.isOpened()){capture >> frame;t = t = ((double)cv::getTickCount() - t) / cv::getTickFrequency();fps = 1.0 / t;sprintf_s(string, "%.2f", fps);      // 帧率保留两位小数//spintf函数容易望文生义,误以为是一个打印函数。实质上是一个字符串格式化命令。//主要功能是把格式化的数据写入某个字符串中,至于需要打印的话,还是得需要打印函数来对其进行打印。std::string fpsString("FPS:");fpsString += string;                    // 在"FPS:"后加入帧率数值字符串cout << fpsString << endl;cv::putText(frame, // 图像矩阵fpsString,                  // string型文字内容cv::Point(5, 20),           // 文字坐标,以左下角为原点cv::FONT_HERSHEY_SIMPLEX,   // 字体类型0.5, // 字体大小cv::Scalar(0, 0, 0));       // 字体颜色imshow("Camera FPS", frame);}else{cout << "NO Camera Input! " << endl;break;}}
}

2.17 cv::getTickFrequency()

double cv::getTickFrequency( void ); // Tick frequency in seconds as 64-bit

  这个函常常和上面的getTickCount()合起来使用,来计算事件发生的时间。

2.18 cv::setUseOptimized()

void cv::setUseOptimized( bool on_off ); // If false, turn off optimized routines

  这个函数可以在任何时候开启或关闭一些高性能的优化,比如IPP, SSE2指令集。

2.19 cv::useOptimized()

bool cv::useOptimized( void ); // return true if optimizations are enabled

  这个函数是用来查看是否使用了高性能的优化,如果这些优化是开启的,则返回True,否则返回False。

2.20 CV_Error() & CV_Error_()

// example
CV_Error( ecode, estring )
CV_Error_( ecode, fmt, ... )

  1.CV_Error()也是一个宏,它允许传递一个错误代码ecode和一个固定C风格的字符串estring,然后它们会被打包送进cv::Exception,进而传递给cv::error()进行处理。

2.21 cv::error()

void cv::error(const cv::Exception& ex // Exception to be thrown
);

  1.cv::error()这个函数一般是由cv::CV_Error()CV_Error_()调用的。一般不会直接去调用它。但会依赖于cv::CV_Error()和CV_Error_()去抛出异常,
  这些宏携带者你希望在异常中展示的信息,为我们打包好,然后传递最终的异常结果给cv::error()

2.22 cvIsInf()

  如果x是 正负无穷, 则cvIsInf()返回值是1, 否则返回0。

int cvIsInf(double x);

2.23 cvIsNaN()

  如果x不是一个数,那么该函数返回的值就是1,否则为0。NaN测试是由IEEE754标准提供的。

int cvIsNan( double x ); // return 1 if x is IEEE754 "Not a number"

2.24 cvRound()

  返回跟参数最接近的整数值,即四舍五入;

2.25 cvCeil()

  返回跟参数最接近的整数值,即四舍五入;

2.26 cvFloor()

  返回不大于参数的最大整数值,即向下取整;

#include <opencv2/opencv.hpp>
#include <iostream>
using namespace cv;
using namespace std;
/*cvRound():返回跟参数最接近的整数值,即四舍五入;cvFloor()  :返回不大于参数的最大整数值,即向下取整;cvCeil():返回不小于参数的最小整数值,即向上取整;
*/
int main()
{cout << "cvRound(2.5) : " << cvRound(2.5) << endl;cout << "cvFloor(2.5) : " << cvFloor(2.5) << endl;cout << "cvCeil(2.5)  : " << cvCeil(2.5)  << endl;cout << "cvRound(2.5) : " << cvRound(2.5) << endl;cout << "cvFloor(2.5) : " << cvFloor(2.5) << endl;cout << "cvCeil(2.5)  : " << cvCeil(2.5)  << endl;waitKey(0);return 0;
}

3.参考链接

  1.OpenCV的数据类型
  2.Opencv的点点滴滴
  3.辅助对象
  4.OpenCV中事半功倍的工具函数
  5.Opencv数据类型1
  6.OpenMP教程
  7.C++ 中 OpenMP 的基本使用方法和注意事项

http://www.dtcms.com/a/473539.html

相关文章:

  • Serdes专题(3)Lattice Serdes架构
  • 人形机器人项目中使用Ubuntu-Server安装桌面系统进行远程xrdp远程连接操作
  • 京东开源了一款大模型安全框架:JoySafety,说是京东内部已应用,实现95%+攻击拦截率
  • 【传奇开心果系列】基于Flet框架实现的关于页面创建和提供文件下载集成了网络请求、文件下载、剪贴板操作功能自定义模板特色和实现原理深度解析
  • ​为什么我们需要将Flow转换为StateFlow?​​
  • vscode远程连接云服务器的初次尝试
  • 甘肃网站开发公司用手机怎么做免费网站
  • 网站是由多个网页组成的吗济南网约车平台
  • Linux系统下的终端,会话,shell,bash,进程组这几个概念的关系。
  • 微信小程序入门学习教程,从入门到精通,自定义组件与第三方 UI 组件库(以 Vant Weapp 为例) (16)
  • 银河麒麟V10高级服务器版Bash快捷键经常失效
  • 建设网站平台需要什么硬件配置电脑上买wordpress
  • Jessibuca 播放器
  • minio之docker的单机版安装
  • 主流 AI IDE 之一的 Qoder 和 Lingma IDE 介绍
  • 搜索不到网站的关键词国家企业信用公示系统官网查询
  • PostgreSQL在Linux中的部署和安装教程
  • AI大事记12:Transformer 架构——重塑 NLP 的革命性技术(上)
  • PostgreSQL JDBC 连接参数大全
  • 【SpringBoot从初学者到专家的成长11】Spring Boot中的application.properties与application.yml详解
  • 简述你对于网站建设的认识h5微网站开发
  • OpenHarmony IMF输入法框架全解析:从原理到自定义输入法开发实战指南
  • LabVIEW的PID控制器带报警仿真系统
  • WordPress--代码块添加折叠和展开功能
  • 爱站网能不能挖掘关键词做网站Linux
  • 在单台电脑上管理多个 GitHub 账户并解决推送问题
  • 计算机毕设选题推荐:基于Hadoop和Python的游戏销售大数据可视化分析系统
  • kanass入门到实战(17) - 如何进行工时管理,有效度量项目资源
  • 汽车角雷达波形设计与速度模糊解决方法研究——论文阅读
  • Node.js+Prisma性能优化:分页查询与事务处理实战