iis服务器助手广告广告
返回顶部
首页 > 资讯 > 操作系统 >OpenCV简介
  • 317
分享到

OpenCV简介

opencv人工智能计算机视觉 2023-08-30 10:08:40 317人浏览 安东尼
摘要

OpenCV简介 OpenCV(开源计算机视觉库:Http://opencv.org)是一个开源库,包含数百种计算机视觉算法。OpenCV 具有模块化结构,主要包括下列模块: 核心功能(core) - 定义基本数据结构的紧凑模块,包括密集多

OpenCV简介

OpenCV(开源计算机视觉库:Http://opencv.org)是一个开源库,包含数百种计算机视觉算法。OpenCV 具有模块化结构,主要包括下列模块:

  • 核心功能(core) - 定义基本数据结构的紧凑模块,包括密集多维数组 Mat 和所有其他模块使用的基本函数。
  • 图像处理( imgproc) - 图像处理模块,包括线性和非线性图像过滤、几何图像变换(调整大小、仿射和透视变形、基于通用表的重新映射)、颜色空间转换、直方图等。
  • 视频分析( video ) - 视频分析模块,包括运动估计、背景扣除和对象跟踪算法。
  • 相机校准和 3D 重建( calib3d ) -基本多视图几何算法、单立体相机校准、物体姿态估计、立体对应算法和 3D 重建元素。
  • 2D 特征框架( features2d ) -显着特征检测器、描述符和描述符匹配器。
  • 对象检测( objdetect ) -检测预定义类的对象和实例(例如,面部、眼睛、杯子、人、汽车等)。
  • 高级 GUI ( highgui ) - 一个易于使用的界面,具有简单的UI 功能。
  • 视频 I/O ( videoio ) - 一个易于使用的视频捕获和视频编解码器接口。
  • …一些其他帮助模块,例如 FLANN 和 Google 测试包装器、python 绑定等。

当前的 OpenCV 实现是完全可重新输入的。也就是说,不同类实例的相同函数或相同方法可以从不同线程调用。此外,相同的 Mat 可以在不同的线程中使用,因为引用计数操作使用特定于体系结构的原子指令

api概念

命名空间

opencv 的所有类和函数都存放在 cv 命名空间中。因此,要引用 opencv 的代码,需要增加作用域运算符 cv::,在项目开发中,建议不用使用 using namespace cv 定义作用域范围,可能会引起某些的冲突。jpg是一个有损压缩算法,在平时使用时尽量避免使用。

自动内存管理

OpenCV的内存管理机制类似 Shared_ptr, Mat 对象只有当引用计数为 0,其内存空间才会真正得销毁,当一个 Mat 实例被拷贝时,内存并不会真正的发生复制行为,而是将改对象的引用计数增加 1, 可以使用 cv::Mat::clone 进行实际 “全复制”。

// create a big 8Mb matrixMat A(1000, 1000, CV_64F);// create another header for the same matrix;// this is an instant operation, regardless of the matrix size.Mat B = A;// create another header for the 3-rd row of A; no data is copied eitherMat C = B.row(3);// now create a separate copy of the matrixMat D = B.clone();// copy the 5-th row of B to C, that is, copy the 5-th row of A// to the 3-rd row of A.B.row(5).copyTo(C);// now let A and D share the data; after that the modified version// of A is still referenced by B and C.A = D;// now make B an empty matrix (which references no memory buffers),// but the modified version of A will still be referenced by C,// despite that C is just a single row of the original AB.release();// finally, make a full copy of C. As a result, the big modified// matrix will be deallocated, since it is not referenced by anyoneC = C.clone();

对于用户自定义的数据类型,opencv 提供了 cv:Ptr 进行管理,其机制和刚刚的描述一致。

# 普通指针定义T* ptr = new T(....); # opencv 提供的管理方式cv::Ptr prt(new T(...));cv::Ptr ptr = cv::makePtr<T>(...);

Ptr封装了一个 T 实例的指针和该指针引用计数器,更多的细节在 cv::Ptr 。

对输出数据自动分配内存

opencv可以为输出数据类型自动 分配 和 重分配 内存,其 size 和 type 取决于输入数据的 size 和 type。同时,可为输出数据指定额外的参数。

#include "opencv2/imgproc.hpp"#include "opencv2/highgui.hpp"using namespace cv;int main(int, char**){ VideoCapture cap(0); if(!cap.isOpened()) return -1; Mat frame, edges; namedWindow("edges", WINDOW_AUTOSIZE); for(;;) { cap >> frame; cvtColor(frame, edges, COLOR_BGR2GRAY); GaussianBlur(edges, edges, Size(7,7), 1.5, 1.5); Canny(edges, edges, 0, 30, 3); imshow("edges", edges); if(waiTKEy(30) >= 0) break; } return 0;}

上面的代码通过输出重定向符 >> 自动为 frame 实例分配内存,因为视频的视频的帧分辨率和位深已通过 video capturing module处理并获知。 edges 的内存被函数 cvtColor 函数自动分配,它和输入具有相同的 size 和 bit-depth。通道数经过 cv::COLOR_BGR2GRAY处理并设为1(彩色图变为灰度图)。frame 和 edges 在第一次执行时分配内存并具有相同的帧分辨率,当分辨率改变时,frame 和 edges 的内存会被自动的重新分配。

该技术的关键组件是 cv::Mat::create 方法。如果数组已经具有指定的大小和类型,则该方法不执行任何操作。否则,它释放先前分配的数据(如果有)(这部分涉及递减引用计数器并将其与零进行比较,释放掉无用的内存),然后分配所需大小的新缓冲区。

某些例如的函数需要注意,例如 cv::mixChannels, cv::RNG::fill等,他们不能分配输出数据,我们不得不手动执行。

饱和度算法

这一节主要想介绍OpenCV的存储方式,以及可能产生的错误。因为opencv对像素的存储是以紧凑的、每通道 8 位或 16 位的形式进行编码,值的范围非常有限,对图像的某些处理(如色彩空间转换、亮度/对比度调整、锐化、复杂插值(双三次、Lanczos))很可能产生超出可用范围的值,这样就会产生图像伪影。为了解决这个问题,需要使用饱和度算法。例如,存储变量或计算结果(r)到一个8位图像时,使用下列公式,找到在0-255范围内最接近的值:
f ( x , y ) = m i n ( m a x ( r o u n d ( r ) , 0 ) , 255 ) f(x,y) = min(max(round(r), 0), 255) f(x,y)=min(max(round(r),0),255)
这个函数在opencv的库中已经做了实现:

I.at<uchar>(y,x)=saturate_cast<uchar>(r);

其中,cv::uchar 代表8位无符号整形
在这里插入图片描述
右图出现了视觉伪影

OpenCV的模板使用受限

模板如果广泛使用会增加编译时间和代码大小,单独使用模板也很难将接口和实现分开。对于opencv视觉库来说,如果使用模板可能某个算法会跨越上千行代码。OpenCV实现了基于多态性和模板上的运行时调度,以简化和其他语言的绑定开发。OpenCV在运行时调度太慢的地方(像素访问运算符),在某些不使用模板不能实现(cv:Ptr<>)、或不易于实现的地方(cv::saturate_cast<>)引入了模板类、方法、和函数。

opencv可以操作的数据类型有限。也就是说,数组元素应该具有以下类型之一:

  • 8 位无符号整数 (uchar)
  • 8 位有符号整数 (schar)
  • 16 位无符号整数 (ushort)
  • 16 位有符号整数(短)
  • 32 位有符号整数 (int)
  • 32位浮点数(float)
  • 64 位浮点数(双精度)
  • 由多个元素组成的元组,其中所有元素都具有相同的类型(上述类型之一)。其元素为此类元组的数组称为多通道数组,与元素为标量值的单通道数组相反。最大可能的通道数由CV_CN_MAX常量定义,当前设置为 512。

可以使用以下选项指定多通道(n 通道)类型:

  • CV_8UC1 … CV_64FC4常量(通道数1-4)
  • CV_8UC(n) … CV_64FC(n) or CV_MAKETYPE(CV_8U, n) … CV_MAKETYPE(CV_64F, n) 通道数大于4或未知时的语法

Note:
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)位)构成。

# 3x3的浮点数单通道矩阵Mat mat(3,3,CV_32F) # 10x1的浮点数双通道矩阵Mat cmatx(10,1,CV_64FC2) # 3通道图像Mat img(Size(1920, 1080), CV_8UC3) #单通道图像,和img的大小、通道数据类型相同Mat grayscale(img.size(), CV_MAKETYPE(img.depth(), 1));

输入输出数组

在某些情况下,使用std::vector<>(例如,对于点集)或cv::Matx<>(对于 3x3 单应性矩阵等)更方便。为了避免 API 中出现许多重复,引入了特殊的“代理”类。基本“代理”类是cv::InputArray。它用于在函数输入上传递只读数组。派生自InputArray类cv::OutputArray用于指定函数的输出数组。通常,您不应该关心那些中间类型(并且您不应该显式声明这些类型的变量),它都会自动工作。您可以假设您始终可以使用cv::Mat、std::vector<>、cv::Matx<>或来代替 InputArray cv::Vec<>/ OutputArray cv::Scalar。当函数具有可选的输入或输出数组,而您没有或不需要时,请传递cv::noArray()。

InputArray可以接受以下类型的输入数据:

  1. cv::Mat:用于表示图像或矩阵数据。
  2. std::vector:用于表示标准c++ STL容器的数据,如std::vectorcv::Point,std::vectorcv::Vec3f等。
  3. 数组:可以接受指向数据的指针和数据的大小。
  4. cv::InputArrayOfArrays:用于表示多个InputArray的数组,用于处理多通道数据或多个数据块。
  5. cv::cuda::GpuMat:用于表示GPU上的图像或矩阵数据(仅适用于使用OpenCV的CUDA模块)。
void processImage(cv::InputArray input) {    cv::Mat image = input.getMat(); // 获取输入图像的Mat对象    // 进行图像处理操作}

在调用processImage函数时,可以传递图像、矩阵或其他支持的数据类型作为参数,OpenCV会自动处理它们,并将其转换为相应的cv::Mat对象,方便你进行图像处理操作。使用InputArray可以使函数接受更加灵活的输入数据类型,增加代码的可重用性和可扩展性。

错误处理

OpenCV 使用异常来表示严重错误。当输入数据具有正确的格式并且属于指定的值范围,但由于某种原因算法无法成功(例如优化算法没有收敛)时,它返回一个特殊的错误代码(通常只是一个布尔变量)。OpenCV 使用异常来表示严重错误。当输入数据具有正确的格式并且属于指定的值范围,但由于某种原因算法无法成功(例如优化算法没有收敛)时,它返回一个特殊的错误代码(通常只是一个布尔变量)。

通常使用CV_Error(errcode, description)宏或其类似 printf 的CV_Error_(errcode, (printf-spec, printf-args))变体或使用CV_Assert(condition)宏来抛出异常,该宏检查条件并在不满足时抛出异常。对于性能关键型代码,CV_DbgAssert(condition)仅保留在调试配置中。由于自动内存管理,如果突然发生错误,所有中间缓冲区都会自动释放。如果需要,您只需要添加一条 try 语句来捕获异常:

try{ ... // call OpenCV}catch (const cv::Exception& e){ const char* err_msg = e.what(); std::cout << "exception caught: " << err_msg << std::endl;}

来源地址:https://blog.csdn.net/qq_35227495/article/details/132518035

--结束END--

本文标题: OpenCV简介

本文链接: https://www.lsjlt.com/news/382516.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • OpenCV简介
    OpenCV简介 OpenCV(开源计算机视觉库:http://opencv.org)是一个开源库,包含数百种计算机视觉算法。OpenCV 具有模块化结构,主要包括下列模块: 核心功能(core) - 定义基本数据结构的紧凑模块,包括密集多...
    99+
    2023-08-30
    opencv 人工智能 计算机视觉
  • MongoDB(一):NoSQL简介、MongoDB简介
    1. NoSQL简介 1.1 什么是NoSQL NoSQL(NoSQL= Not Only SQL),意即“不仅仅是SQL",是一项全新的数据库理念,泛指非关系型的数据库。 1.2 为什么需要NoSQL 随着互联网web2.0网站的兴起,非...
    99+
    2019-07-31
    MongoDB(一):NoSQL简介 MongoDB简介
  • Python~~简介介绍
    Python (英国发音:/paθn/ 美国发音:/paθɑn/), 是一种面向对象的解释型计算机程序设计语言,由荷兰人Guido van Rossum于1989年发明,第一个公开发行版发行于...
    99+
    2022-10-18
  • Nginx简介
    一、什么是Nginx Nginx是一个高性能的HTTP和反向代理Web服务器,同时也提供IMAP/POP3/SMTP服务。Nginx是一款轻量级的Web服务器/反向代理服务器及电子邮件(IMAP/POP3/SMTP)代理服务器。Nginx...
    99+
    2023-10-11
    nginx 服务器 运维 Powered by 金山文档
  • IPv6简介
    IPv6仅仅只是“长”吗?IPv6的地址长什么样?平时我们是怎么使用IPv6的呢?编写网络程序的时候要怎么处理IPv6?且待本篇一一道来。 为什么需要IPv6 全球的IP地址由一个名字叫IANA(Internet Assigned Num...
    99+
    2023-01-31
    简介
  • python简介
    Python是一种开源的面向对象编程语言随着人工智能与大数据分析的火热,python也随之火热起来Python应用广泛,特别适用以下几个方面1.系统编程:提供API(Application Programming Interface,应用程...
    99+
    2023-01-30
    简介 python
  • DevOps简介
    DevOps 是一个完整的面向IT运维的工作流,以 IT 自动化以及持续集成(CI)、持续部署(CD)为基础,来优化程式开发、测试、系统运维等所有环节。     DevOps的概念 DevOps一词的来自于Development和Ope...
    99+
    2023-01-30
    简介 DevOps
  • Python 简介
    Python介绍与特点(自学python知识整理) Python 是一个高层次的结合了解释性、编译性、互动性和面向对象的脚本语言。 Python 的设计: Python 是一种解释型语言: 这意味着开发过程中没有了编译这个环节。类似于P...
    99+
    2023-01-31
    简介 Python
  • Ajax简介
    一、Ajax简介 Ajax 即“Asynchronous Javascript And XML”(异步 JavaScript 和 XML),是指⼀种创建交互式⽹⻚应⽤的⽹⻚开发技术。 Ajax 是⼀种⽤于创建快速动态⽹⻚的技术。 Aja...
    99+
    2023-09-02
    ajax javascript 服务器
  • argparse简介
    一、argparse简介 argparse 模块是 Python 内置的用于命令项选项与参数解析的模块,argparse 模块可以让人轻松编写用户友好的命令行接口,能够帮助程序员为模型定义参数。 ar...
    99+
    2023-09-01
    python
  • Elasticsearch简介
      疫情已经持续了好几个月了,作为程序员滴我们也帮不上什么忙,只有老老实实呆在家里或者出门一定戴口罩准守一些规则,不给国家添乱。不过最近疫情开始有所扭转,但是还是对国家经济,对企业业务造成了很大的影响,我也被停止了实习。接下来,可...
    99+
    2014-08-14
    Elasticsearch简介
  • Zookeeper简介
    1.1 什么是zookeeper Zookeeper是一个分布式的、开源的分布式应用程序协调服务,是Google的Chubby一个开源的实现,是Apache Hadoop的一个子项目,主要是用来解决分布式应用中经常遇到的一些数据...
    99+
    2017-07-20
    Zookeeper简介
  • Redis 简介
    Redis 特性     1.速度快       官方给出的数字是读写性能可以达到10万/秒,当然这也取决于机器的性能。大致归纳速度快的四点原因如下:             # Redis 的所有数据都是放在内存中的,这也是最主...
    99+
    2021-08-02
    Redis 简介
  • Cassandra 简介
    Cassandra是云原生和微服务化场景中最好的NoSQL数据库。我信了~  1. Cassandra是什么 高可用性和可扩展的分布式数据库 Apache Cassandra™是一个开源分布式数据,可提供当今最苛刻的应用程序所需...
    99+
    2015-01-20
    Cassandra 简介
  • kettle 简介
    描述 Kettle是一款开源的 ETL 工具,采用 JAVA 语言编写。 特性 高效稳定,支持多种类型的数据格式,如:MySQL,Oracle,PostGreSQL,CSV 等。 可视化设计。 概念 Transformation(转换):数...
    99+
    2015-03-30
    kettle 简介
  • Redis简介
    Redis官方网网站是:http://www.redis.io/ 。 Redis是一个开源,高级的键值存储和一个适用的解决方案,用于构建高性能,可扩展的Web应用程序。 Redis有三个主要特点,使它优越于...
    99+
    2022-06-04
    简介 Redis
  • Hive简介
    1.1  Hive简介 1.1.1 什么是Hive Hive是基于Hadoop的一个数据仓库工具,可以将结构化的数据文件映射为一张数据库表,并提供类SQL查询功能。 1.1.2 为什么使用Hive 直接使用hadoop所面临的问...
    99+
    2019-06-16
    Hive简介
  • HBase简介
    一、简介   HBase是基于列存储、构建在HDFS上的分布式存储系统,其主要功能是存储海量结构化数据。      HBase构建在HDFS之上,...
    99+
    2022-10-18
  • Django简介
    MVC与MTV模型MVCWeb服务器开发领域里著名的MVC模式,所谓MVC就是把Web应用分为模型(M),控制器(C)和视图(V)三层,他们之间以一种插件式的、松耦合的方式连接在一起,模型负责业务对象与数据库的映射(ORM),视图负责与用户...
    99+
    2023-01-30
    简介 Django
  • Python-简介
      @ Python的由来    Python的创始人为Guido van Rossum。1989年圣诞节期间,在阿姆斯特丹,Guido为了打发圣诞节的无趣,决心开发一个新的脚本解释程序,作为ABC 语言的一种继承。之所以选中Pyt...
    99+
    2023-01-30
    简介 Python
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作