OpenCV(多功能开源计算机视觉库)
v4.5.0 免费版- 软件大小:209.85 MB
- 更新日期:2020-12-11 17:09
- 软件语言:简体中文
- 软件类别:编程工具
- 软件授权:免费版
- 软件官网:待审核
- 适用平台:WinXP, Win7, Win8, Win10, WinAll
- 软件厂商:
软件介绍 人气软件 下载地址
OpenCV是一款多功能开源计算机视觉库,它是在BSD许可下发布的,因此它是免费的,可用于学术和商业用途,它具有C++,Python和Java接口,并支持Windows,Linux,macOS,iOS和Android;它旨在提高计算效率,并且非常注重实时应用;该库以优化的C/C++语言编写,可以利用多核处理的优势;通过OpenCL启用,它可以利用底层异构计算平台的硬件加速功能;OpenCV在全球范围内被采用拥有超过4.7万用户社区,估计下载量超过1400万,使用范围从交互式艺术到地雷检查,在网上缝合地图或通过高级机器人进行;开源计算机视觉库是一个开源计算机视觉和机器学习软件库,它的构建旨在为计算机视觉应用提供通用的基础结构,并加速在商业产品中使用机器感知;作为BSD许可产品,它使企业可以轻松使用和修改代码;
新版功能
DNN模块的进一步改进包括更快的R-CNN支持,JavaScript绑定和OpenCL实施的加速。
我们已经为预编译的OpenCL内核二进制文件实现了磁盘缓存和手动加载
它可以大大减少许多应用程序的初始化时间
并允许在没有JIT编译器的嵌入式平台上运行OpenCL实现。
已经实现了另一种位精确算法。
新的8位双线性调整大小将为跨各种平台的复杂计算机视觉管道奠定稳定的基础。
集成了另一个GSoC项目
它增加了新的背景扣除算法的实现。
自OpenCV 3.3.1以来,已合并约250个补丁,并且已解决200多个问题
软件功能
OpenCV(开源计算机视觉库)是BSD许可的开源库,其中包含数百种计算机视觉算法。
该文档描述了所谓的OpenCV 2.x API,它本质上是C ++ API,与基于C的OpenCV 1.x API相反。
后者在opencv1x.pdf中进行了描述。
OpenCV具有模块化结构,这意味着该程序包包含多个共享库或静态库。提供以下模块:
核心功能-定义基本数据结构的紧凑模块,包括密集的多维数组Mat和所有其他模块使用的基本功能。
图像处理-一种图像处理模块,包括线性和非线性图像过滤,几何图像转换,色彩空间转换,直方图等。
调整大小,仿射和透视变形,基于表的通用重映射
视频-视频分析模块,其中包括运动估计,背景减法和对象跟踪算法。
calib3d-基本的多视图几何算法,单镜头和立体相机校准,对象姿态估计,立体对应算法以及3D重构元素。
features2d-显着特征检测器,描述符和描述符匹配器。
objdetect-检测对象和预定义类的实例(例如,面孔,眼睛,杯子,人,汽车等)。
highgui-简单的UI功能的易于使用的界面。
视频I / O-一个易于使用的界面,用于视频捕获和视频编解码器。
gpu-来自不同OpenCV模块的GPU加速算法。
其他一些帮助器模块,例如FLANN和Google测试包装器,Python绑定等。
软件特色
该库具有2500多种优化算法,其中包括一整套经典和最新的计算机视觉和机器学习算法。
这些算法可用于检测和识别人脸,识别物体,对视频中的人为动作进行分类,跟踪摄像机的运动,跟踪运动的物体
提取物体的3D模型,从立体相机产生3D点云,将图像拼接在一起以产生高整个场景的分辨率图像
从图像数据库中查找相似的图像,从使用闪光灯拍摄的图像中消除红眼
跟随眼睛的移动,识别风景并建立标记以将其与增强现实叠加在一起等。
它拥有超过4.7万用户社区,估计下载量超过1400万。
该库在公司,研究小组和政府机构中得到广泛使用。
Open CV具有C ++,Python,Java和MATLAB接口,并支持Windows,Linux,Android和macOS。
它主要倾向于实时视觉应用,并在可用时利用MMX和SSE指令。
目前正在积极开发功能齐全的CUDA和OpenCL接口。
有500多种算法,而构成或支持这些算法的功能大约是其10倍。
Open CV用C ++本机编写,并具有可与STL容器无缝配合的模板化接口。
使用说明
API概念
cv命名空间
所有OpenCV类和函数都放置在cv名称空间中。
因此,要从您的代码访问此功能,请使用cv ::说明符或使用名称空间cv;。指示:
#include“ opencv2 / core.hpp”
cv :: Mat H = cv :: findHomography(points1,points2,CV_RANSAC,5);
要么 :#include“ opencv2 / core.hpp”
使用命名空间cv;
Mat H = findHomography(points1,points2,CV_RANSAC,5);
当前或将来的某些OpenCV外部名称可能与STL或其他库冲突。
在这种情况下,请使用显式名称空间说明符来解决名称冲突:
垫a(100,100,CV_32F);
randu(a,标量:: all(1),标量:: all(std :: rand()));
cv :: log(a,a);
/ = std :: log(2。);
自动内存管理
OpenCV自动处理所有内存。
首先,函数和方法使用的std :: vector,Mat和其他数据结构具有析构函数
这些析构函数可以在需要时释放基础内存缓冲区。
这意味着析构函数并不总是像Mat一样总是释放缓冲区。
它们考虑了可能的数据共享。析构函数递减与矩阵数据缓冲区关联的参考计数器。
当且仅当参考计数器达到零时,即没有其他结构引用同一缓冲区时,才释放缓冲区。
类似地,当复制Mat实例时,不会真正复制任何实际数据。
取而代之的是,增加参考计数器以记住相同数据的另一个所有者。
还有Mat :: clone方法可创建矩阵数据的完整副本。请参阅以下示例:
//创建一个大的8Mb矩阵
垫A(1000,1000,CV_64F);
//为同一矩阵创建另一个标头;
//这是即时操作,与矩阵大小无关。
垫B = A;
//为A的第3行创建另一个标题;也没有数据被复制
Mat C = B.row(3);
//现在创建矩阵的单独副本
Mat D = B.clone();
//将B的第5行复制到C,即复制A的第5行
//到A的第3行。
B.row(5).copyTo(C);
//现在让A和D共享数据;之后,修改版本
//仍然由B和C引用。
A = D;
//现在使B为空矩阵(不引用任何内存缓冲区),
//,但A的修改版本仍将由C引用,
//尽管C只是原始A的一行
B.release();
//最后,制作C的完整副本。
//矩阵将被释放,因为任何人都不会引用它
C = C.clone();
您会看到Mat和其他基本结构的使用很简单。
但是在不考虑自动内存管理的情况下创建的高级类甚至用户数据类型呢
对于他们,OpenCV提供了Ptr模板类,该类类似于C ++ 11中的std :: shared_ptr。
因此,不要使用普通的指针:
T * ptr =新的T(...);
您可以使用:
Ptr ptr(new T(...));
要么:
Ptr ptr = makePtr (...);
Ptr < T >封装了指向T实例的指针和与该指针关联的参考计数器。有关详细信息,请参见Ptr描述。
自动分配输出数据
OpenCV在大多数情况下会自动取消分配内存,并自动为输出功能参数分配内存。
因此,如果一个函数具有一个或多个输入数组(cv :: Mat实例)和一些输出数组,则将自动分配或重新分配输出数组。
输出数组的大小和类型由输入数组的大小和类型确定。
如果需要,函数可以使用额外的参数来帮助确定输出数组的属性。
>>运算符会自动分配数组帧,因为视频捕获模块知道视频帧的分辨率和位深度。
数组边缘由cvtColor函数自动分配。它具有与输入数组相同的大小和位深度。
通道数为1,因为传递了颜色转换代码COLOR_BGR2GRAY,这意味着从颜色到灰度转换。
注意,在循环主体的第一次执行期间,帧和边缘仅分配一次,因为所有接下来的视频帧都具有相同的分辨率。
如果您以某种方式更改视频分辨率,则会自动重新分配阵列。
该技术的关键组件是Mat :: create方法。它采用所需的数组大小和类型。
如果数组已经具有指定的大小和类型,则该方法不执行任何操作。
否则,它将释放先前分配的数据(如果有的话)(此部分涉及递减参考计数器并将其与零进行比较)
然后分配所需大小的新缓冲区。
大多数函数为每个输出数组调用Mat :: create方法,因此实现了自动输出数据分配。
该方案的一些显着例外是cv :: mixChannels,cv RNG fill和其他一些函数和方法。
他们无法分配输出数组,因此您必须提前执行此操作。
饱和算术
作为计算机视觉库,OpenCV处理大量图像像素,这些图像像素通常以紧凑的
每通道8位或16位的形式编码,因此值范围有限。
此外,对图像的某些操作(例如颜色空间转换,亮度/对比度调整,锐化,复杂插值可能会产生超出可用范围的值。
如果仅存储结果的最低8(16)位,则会导致视觉伪影,并可能影响进一步的图像分析。
为了解决这个问题,使用了所谓的饱和算法。
例如,要将运算结果r存储到8位图像中,您会找到0..255范围内的最接近值:
I(x,y)=min(max(round(r),0),255)
类似的规则适用于8位有符号,16位有符号和无符号类型。
该语义在库中的任何地方都被使用。在C ++代码中
使用类似于标准C ++强制转换操作的saturate_cast <>函数完成此操作。参见下面上面提供的公式的实现:
I.at (y,x)=饱和播放(r);
其中cv :: uchar是OpenCV 8位无符号整数类型。
在优化的SIMD代码中,使用了SSE2指令,例如paddusb,packuswb等。它们有助于实现与C ++代码完全相同的行为。
注意
当结果为32位整数时,不应用饱和度。
固定像素类型。模板使用受限
模板是C ++的一项重要功能,可实现非常强大,高效且安全的数据结构和算法。
但是,广泛使用模板可能会大大增加编译时间和代码大小。
此外,当专门使用模板时,很难将接口和实现分开。
这对于基本算法可能很好,但对于其中单个算法可能跨越数千行代码的计算机视觉库来说则不好。
因此,为了简化针对完全不具有模板或模板功能有限的其他语言(如Python,Java,Matlab)的绑定开发
当前的OpenCV实现基于多态和基于模板的运行时调度。
在运行时调度太慢的地方(例如像素访问运算符)
不可能(通用Ptr <>实现)或非常不方便(saturate_cast <>()),当前实现引入了小的模板类,方法和函数。
当前OpenCV版本中的其他任何地方,模板的使用都受到限制。
因此,库可以使用的固定有限的原始数据类型集。也就是说,数组元素应具有以下类型之一:
8位无符号整数(uchar)
8位有符号整数(schar)
16位无符号整数(ushort)
16位有符号整数(短整数)
32位有符号整数(int)
32位浮点数(float)
64位浮点数(双精度)
由几个元素组成的元组,其中所有元素都具有相同的类型(上述之一)。
其元素为此类元组的数组称为多通道数组,与其元素为标量值的单通道数组相反。
通道的最大可能数目由CV_CN_MAX常数定义,该常数当前设置为512。
对于这些基本类型,将应用以下枚举:
枚举{CV_8U = 0,CV_8S = 1,CV_16U = 2,CV_16S = 3,CV_32S = 4,CV_32F = 5,CV_64F = 6};
可以使用以下选项指定多通道(n通道)类型:
CV_8UC1 ... CV_64FC4常量(用于从1到4的多个通道)
当通道数大于4或在编译时未知时,CV_8UC(n) ... CV_64FC(n)或CV_MAKETYPE(CV_8U,n) ... CV_MAKETYPE(CV_64F,n)宏。
注意
CV_32FC1 == CV_32F, CV_32FC2 == CV_32FC(2) == CV_MAKETYPE(CV_32F, 2)和CV_MAKETYPE(depth, n) == ((depth&7) + ((n-1)<<3)`。
这意味着常量类型是由深度(最低的3位)和通道数减去1(接下来的log2(CV_CN_MAX)`位)形成的。
例子:
Mat mtx(3,3,CV_32F); //制作3x3浮点矩阵
垫cmtx(10,1,CV_64FC2); //制作10x1 2通道浮点数
//矩阵(10个元素的复数向量)
Mat img(大小(1920,1080),CV_8UC3); //制作3通道(彩色)图像
// 1920列和1080行。
垫灰度(image.size(),CV_MAKETYPE(image.depth(),1)); //制作一个1通道的图像
//大小相同且相同
//频道类型为img
具有更复杂元素的数组不能使用OpenCV构造或处理。此外,每个函数或方法只能处理所有可能的数组类型的子集。通常,算法越复杂,支持的格式子集越小。请参见以下此类限制的典型示例:
人脸检测算法仅适用于8位灰度或彩色图像。
线性代数函数和大多数机器学习算法仅适用于浮点数组。
基本功能,例如cv :: add,支持所有类型。
色彩空间转换功能支持8位无符号,16位无符号和32位浮点类型。
每个功能支持的类型的子集都是根据实际需要定义的,将来可以根据用户要求进行扩展。
InputArray和OutputArray
许多OpenCV函数处理密集的二维或多维数字数组。
通常,此类函数将cppMat作为参数,但是在某些情况下,使用std :: vector <>(例如用于点集)或Matx <>(用于3x3单应矩阵等)会更方便。
为了避免API中的许多重复项,引入了特殊的“代理”类。基本的“代理”类是InputArray。
它用于在函数输入上传递只读数组。从InputArray类OutputArray派生的用于指定函数的输出数组。
通常,您无需关心这些中间类型(也不应显式声明这些类型的变量),它们都将自动运行。
您可以假设可以始终使用Mat,std :: vector <>代替InputArray / OutputArray,Matx <>,Vec <>或标量。
当一个函数具有可选的输入或输出数组,而您没有或不希望使用一个数组时,请传递cv :: noArray()。
错误处理
OpenCV使用异常来表示严重错误。
当输入数据具有正确的格式并属于指定的值范围时
但是由于某种原因该算法无法成功(例如,优化算法未收敛)
它将返回一个特殊的错误代码(通常只是一个布尔变量) 。
异常可以是cv :: Exception类或其派生类的实例。反过来,cv :: Exception是std :: exception的派生。因此,可以使用其他标准C ++库组件在代码中优雅地对其进行处理。
该异常通常抛出要么使用CV_Error(ERRCODE,说明)宏或它的类printf CV_Error
(ERRCODE,printf的规格,(printf的-参数))变体,或使用CV_Assert(条件)宏检查条件和不满意时引发异常。
对于性能至关重要的代码,有CV_DbgAssert(condition)仅保留在Debug配置中。
由于具有自动内存管理功能,因此在发生突然错误时,所有中间缓冲区都将自动释放。
您只需要添加一条try语句即可捕获异常:
尝试
... //调用OpenCV
catch(cv :: Exception&e)
const char * err_msg = e.what();
std :: cout <<“被捕获的异常:” << err_msg << std :: endl;
多线程和可重入性
当前的OpenCV实施完全可以重新输入。
也就是说,相同的功能,相同的恒定一个类的实例的方法,或相同的非恒定的不同的类的实例的方法可以在不同的线程中调用。
同样,相同的cv :: Mat可以在不同的线程中使用,因为引用计数操作使用特定于体系结构的原子指令。
人气软件
-
redis desktop manager2020.1中文 32.52 MB
/简体中文 -
s7 200 smart编程软件 187 MB
/简体中文 -
GX Works 2(三菱PLC编程软件) 487 MB
/简体中文 -
CIMCO Edit V8中文 248 MB
/简体中文 -
JetBrains DataGrip 353 MB
/英文 -
Dev C++下载 (TDM-GCC) 83.52 MB
/简体中文 -
TouchWin编辑工具(信捷触摸屏编程软件) 55.69 MB
/简体中文 -
信捷PLC编程工具软件 14.4 MB
/简体中文 -
TLauncher(Minecraft游戏启动器) 16.95 MB
/英文 -
Ardublock中文版(Arduino图形化编程软件) 2.65 MB
/简体中文