目录

一、引言​

二、OpenCV 简介

​(一)什么是 OpenCV

(二)OpenCV 的特点与优势

(三)OpenCV 的应用领域

三、环境搭建

(一)安装 OpenCV 库​

四、OpenCV 基础操作

(一)图像读取与显示​

(二)图像保存

(三)图像基本属性获取

(四)图像颜色空间转换

(五)图像的基本运算

一、引言​

在当今数字化时代,计算机视觉技术广泛应用于各个领域,从安防监控中的人脸识别,到自动驾驶汽车的环境感知,再到图像编辑软件的智能功能,计算机视觉正悄然改变着我们的生活。OpenCV(Open Source Computer Vision Library)作为计算机视觉领域中最受欢迎的开源库之一,为开发者提供了丰富的函数和工具,使得处理图像和视频变得更加高效和便捷。​
无论你是计算机科学专业的学生,对图像处理和计算机视觉充满好奇的爱好者,还是希望在项目中应用计算机视觉技术的开发者,本教程都将为你提供一个全面且易于理解的 OpenCV 入门指南。通过本教程的学习,你将掌握 OpenCV 的基本概念、安装方法,学会使用 OpenCV 进行图像读取、显示、处理以及视频操作等基础技能,为进一步深入研究计算机视觉打下坚实的基础。

二、OpenCV 简介

​(一)什么是 OpenCV

OpenCV 是一个开源的计算机视觉库,由英特尔公司于 1999 年发起并开发,旨在提供一个通用的计算机视觉解决方案,帮助开发者快速实现各种计算机视觉应用。经过多年的发展,OpenCV 已经成为一个功能强大、应用广泛的库,拥有超过 2500 个优化算法,涵盖了从基本的图像处理和计算机视觉任务到复杂的机器学习算法等多个领域。

(二)OpenCV 的特点与优势

1.跨平台性:OpenCV 可以在多种操作系统上运行,包括 Windows、Linux、macOS 以及移动操作系统如 Android 和 iOS。这使得开发者可以在不同的平台上开发和部署计算机视觉应用,而无需担心平台兼容性问题。​
2.多语言支持:OpenCV 提供了多种编程语言的接口,包括 C++、Python、Java、MATLAB 等。这使得不同背景的开发者都可以轻松地使用 OpenCV 进行开发,无论是喜欢使用 C++ 进行高性能计算的开发者,还是偏爱 Python 简洁语法的初学者,都能找到适合自己的开发方式。​
3.丰富的功能:OpenCV 涵盖了计算机视觉领域的各个方面,包括图像滤波、特征提取、目标检测、图像分割、立体视觉、视频分析等。开发者可以利用这些丰富的功能,快速实现各种复杂的计算机视觉应用,而无需从头开始编写算法。​
4.高效性:OpenCV 的算法经过了高度优化,采用了多种优化技术,如多线程处理、SIMD 指令集等,以提高计算效率。这使得 OpenCV 在处理大规模图像和视频数据时,能够保持高效运行,满足实时性要求较高的应用场景。​
5.活跃的社区:OpenCV 拥有一个庞大且活跃的社区,社区成员来自世界各地的开发者、研究人员和爱好者。在社区中,你可以找到丰富的文档、教程、示例代码以及开源项目,还可以与其他开发者交流经验、分享见解,获取帮助和支持。

(三)OpenCV 的应用领域

1.计算机视觉与图像处理:OpenCV 最初就是为计算机视觉和图像处理任务而设计的,它在这个领域有着广泛的应用。例如,图像滤波可以去除图像中的噪声,提高图像质量;图像增强可以突出图像中的细节,改善图像的视觉效果;图像分割可以将图像中的不同物体或区域分离出来,为后续的分析和处理提供基础。​
2.安防监控:在安防监控领域,OpenCV 被广泛应用于人脸识别、行为分析、目标跟踪等方面。通过摄像头采集视频数据,利用 OpenCV 的算法对视频中的图像进行处理和分析,可以实现实时的安防监控,及时发现异常情况并发出警报。​
3.自动驾驶:自动驾驶汽车需要对周围环境进行实时感知和理解,OpenCV 在其中发挥着重要作用。通过摄像头采集道路图像,利用 OpenCV 的目标检测算法可以识别出车辆、行人、交通标志和信号灯等目标物体,为自动驾驶汽车的决策和控制提供依据。​
4.医疗影像分析:在医疗领域,OpenCV 可以用于医疗影像的处理和分析,如 X 光、CT、MRI 等影像的处理。通过图像增强、分割和特征提取等技术,可以帮助医生更准确地诊断疾病,提高医疗诊断的准确性和效率。​
5.工业检测:在工业生产中,OpenCV 可以用于产品质量检测、缺陷识别、尺寸测量等方面。通过对工业生产线上采集的图像进行分析,可以实现自动化的质量检测,提高生产效率和产品质量。​
6.智能机器人:智能机器人需要具备视觉感知能力,以便与周围环境进行交互。OpenCV 可以为智能机器人提供图像识别、目标定位、路径规划等功能,帮助机器人更好地完成任务。

三、环境搭建

(一)安装 OpenCV 库​

安装好 Python 后,我们可以使用 pip 工具来安装 OpenCV 库。pip 是 Python 的包管理工具,它可以帮助我们方便地安装、升级和管理 Python 库。打开命令行终端,输入以下命令安装 OpenCV 库:

pip install opencv - python

如果你需要安装 OpenCV 的扩展模块(如 contrib 模块),可以使用以下命令:

pip install opencv - python - headless opencv - contrib - python - headless

在安装过程中,pip 会自动下载并安装 OpenCV 库及其依赖项。安装完成后,你可以在 Python 代码中通过import cv2语句来导入 OpenCV 库,如果没有报错,则说明安装成功。

四、OpenCV 基础操作

(一)图像读取与显示​

1.读取图像:在 OpenCV 中,使用cv2.imread()函数来读取图像。该函数的第一个参数是图像文件的路径,第二个参数是读取图像的方式,常用的读取方式有以下几种:​
cv2.IMREAD_COLOR:以彩色模式读取图像,这是默认的读取方式。在这种模式下,图像的颜色通道顺序为 BGR(Blue, Green, Red)。​
cv2.IMREAD_GRAYSCALE:以灰度模式读取图像,图像将被转换为单通道的灰度图像。​
cv2.IMREAD_UNCHANGED:读取图像时保留图像的原始格式,包括 alpha 通道(如果有的话)。​以下是读取彩色图像和灰度图像的示例代码:

import cv2# 读取彩色图像
img_color = cv2.imread('Dog.png', cv2.IMREAD_COLOR)
if img_color is None:print('无法读取图像')
else:print('彩色图像尺寸:', img_color.shape)# 读取灰度图像
img_gray = cv2.imread('Dog.png', cv2.IMREAD_GRAYSCALE)
if img_gray is None:print('无法读取图像')
else:print('灰度图像尺寸:', img_gray.shape)

在上述代码中,首先使用cv2.imread()函数读取图像,然后通过判断返回值是否为None来检查图像是否读取成功。如果图像读取成功,可以通过img.shape属性获取图像的尺寸,该属性返回一个元组,包含图像的高度、宽度和通道数(对于灰度图像,通道数为 1;对于彩色图像,通道数为 3)。

2. 显示图像:使用cv2.imshow()函数来显示图像。该函数的第一个参数是窗口的名称,第二个参数是要显示的图像。在显示图像后,需要使用cv2.waitKey()函数等待用户按键,否则图像窗口会一闪而过。cv2.waitKey()函数的参数是等待的时间(单位为毫秒),如果参数为 0,则表示无限等待,直到用户按下任意键。最后,使用cv2.destroyAllWindows()函数关闭所有打开的图像窗口。​
以下是显示彩色图像和灰度图像的示例代码:

import cv2# 读取彩色图像
img_color = cv2.imread('Dog.png', cv2.IMREAD_COLOR)
if img_color is None:print('无法读取图像')
else:cv2.imshow('彩色图像', img_color)cv2.waitKey(0)cv2.destroyAllWindows()# 读取灰度图像
img_gray = cv2.imread('Dog.png', cv2.IMREAD_GRAYSCALE)
if img_gray is None:print('无法读取图像')
else:cv2.imshow('灰度图像', img_gray)cv2.waitKey(0)cv2.destroyAllWindows()

在上述代码中,分别读取彩色图像和灰度图像,并使用cv2.imshow()函数在不同的窗口中显示图像,通过cv2.waitKey(0)函数等待用户按键,最后使用cv2.destroyAllWindows()函数关闭所有窗口。

(二)图像保存

使用cv2.imwrite()函数可以将处理后的图像保存到磁盘上。该函数的第一个参数是保存图像的文件名,第二个参数是要保存的图像。文件名的扩展名决定了保存图像的格式,OpenCV 支持多种图像格式,如 JPEG、PNG、BMP 等。​
以下是将彩色图像转换为灰度图像并保存的示例代码:

import cv2# 读取彩色图像
img_color = cv2.imread('image.jpg', cv2.IMREAD_COLOR)
if img_color is None:print('无法读取图像')
else:# 转换为灰度图像img_gray = cv2.cvtColor(img_color, cv2.COLOR_BGR2GRAY)# 保存灰度图像cv2.imwrite('image_gray.jpg', img_gray)print('灰度图像已保存')

在上述代码中,首先读取彩色图像,然后使用cv2.cvtColor()函数将彩色图像转换为灰度图像(关于cv2.cvtColor()函数将在后续介绍),最后使用cv2.imwrite()函数将灰度图像保存为image_gray.jpg文件。

(三)图像基本属性获取

通过图像的shape属性可以获取图像的高度、宽度和通道数等基本属性。对于彩色图像,shape属性返回一个包含三个元素的元组,分别表示图像的高度、宽度和通道数(BGR 通道数为 3);对于灰度图像,shape属性返回一个包含两个元素的元组,分别表示图像的高度和宽度(通道数为 1)。​
此外,还可以通过图像的dtype属性获取图像的数据类型,OpenCV 中图像的数据类型通常为numpy.uint8,表示无符号 8 位整数,其取值范围为 0 - 255。​
以下是获取图像基本属性的示例代码:

import cv2# 读取彩色图像
img_color = cv2.imread('Dog.png', cv2.IMREAD_COLOR)
if img_color is None:print('无法读取图像')
else:height, width, channels = img_color.shapeprint('彩色图像高度:', height)print('彩色图像宽度:', width)print('彩色图像通道数:', channels)print('彩色图像数据类型:', img_color.dtype)# 读取灰度图像
img_gray = cv2.imread('Dog.png', cv2.IMREAD_GRAYSCALE)
if img_gray is None:print('无法读取图像')
else:height, width = img_gray.shapeprint('灰度图像高度:', height)print('灰度图像宽度:', width)print('灰度图像数据类型:', img_gray.dtype)

在上述代码中,分别读取彩色图像和灰度图像,并通过shape属性和dtype属性获取图像的基本属性并打印输出。

(四)图像颜色空间转换

在 OpenCV 中,图像的颜色空间通常有 BGR、RGB、HSV、HLS、Lab 等。默认情况下,cv2.imread()函数读取的图像是 BGR 颜色空间。在某些情况下,我们需要将图像从一种颜色空间转换为另一种颜色空间,例如将 BGR 图像转换为灰度图像、将 BGR 图像转换为 HSV 图像等。​
使用cv2.cvtColor()函数可以实现图像颜色空间的转换。该函数的第一个参数是要转换的图像,第二个参数是转换的代码,用于指定源颜色空间和目标颜色空间。常用的颜色空间转换代码如下:​
cv2.COLOR_BGR2GRAY:将 BGR 图像转换为灰度图像。​
cv2.COLOR_BGR2RGB:将 BGR 图像转换为 RGB 图像。​
cv2.COLOR_BGR2HSV:将 BGR 图像转换为 HSV 图像。​
cv2.COLOR_BGR2HLS:将 BGR 图像转换为 HLS 图像。​
cv2.COLOR_BGR2Lab:将 BGR 图像转换为 Lab 图像。​
以下是将 BGR 图像转换为灰度图像、RGB 图像和 HSV 图像的示例代码:

import cv2# 读取BGR图像
img_bgr = cv2.imread('Dog.png', cv2.IMREAD_COLOR)
if img_bgr is None:print('无法读取图像')
else:# 转换为灰度图像img_gray = cv2.cvtColor(img_bgr, cv2.COLOR_BGR2GRAY)cv2.imshow('灰度图像', img_gray)# 转换为RGB图像img_rgb = cv2.cvtColor(img_bgr, cv2.COLOR_BGR2RGB)cv2.imshow('RGB图像', img_rgb)# 转换为HSV图像img_hsv = cv2.cvtColor(img_bgr, cv2.COLOR_BGR2HSV)cv2.imshow('HSV图像', img_hsv)cv2.waitKey(0)cv2.destroyAllWindows()

在上述代码中,首先读取 BGR 图像,然后使用cv2.cvtColor()函数分别将 BGR 图像转换为灰度图像、RGB 图像和 HSV 图像,并使用cv2.imshow()函数显示转换后的图像。

(五)图像的基本运算

1.图像加法:在 OpenCV 中,可以使用cv2.add()函数对两幅图像进行加法运算。图像加法通常用于图像融合、图像增强等场景。需要注意的是,参与加法运算的两幅图像必须具有相同的尺寸和数据类型。​
以下是图像加法的示例代码:

import cv2
import numpy as np# 读取两幅图像
img1 = cv2.imread('image1.jpg', cv2.IMREAD_COLOR)
img2 = cv2.imread('image2.jpg', cv2.IMREAD_COLOR)if img1 is None or img2 is None:print('无法读取图像')
else:# 确保两幅图像尺寸相同if img1.shape == img2.shape:# 图像加法img_add = cv2.add(img1, img2)cv2.imshow('图像加法结果', img_add)cv2.waitKey(0)cv2.destroyAllWindows()else:print('两幅图像尺寸不同,无法进行加法运算')

(六)视频读写

cap = cv2.VideoCapture(0)
fourcc = cv2.VideoWriter_fourcc(*'XVID')
out = cv2.VideoWriter('output.avi', fourcc, 20.0, (640,480))while cap.isOpened():ret, frame = cap.read()if not ret:breakout.write(frame)cv2.imshow('frame', frame)if cv2.waitKey(1) & 0xFF == ord('q'):breakcap.release()
out.release()
cv2.destroyAllWindows()

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

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

相关文章

C++高频知识点(十九)

文章目录91. TCP断开连接的时候为什么必须4次而不是3次?92. 为什么要区分用户态和内核态?93. 说说编写socket套接字的步骤1. 服务器端编写步骤1.1 创建套接字1.2 绑定套接字1.3 监听连接1.4 接受连接1.5 数据传输1.6 关闭套接字2. 客户端编写步骤2.1 创建…

一个基于 epoll 实现的多路复用 TCP 服务器程序,相比 select 和 poll 具有更高的效率

/*5 - 使用epoll实现多路复用 */ #include <stdio.h> // 标准输入输出函数库 #include <stdlib.h> // 标准库函数&#xff0c;包含exit等 #include <string.h> // 字符串处理函数 #include <unistd.h> // Unix标准函…

元数据管理与数据治理平台:Apache Atlas 通知和业务元数据 Notifications And Business Metadata

文中内容仅限技术学习与代码实践参考&#xff0c;市场存在不确定性&#xff0c;技术分析需谨慎验证&#xff0c;不构成任何投资建议。Apache Atlas 框架是一套可扩展的核心基础治理服务&#xff0c;使企业能够有效、高效地满足 Hadoop 中的合规性要求&#xff0c;并支持与整个企…

rem:CSS中的相对长度单位

&#x1f90d; 前端开发工程师、技术日更博主、已过CET6 &#x1f368; 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1 &#x1f560; 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》、《前端求职突破计划》 &#x1f35a; 蓝桥云课签约作者、…

【10】C#实战篇——C# 调用 C++ dll(C++ 导出函数、C++导出类)

文章目录1 导出C 类函数 、导出 C函数1.1 .h文件1.2 .cpp 文件1.3 C# 调用2 C与C#数据类型对应3 保姆级教程&#xff08;项目搭建、代码、调用&#xff0c;图文并茂&#xff09;1 导出C 类函数 、导出 C函数 C 生成动态库.dll 详细教程&#xff1a; C 生成动态库.dll 及 C调用…

Flutter 与 Android NDK 集成实战:实现高性能原生功能

Flutter 与 NDK 集成实现 Flutter 可以通过 Platform Channels 与原生代码&#xff08;包括使用 NDK 编写的 C/C 代码&#xff09;进行交互。以下是实现 Flutter 与 NDK 集成的步骤&#xff1a; 基本步骤 1. 创建 Flutter 项目 flutter create flutter_ndk_example cd flutter_…

elementui cascader 远程加载请求使用 选择单项等

背景&#xff1a;小程序与后端使用自定义表单渲染视图。发现若没有全选&#xff08;如&#xff1a;省市县全部选择&#xff0c;指定的市3级&#xff09;在pc端就会无法渲染出已经选择的区县名称。 解决方案&#xff1a;参考官方文档&#xff0c;设置属性可独立勾选element ui c…

Unity WebGL打包后启动方法,本地方法

引言&#xff1a;常见WebGL开启方法常需要重新打包点击Build and Run或者将游戏放到Unity的云服务器上&#xff0c;作为开发者而言这两个方案一个为了开启再次打包&#xff0c;另一个直接放到了公开环境都不太合适。所以我们需要一个能在本地开启测试的WebGL的方法。 解决方案 …

安全引导功能及ATF的启动过程(五)

安全引导功能及ATF的启动过程&#xff08;五&#xff09; ATF中bl32的启动 bl31中的runtime_svc_init函数会初始化OP-TEE对应的服务&#xff0c;通过调用该服务项的初始化函数来完成OP-TEE的启动。对于OP-TEE的服务项会通过DECLARE_RT_SVC宏在编译时被存放到rt_svc_des段中。该…

Numpy科学计算与数据分析:Numpy入门之多平台安装与基础环境配置

Numpy环境搭建与基础操作 学习目标 本课程将指导学员在Windows、macOS和Linux三种操作系统上安装Numpy&#xff0c;并配置开发环境&#xff0c;包括使用Jupyter Notebook和Spyder等IDE的基本操作。通过本课程的学习&#xff0c;学员将能够独立搭建Numpy开发环境&#xff0c;并…

内存溢出的原因有哪些,如何排查线上问题?

1. java.lang.OutOfMemoryError: ......java heap space..... 堆栈溢出&#xff0c;代码问题的可能性极大 2. java.lang.OutOfMemoryError: GC over head limit exceeded 系统处于高频的GC状态&#xff0c;而且回收的效果依然 不佳的情况&#xff0c;就会开始报这个错误&…

Cesium 无人机视角飞行漫游,截屏

1.实现Cesium模拟无人机离屏渲染&#xff0c;无人机视角飞行漫游。视锥体显示 具体效果如下地址&#xff1a; 【CESIUM无人机视角飞行截屏】 https://www.bilibili.com/video/BV1zQ89zGE14/?share_sourcecopy_web&vd_source8239ec37df07d6a5d56c9ece00146783

vscode 打开设置

目录 方法 1&#xff08;快捷键&#xff09;&#xff1a; 方法2&#xff0c;界面操作&#xff0c;有时没有 方法 1&#xff08;快捷键&#xff09;&#xff1a; 按下&#xff1a;Cmd Shift P 输入并选择&#xff1a;Preferences: Open Settings (JSON) 方法2&#xff0c;…

繁花深处:花店建设的时代意义与多元应用—仙盟创梦IDE

花店当第一缕晨光透过花店的玻璃窗&#xff0c;落在带着露水的玫瑰花瓣上时&#xff0c;这个空间便不再只是商品交易的场所。花店作为城市肌理中充满生命力的细胞&#xff0c;承载着远比销售鲜花更丰富的社会意义。在快节奏的现代生活中&#xff0c;一束鲜花的绽放不仅是自然之…

AtomicStampedReference解决方案

1、通过引入版本戳(stamp)机制解决ABA问题&#xff1a; 每次修改时递增版本号执行CAS时同时检查值和版本号即使值相同但版本不同&#xff0c;操作也会失败2、具体代码实现 import java.util.concurrent.atomic.AtomicStampedReference;public class AtomicStampedReferenceDemo…

版本控制的详细说明介绍(已有github账号版)

说明 如果已经有一个GitHub账号,这是一个很好的起点!版本控制是一个帮助你管理代码或其他文件变化的工具,就像给你的项目加了一个“时间机器”,可以随时回溯历史、协作编辑,而不会乱套。下面我将从基础开始,层层展开说明。整个内容分为几个部分:介绍、原理、用途、操作…

基于Github Pages搭建个人博客站点:hexo环境搭建、本地预览与发布

步骤确认 Hexo 博客的源文件在哪里安装 Hexo 命令行工具&#xff1a;npm install -g hexo-cli在源文件目录中使用 hexo new "文章标题" 创建新文章编辑生成的 Markdown 文件使用 hexo generate 生成静态文件使用 hexo deploy 部署到这个 GitHub Pages 仓库设置Hexo博…

Shell脚本实现自动封禁恶意扫描IP

iptables 简介我们使用iptables工具实现功能iptables 是 Linux 系统上最常用的防火墙工具&#xff0c;可以指定策略。Shell文件创建首先我们先创建文件scanners.shvim /usr/local/bin/auto_block_ip.sh我的目标是每10分钟自动扫描&#xff0c;再10分钟内一个IP访问50次以上就就…

LeetCode_哈希表

哈希表&#xff08;散列表&#xff09;一、哈希表二、有效的字母异位词1、有效的字母异位词(力扣242)2、赎金信(力扣383)3、字母异位词分组(力扣49)4、找到字符串中所有字母异位词(力扣438)三、两个数组的交集1、两个数组的交集(力扣349)2、两个数组的交集 II(力扣350)三、其他…

2.变量和常量

1.变量2.2 变量的基本使用2.3 变量的本质 2.4 变量命名规则与规范 2.5 变量拓展-数组 1.数组的基本使用 2.常量