初识 OpenCV

初识 OpenCV

简介

OpenCV(Open Source Computer Vision Library)是一个涵盖了数百种计算机视觉算法的开源算法库。

OpenCV 具有模块化结构,这意味着该软件包包含多个共享或静态库。其中包含以下模块:

  1. Core functionality (core):一个定义基本数据结构的基础模块,包括密集多维数组 Mat 和所有其他模块使用的基本函数。

  2. Image Processing (imgproc):图像处理模块,包括线性和非线性图像过滤、几何图像变换(调整大小、仿射和透视变形、基于通用表的重新映射)、色彩空间转换、直方图等。

  3. Video Analysis (video):视频分析模块,包括运动估计、背景扣除和对象跟踪算法。

  4. Camera Calibration and 3D Reconstruction (calib3d):基本的多视图几何算法、单相机和立体相机校准、物体姿态估计、立体对应算法和 3D 重建元素。

  5. 2D Features Framework (features2d):显著特征检测器、描述符和描述符匹配器。

  6. Object Detection (objdetect):检测预定义类的对象和实例(例如,面部、眼睛、杯子、人、汽车等)。

  7. High-level GUI (highgui):易于使用的界面和简单的 UI 功能。

  8. Video I/O (videoio): 易于使用的视频捕获和视频编解码器接口。

  9. … 其他一些帮助模块,例如 FLANN 和 Google 测试包装器、Python 绑定等。

OpenCV 早期的 API 是使用 C 语言编写的,然而基于 C 语言的 API 目前已经废弃。目前 OpenCV API 已经是 C++ 编写的,因此你可以十分高效的在 C++ 项目中使用 OpenCV。除此之外,OpenCV 官方还提供了其它语言的 API 调用支持,例如 Java、Python 以及 Matlab。当然,你还可以选择其它的编程语言,例如 JavaScript、Rust 等,这些语言的社区也提供了方案来使用 OpenCV。

在本篇文章中,我们将主要使用 Python 语言来介绍 OpenCV 的一些基础功能。

下载安装

在对 OpenCV 有一个基础的了解之后,我们可以开始尝试在本地中配置 OpenCV 环境来进行一些简单的功能测试。

基础环境

  • Windows 11 22H2

  • Visual C++ Redistributable for Visual Studio 2015

  • Python 3.7.0

首先我们在用户目录创建一个文件夹,这里我们将其命名为 OpenCV_Test。随后我们进入该目录。

mkdir ~/OpenCV_Test && cd OpenCV_Test

我们需要创建一个 Python 的虚拟环境。

python -m venv .venv

创建完成之后我们直接激活虚拟环境。

.venv/scripts/activate

(可选)确保虚拟环境 pip 版本大于 19.3。

python -m pip install --upgrade pip

在虚拟环境下载 opencv-contrib-python==4.8.1.78(contrib 为包含了额外模块的版本)。

pip install opencv-contrib-python==4.8.1.78

至此,我们已经完成了 OpenCV 的环境配置,现在可以在项目根目录下创建一个 opencv_test.py 文件,并追加以下内容。

import cv2 as cvprint(cv.__version__)

在终端通过 python opencv_test.py 进行测试,如果终端成功输出版本号则代表安装成功。

由于在之后的内容中,我们需要使用到一些测试数据,因此我们需要将 OpenCV 仓库的 samples 拷贝到我们的项目根目录下。

你可以通过 Github 浏览这些数据 - https://github.com/opencv/opencv/tree/4.x/samples/data

然后直接下载压缩包,并将 samples 拷贝至项目根目录下。https://github.com/opencv/opencv/archive/refs/heads/4.x.zip

图像功能测试

该部分主要涉及到图像的读取,展示以及写入 API。

import cv2 as cv
import sys, os# 添加当前目录下的samples/data作为数据搜索路径
cv.samples.addSamplesDataSearchPath(os.path.join(os.getcwd(), "samples", "data"))
# 读取样例数据中的图片
img = cv.imread(cv.samples.findFile("starry_night.jpg"))
if img is None:sys.exit("Could not read the image.")
# 展示图片
cv.imshow("Display window", img)
k = cv.waitKey(0)
# 当按下 s 时,写入一张新的图片至当前目录
if k == ord("s"):cv.imwrite("starry_night1.png", img) 

视频功能测试

从摄像头捕获视频

在该项任务中,我们通过摄像头捕获视频帧,并将其转为灰度帧展示出来。

import cv2 as cv# 视频捕获对象,用于调用系统摄像头(测试环境为笔记本摄像头)
cap = cv.VideoCapture(0)
if not cap.isOpened():print("Cannot open camera")exit()
while True:# 逐帧进行视频捕获ret, frame = cap.read()# 如果帧被捕获,ret 为 trueif not ret:print("Can't receive frame (stream end?). Exiting ...")break# 将捕获的帧转为灰度gray = cv.cvtColor(frame, cv.COLOR_BGR2GRAY)# 显示当前灰度帧cv.imshow('frame', gray)# 当按下 q 键时,结束捕获if cv.waitKey(1) == ord('q'):break
# 释放捕获对象
cap.release()
# 销毁所有窗口
cv.destroyAllWindows()

从文件播放视频

在该项任务中,我们通过已有文件读取视频帧信息,并展示其灰度帧。

import cv2 as cv
import os# 添加样例资源搜索路径
cv.samples.addSamplesDataSearchPath(os.path.join(os.getcwd(), "samples", "data"))
# 读取样例视频文件
cap = cv.VideoCapture(cv.samples.findFile('vtest.avi'))while cap.isOpened():# 逐帧读取视频ret, frame = cap.read()# 当帧读取成功,ret 为 trueif not ret:print("Can't receive frame (stream end?). Exiting ...")break# 获取灰度帧gray = cv.cvtColor(frame, cv.COLOR_BGR2GRAY)# 展示灰度帧cv.imshow('frame', gray)# 当按下 q 键时中断播放if cv.waitKey(1) == ord('q'):break
# 释放捕获对象以及窗口资源
cap.release()
cv.destroyAllWindows()

录制视频的保存

在该项任务中,我们将使用摄像头捕获视频帧,并将每帧都垂直翻转,然后将其保存为新的视频文件。

import cv2 as cv# 视频捕获窗口
cap = cv.VideoCapture(0)
# 定义编码器与视频写入对象
fourcc = cv.VideoWriter_fourcc(*'XVID')
# 输出名称,编码器,帧速率,帧尺寸
out = cv.VideoWriter('output.avi', fourcc, 20.0, (640, 480))
while cap.isOpened():# 逐帧读取摄像头信息ret, frame = cap.read()# 正常读取 ret 为 trueif not ret:print("Can't receive frame (stream end?). Exiting ...")break# 垂直翻转视频帧frame = cv.flip(frame, 0)# 写入翻转后的帧至输出文件out.write(frame)# 展示翻转后的帧信息cv.imshow('frame', frame)if cv.waitKey(1) == ord('q'):break
# 释放全部资源
cap.release()
out.release()
cv.destroyAllWindows()

图形的绘制

在该项任务中,我们将通过 OpenCV 绘制不同的几何图形。

直线
import numpy as np
import cv2 as cv# 创建一个黑色背景
img = np.zeros((512, 512, 3), np.uint8)
# 在 img 绘制一条粗细为 5 px 的蓝色对角线
cv.line(img, (0, 0), (511, 511), (255, 0, 0), 5)cv.imshow("img", img)
cv.waitKeyEx(0)
矩形
# 在 img 绘制一条左上到右下坐标的蓝色矩形
cv.rectangle(img, (384,0), (510,128), (0,255,0), 3)
# 在 img 绘制一个基于圆心加半径的圆
cv.circle(img,(447,63), 63, (0,0,255), -1)
椭圆
# 参数分别为图片、中心点,主副轴长度,椭圆逆时针旋转角度,椭圆弧的起始角度,椭圆弧的结束角度,画笔颜色等
cv.ellipse(img, (256, 256), (100, 50), 0, 0, 180, 255, -1)
多边形
# 要绘制多边形,首先需要顶点坐标。将这些点放入形状为 ROWSx1x2 的数组中,其中 ROWS 是顶点数,其类型应为 int32
pts = np.array([[100, 100], [100, 200], [200, 200], [200, 100]], np.int32)
pts = pts.reshape((-1, 1, 2))
cv.polylines(img, [pts], True, (0, 255, 255))

如果第三个参数为 False,您将得到连接所有点的折线,而不是闭合形状。

文字
# 参数分别为图片,文字,坐标,字体,字体缩放,颜色,粗细,线型
font = cv.FONT_HERSHEY_SIMPLEX
cv.putText(img, 'OpenCV', (10, 500), font, 4, (255, 255, 255), 2, cv.LINE_AA)

结语

在结束这篇介绍 OpenCV 的文章之际,我们希望你已经对这一强大的计算机视觉库有了初步的了解。通过下载和安装 OpenCV,你已经迈出了探索计算机视觉世界的第一步。

在文章中,我们探讨了 OpenCV 的基础部分,包括图像处理、视频处理和图形绘制等方面的核心 API。这些功能为开发者提供了丰富的工具箱,可以用于解决各种计算机视觉问题,从简单的图像处理到复杂的目标检测和跟踪。

然而,OpenCV 是一个庞大而灵活的库,我们只触及了其中的冰山一角。我们鼓励你继续深入学习,探索 OpenCV 更高级的功能和技术。无论是在工业自动化、医学影像、安防监控还是虚拟现实等领域,OpenCV 都发挥着至关重要的作用。

作为一个开源项目,OpenCV 的社区一直在不断发展和改进。在进一步的学习之后,你也可以通过参与社区,贡献你的力量,使这个强大的工具变得更加完善。(提出有效 issues 以及文档的勘误也是一份贡献!)

在这个计算机视觉的精彩世界中,OpenCV 为你打开了大门。希望你能够在这个旅程中找到乐趣,创造出令人惊叹的视觉应用。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/207037.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

机器学习硬件十年:性能变迁与趋势

本文分析了机器学习硬件性能的最新趋势,重点关注不同GPU和加速器的计算性能、内存、互连带宽、性价比和能效等指标。这篇分析旨在提供关于ML硬件能力及其瓶颈的全面视图。本文作者来自调研机构Epoch,致力于研究AI发展轨迹与治理的关键问题和趋势。 &…

【送书活动四期】被GitHub 要求强制开启 2FA 双重身份验证,我该怎么办?

记得是因为fork了OpenZeppelin/openzeppelin-contracts的项目,之后就被GitHub 要求强制开启 2FA 双重身份验证了,一拖再拖,再过几天帐户操作将受到限制了,只能去搞一下了 目录 2FA是什么为什么要开启 2FA 验证GitHub 欲在整个平台…

消息队列 - RabbitMQ

消息队列 - RabbitMQ 1. 初识 MQ1.1 同步调用1.2 异步调用1.3.技术选型 2. RabbitMQ2.1 安装2.2 收发信息2.2.1 交换机(Exchange)2.2.2 队列2.2.3 绑定关系2.2.4 发送消息 2.3 数据隔离 1. 初识 MQ 微服务一旦拆分,必然涉及到服务之间的相互调用,之前讲…

MySQL六 | 存储引擎

目录 存储引擎 存储引擎特点 存储引擎选择 Innodb与MyISAM区别 存储引擎 默认存储引擎:InnoDB show engines;#展示当前数据库支持的存储引擎 存储引擎特点 特点InnoDBMyISAMMemory存储限制64TB有有事务安全支持--锁机制行锁表锁表锁Btree锁支持支持 支持 Hash索引--支…

编译 Android gradle-4.6-all.zip 报错问题记录

编译 Android gradle-4.6-all.zip 报错问题记录 方法一:替换资源:方法二:修改源方法三:修改版本 编译时候无法下载 gradle-4.6-all Downloading https://services.gradle.org/distributions/gradle-4.6-all.zip 方法一&#xf…

《一念关山》热度破万,爱奇艺古装赛道出尽风头

​刘诗诗重回古装剧、新式武侠公路片、质感细腻的镜头美学......看点满满的《一念关山》频频登上热搜,俘获了大批观众的心。 开播首日热度就刷新了爱奇艺2023年站内纪录,《一念关山》作为2023年爱奇艺在古装赛道的收官之作,口碑和热度兼收。…

Linux内核-标准IO和系统IO的区别

概念 标准IO:指的是C语言实现的文件操作的函数 系统IO(文件IO):指的是linux或windows或unix,实现文件操作的函数。 为什么要有两种IO C语言要实现跨平台,所以C语言在不同操作系统中实现文件操作方式是不一…

一文详解Java反射

文章目录 反射是什么?反射的作用所有方法汇总一、加载Class对象二、加载类的构造器对象三、加载类的成员变量四、加载类的成员方法 反射是什么? 反射就是:加载类,并允许以编程的方式解剖类中的某个成分(成员变量&#…

实战:Docker Compose 下 Nginx、Java、Mysql 和 Redis 服务协同部署(包含解决浏览器访问Linux部署服务器本地资源问题)

1. 背景 在该实战中,我们将探讨如何使用Docker Compose协同部署Nginx、Java、Mysql和Redis服务,实现一个视频上传与展示的应用。具体需求如下: Java应用负责上传视频和图片资源到Nginx目录下,作为资源服务器。Nginx服务作为静态…

Numpy数组常用属性汇总(第5讲)

Numpy数组常用属性汇总 (第5讲)         🍹博主 侯小啾 感谢您的支持与信赖。☀️ 🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ…

【JavaEE进阶】 Spring使用注解存储对象

文章目录 🌴序言🍀前置⼯作:配置扫描路径🎄添加注解存储 Bean 对象🌳类注解🚩为什么要这么多类注解🚩注解之间的联系 🎋⽅法注解 Bean🚩⽅法注解需要配合类注解使⽤ ⭕总…

探索AIGC未来:CPU源码优化、多GPU编程与中国算力瓶颈与发展

★人工智能;大数据技术;AIGC;Turbo;DALLE 3;多模态大模型;MLLM;LLM;Agent;Llama2;国产GPU芯片;GPU;CPU;高性能计算机;边缘计算;大模型显存占用;5G…

如何夸张孩子

你刚才很努力啊!——表扬努力尽管艰难,但你一直没有放弃——表扬耐心和坚持你做事情的态度非常不错——表扬态度你在_____上进步了很多!——表扬细节这个方法真有新意!——表扬创意你和小伙伴合作得真棒!——表扬合作精…

中国特供阉割版 RTX 4090 曝光,老黄这操作绝了

到了现在大伙儿应该发现:国内禁售 NVIDIA RTX 4090 显卡这事儿基本实锤了。 实际上根据老美规定,从上个月 17 号开始,凡是公司主体在中国的显卡品牌,就已经不能生产和销售 RTX 4090。 以后厂商想要卖 4090 只能以整机形式出售&am…

艺术画廊展厅网站制作的效果如何

艺术展厅往往有很多人前往,在主要城市有不少画廊,对经营者来说,不同于销售行业,其更多的是打造品牌吸引用户前来或合作等形式,而由于行业特殊性,需要准属性用户才会前往。 因此在品牌打造及信息承载宣传方…

防止企业敏感数据泄露

敏感数据泄露是指意外或故意泄露关键信息,例如个人身份信息(PII)、支付卡信息(PCI)、受保护的电子健康信息(ePHI)和知识产权(IP),数据保护措施不足的组织会在…

10-Hadoop组件开发技术

单选题 题目1:下列选项描述错误的是? 选项: A Hadoop HA即集群中包含Secondary NameNode作为备份节点存在。 B ResourceManager负责的是整个Yarn集群资源的监控、分配和管理工作 C NodeManager负责定时的向ResourceManager汇报所在节点的资源使用情况…

Spark---DataFrame存储、Spark UDF函数、UDAF函数

四、DataFrame存储Spark UDF函数 1、储存DataFrame 1)、将DataFrame存储为parquet文件 2)、将DataFrame存储到JDBC数据库 3)、将DataFrame存储到Hive表 2、UDF:用户自定义函数 可以自定义类实现UDFX接口 java: …

案例062:基于微信小程序的健身房私教预约系统

文末获取源码 开发语言:Java 框架:SSM JDK版本:JDK1.8 数据库:mysql 5.7 开发软件:eclipse/myeclipse/idea Maven包:Maven3.5.4 小程序框架:uniapp 小程序开发软件:HBuilder X 小程序…

模块式雨水调蓄池施工简单,无需大型机械,可实现当天开挖当天回填

模块式雨水调蓄池的施工过程非常简单,无需大型机械和繁琐的施工工艺。在施工过程中,只需要进行简单的开挖和回填即可,而且可以在当天完成。这种施工方式不仅节省了施工时间和成本,还可以避免因大型机械和繁琐工艺引起的安全隐患。…