OpenCV的数据类型二

文章目录

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

前言

1.帮助类

1.1 cv::TermCriteria类

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

默认构造和有参构造

cpp 复制代码
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 应用举例

cpp 复制代码
//构造函数
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。

cpp 复制代码
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包裹想要创建的指针类型,例如:

cpp 复制代码
cv::Ptr<Matx33f> p(new cv::Matx33f);
cv::Ptr<Matx33f> p = makePtr<cv::Matx33f>();
函数 说明
cv::Ptr::addref() 增加指针内部的引用计数
cv::Ptr::release() 减少指针内部的引用计数
cv::Ptr::empty() 确定一个智能指针是否指向一个已经被释放掉的对象
cpp 复制代码
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​定义​:

cpp 复制代码
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.工具函数包含数学操作、测试、错误生产、内存与线程处理、优化及其他的工具。

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

2.1 cv::alignPtr()

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

cpp 复制代码
template<typename _Tp> static inline _Tp* alignPtr(_Tp* ptr, int n=(int)sizeof(_Tp))

其中ptr为传递的原内存地址, n为按照需要的字节数对齐,默认情况下是按照指针的类型进行对齐

函数返回值为对齐后的指针地址。其函数实现比较简单

csharp 复制代码
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 2
    return (_Tp*)(((size_t)ptr + n-1) & -n);

}

2.1.1 学习链接

Opencv辅助函数

2.2 cv::alignSize()

cpp 复制代码
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的数。计算使用了下面的公式:

cpp 复制代码
(sz + n-1) & -n

2.3 cv::allocate()

cpp 复制代码
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()

cpp 复制代码
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()

cpp 复制代码
void* cv::fastMalloc( // Pointer to allocated buffer
        size_t size // Size of buffer to allocate
);

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

2.6 cv::fastMalloc()

cpp 复制代码
void cv::fastFree(
    void* ptr // Pointer to buffer to be freed
);

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

2.7 cv::cubeRoot()

cpp 复制代码
float cv::cubeRoot( // Return value is 32-bit float
            float x // input value (32-bit float)
);

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

2.8 cv::CV_Assert()

cpp 复制代码
// example
CV_Assert( x!=0 )

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

cpp 复制代码
#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()

cpp 复制代码
float cv::fastAtan2( // Return value is 32-bit float
            float 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()

cpp 复制代码
string cv::format( // Return STL-string
    const char* fmt, // formatting string, as sprintf()
    ... // vargs, as sprintf()
);

1.这个函数本质上与标准库中的sprintf()相同,但是,它不需要从访问者中获得一个字符缓存区,而是构建一个STL字符串并返回它。

2.它对Exception()构造函数格式化错误信息很有用。

2.11 cv::getCPUTickCount()

cpp 复制代码
int64 cv::getCPUTickCount( void ); // long int CPU for tick count

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

2.12 cv::getNumThreads()

cpp 复制代码
int cv::getNumThreads( void ); // total threads allocated to OpenCV

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

2.13 cv::setNumThreads()

cpp 复制代码
void cv::setNumThreads( int nthreads ); // Set number of threads OpenCV can use

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

2.14 cv::getThreadNum()

cpp 复制代码
int cv::getThreadNum( void ); // int, id of this particular thread

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

2.15 cv::getOptimalDFTSize()

cpp 复制代码
int cv::getOptimalDFTSize( int n ); // best size array to use for dft, >= n

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

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

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

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

cpp 复制代码
#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()

cpp 复制代码
double cv::getTickFrequency( void ); // Tick frequency in seconds as 64-bit

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

2.18 cv::setUseOptimized()

cpp 复制代码
void cv::setUseOptimized( bool on_off ); // If false, turn off optimized routines

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

2.19 cv::useOptimized()

cpp 复制代码
bool cv::useOptimized( void ); // return true if optimizations are enabled

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

2.20 CV_Error() & CV_Error_()

cpp 复制代码
// example
CV_Error( ecode, estring )
CV_Error_( ecode, fmt, ... )

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

2.21 cv::error()

cpp 复制代码
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。

cpp 复制代码
int cvIsInf(double x);

2.23 cvIsNaN()

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

cpp 复制代码
int cvIsNan( double x ); // return 1 if x is IEEE754 "Not a number"

2.24 cvRound()

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

2.25 cvCeil()

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

2.26 cvFloor()

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

cpp 复制代码
#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 的基本使用方法和注意事项

相关推荐
JANGHIGH16 小时前
YOLO系列——OpenCV DNN模块在YOLOv11检测物体时输出的边界框坐标问题
opencv·yolo·dnn
云青黛16 小时前
轮廓系数(一个异型簇的分类标准)
人工智能·算法·机器学习
isyoungboy16 小时前
PIL与OpenCV双线性插值实现差异导致模型精度不够踩坑
人工智能·opencv·计算机视觉
云青黛16 小时前
肘部法找k
人工智能·算法·机器学习·聚类
IT_陈寒16 小时前
Java性能调优:从GC日志分析到实战优化的5个关键技巧,让你的应用快如闪电!
前端·人工智能·后端
Hs_QY_FX16 小时前
Python 分类模型评估:从理论到实战(以信用卡欺诈检测为例)
人工智能·python·机器学习·数据挖掘·多分类评估
Aspect of twilight17 小时前
3D Gaussian Splatting论文简要解读与可视化复现(基于gsplat)
人工智能·深度学习·gsplat
deephub17 小时前
REFRAG技术详解:如何通过压缩让RAG处理速度提升30倍
人工智能·python·大语言模型·rag
Dongsheng_201917 小时前
【泛3C篇】AI深度学习在手机背板外观缺陷检测应用方案
图像处理·人工智能·计算机视觉·视觉检测·边缘计算
AI360labs_atyun17 小时前
AI教育开启新篇章
人工智能·百度·ai