Python计算机视觉 第10章-OpenCV
Python计算机视觉 第10章-OpenCV
OpenCV 是一个C++ 库,用于(实时)处理计算视觉问题。实时处理计算机视觉的 C++ 库,最初由英特尔公司开发,现由 Willow Garage 维护。OpenCV 是在 BSD 许可下发布的开源库,这意味着它对于学术研究和商业应用是免费的。
10.1 OpenCV的Python接口
OpenCV(Open Source Computer Vision Library)是一个开源计算机视觉库,提供了大量的图像和视频处理功能。其 Python 接口使得用户能够方便地在 Python 中使用 OpenCV 的功能。OpenCV Python 接口通过 cv2
模块提供了对各种计算机视觉算法和工具的访问,包括图像处理、视频分析、机器学习等。
使用
#直接pip没法安装下来
pip install cv2#需要按照如下命令安装才会成功
pip install opencv-python
如果安装速度太慢可以使用清华源:
pip install 包名 -i https://pypi.tuna.tsinghua.edu.cn/simple
10.2 OpenCV基础知识
主要功能:
-
图像读取和显示
- 读取图像:
cv2.imread()
- 显示图像:
cv2.imshow()
- 保存图像:
cv2.imwrite()
- 读取图像:
-
图像处理
- 图像转换:
cv2.cvtColor()
- 图像平滑:
cv2.GaussianBlur()
,cv2.medianBlur()
- 边缘检测:
cv2.Canny()
- 图像转换:
-
几何变换
- 图像缩放:
cv2.resize()
- 旋转和仿射变换:
cv2.warpAffine()
- 透视变换:
cv2.warpPerspective()
- 图像缩放:
-
特征检测与描述
- 角点检测:
cv2.cornerHarris()
- 特征匹配:
cv2.BFMatcher()
,cv2.FlannBasedMatcher()
- 角点检测:
-
视频处理
- 捕捉视频:
cv2.VideoCapture()
- 播放视频:
cv2.imshow()
(与图像处理相同)
- 捕捉视频:
-
机器学习与深度学习
- 加载预训练模型:
cv2.dnn.readNet()
- 进行推理:
cv2.dnn.forward()
- 加载预训练模型:
示例代码如下:
import cv2
import numpy as np
import matplotlib.pyplot as plt# 读取图像
image = cv2.imread('test.jpg')# 显示原图
cv2.imshow('Original Image', image)
cv2.waitKey(0)
cv2.destroyAllWindows()# 转换为灰度图
gray_image = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)# 图像平滑
smoothed_image = cv2.GaussianBlur(gray_image, (5, 5), 0)# 边缘检测
edges = cv2.Canny(smoothed_image, 100, 200)# 显示处理结果
fig, axs = plt.subplots(1, 3, figsize=(15, 5))
axs[0].imshow(cv2.cvtColor(gray_image, cv2.COLOR_BGR2RGB), cmap='gray')
axs[0].set_title('Gray Image')
axs[0].axis('off')axs[1].imshow(cv2.cvtColor(smoothed_image, cv2.COLOR_BGR2RGB), cmap='gray')
axs[1].set_title('Smoothed Image')
axs[1].axis('off')axs[2].imshow(cv2.cvtColor(edges, cv2.COLOR_BGR2RGB), cmap='gray')
axs[2].set_title('Edges')
axs[2].axis('off')plt.show()
处理结果如下:
实验图1 示例代码处理结果
其中:
-
读取图像:
cv2.imread('test.jpg)
-
转换为灰度图:
cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
-
图像平滑:
cv2.GaussianBlur(gray_image, (5, 5), 0)
-
边缘检测:
cv2.Canny(smoothed_image, 100, 200)
-
显示结果:使用
matplotlib
展示灰度图、平滑图像和边缘检测结果
10.3 处理视频
OpenCV 提供了全面的视频处理功能,主要包括以下几个方面:
-
读取视频:
- 打开视频文件或摄像头进行视频流读取。
- 使用
cv2.VideoCapture()
进行视频捕捉。
-
显示视频:
- 显示视频帧或视频流。
- 使用
cv2.imshow()
显示每一帧图像。
-
处理视频:
- 对视频帧进行各种图像处理操作,如颜色转换、滤镜应用、对象检测等。
-
写入视频:
- 将处理后的视频保存到文件中。
- 使用
cv2.VideoWriter()
进行视频编写和保存。
-
视频属性获取:
- 获取视频的帧率、分辨率、总帧数等信息。
- 通过
cv2.CAP_PROP_FPS
、cv2.CAP_PROP_FRAME_WIDTH
、cv2.CAP_PROP_FRAME_HEIGHT
获取视频属性。
-
逐帧处理:
- 对每一帧进行个性化处理,例如去噪、边缘检测、特效添加等。
-
视频流处理:
- 实时处理来自摄像头的视频流,包括实时特效应用和流媒体处理。
这些功能使得 OpenCV 能够实现丰富的视频分析和处理任务,如视频编辑、运动跟踪、实时监控等。
10.4 跟踪
视频跟踪是计算机视觉中的一项重要任务,用于在视频序列中持续追踪特定的对象。OpenCV 提供了多种跟踪算法,可以用于实现目标跟踪功能。
主要功能:
-
初始化跟踪器:
- 使用预定义的跟踪器算法(如 KLT、MOSSE、CSRT 等)来初始化跟踪器。
-
目标检测:
- 在视频的第一帧中检测并确定要跟踪的目标区域。
-
跟踪目标:
- 在后续帧中持续追踪目标,更新目标的位置。
-
更新跟踪器:
- 根据每帧中的目标位置更新跟踪器。
-
可视化跟踪结果:
- 在视频帧上绘制跟踪结果,例如矩形框或轨迹。
常见跟踪器:
-
KLT(Kanade-Lucas-Tomasi):
- 基于特征点跟踪的方法,适用于处理局部特征的目标。
-
MOSSE(Minimum Output Sum of Squared Error):
- 基于相关滤波器的跟踪方法,速度快且适用于低分辨率目标。
-
CSRT(Discriminative Correlation Filter with Channel and Spatial Reliability):
- 结合了通道和空间可靠性的跟踪方法,适用于处理尺度变化和遮挡情况。
-
MedianFlow:
- 基于光流的方法,适用于处理稳定的目标跟踪。
应用场景
- 实时监控:跟踪视频监控中的运动目标。
- 视频分析:分析运动对象的轨迹和行为。
- 人机交互:在增强现实和虚拟现实中跟踪用户的动作。
通过这些跟踪功能,OpenCV 能够帮助实现高效的目标跟踪,广泛应用于安防、自动驾驶、运动分析等领域。
10.4.2 Lucas-Kanade 算法
Lucas-Kanade 算法 是一种经典的光流法,用于在视频序列中估计每一帧图像中像素的运动。它基于局部区域的假设,通过求解局部区域内光流的速度来实现目标的跟踪和运动估计。
核心思想
-
局部光流假设:
- 假设目标在连续帧之间的运动是局部一致的,即在小区域内所有像素的运动是相同的。
-
光流约束方程:
- 基于光流约束方程: I x u + I y v + I t = 0 I_x u + I_y v + I_t = 0 Ixu+Iyv+It=0
其中, I x I_x Ix 和 I y I_y Iy 分别是图像在 x x x 和 y y y 方向上的梯度, I t I_t It 是时间梯度(图像亮度随时间的变化), u u u 和 v v v 是光流的水平和垂直分量。
- 基于光流约束方程: I x u + I y v + I t = 0 I_x u + I_y v + I_t = 0 Ixu+Iyv+It=0
-
局部光流求解:
- 使用局部窗口内的像素梯度信息,通过最小二乘法来估计光流的速度。通常,采用 3 × 3 3 \times 3 3×3 的窗口进行光流的计算。
-
光流计算:
- 通过求解以下线性方程组得到光流速度:
[ ∑ I x 2 ∑ I x I y ∑ I x I y ∑ I y 2 ] [ u v ] = − [ ∑ I x I t ∑ I y I t ] \begin{bmatrix} \sum I_x^2 & \sum I_x I_y \\ \sum I_x I_y & \sum I_y^2 \end{bmatrix} \begin{bmatrix} u \\ v \end{bmatrix} = - \begin{bmatrix} \sum I_x I_t \\ \sum I_y I_t \end{bmatrix} [∑Ix2∑IxIy∑IxIy∑Iy2][uv]=−[∑IxIt∑IyIt]
其中, ∑ \sum ∑ 表示在局部窗口内的积分。
- 通过求解以下线性方程组得到光流速度:
优点
- 准确性:在平滑和一致的区域内能够提供较高的准确性。
- 实现简单:相对简单的数学模型,易于实现。
缺点
- 对大位移敏感:在目标快速移动或存在较大位移的情况下,光流计算的准确性可能降低。
- 需要平滑区域:算法在具有纹理的区域效果较好,对于平坦区域或重复纹理区域可能不够准确。
应用场景
- 运动检测:估计视频序列中物体的运动。
- 目标跟踪:在视频流中追踪特定目标的运动。
- 光流估计:用于图像对齐、稳定化和动作分析等。
Lucas-Kanade 算法因其简单有效的特性,广泛应用于各种计算机视觉任务中,是视频处理和目标跟踪中的基础算法之一。
如图10-6所示:
图 10-6:通过 LKTrack 类利用 Lucas-Kanade 算法进行跟踪
10.5 更多实例
10.5.1 图像修复
图像修复是指对图像中丢失或损坏的部分进行重建的过程。这个过程不仅包括用于恢复丢失数据或损坏部分的算法,还包括在照片编辑应用程序中去除不需要的元素,如红眼或物体。图像修复旨在填补图像中的缺失区域,使其恢复到尽可能完整和自然的状态。
主要步骤:
-
标记损坏区域:
- 确定图像中需要修复的区域,通常通过掩模图像标记这些区域。掩模图像中的标记区域会指示需要修复的部分。
-
选择修复算法:
- 选择适当的图像修复算法。例如,均值填补(Inpainting)方法使用周围像素的信息来填补损坏区域。Navier-Stokes 算法和纹理合成等方法也可用于不同类型的图像修复。
-
应用修复算法:
- 利用所选的算法对损坏区域进行修复。算法会根据周围区域的图像数据来填补缺失部分。
-
处理结果:
- 对修复后的图像进行后处理,以确保修复区域与周围区域自然融合。检查和调整修复效果,以实现更好的视觉效果。
应用场景:
- 图像恢复:修复老旧或损坏的照片,使其恢复到原始状态。
- 去除红眼:在照片编辑中去除红眼效果。
- 物体去除:在照片中去除不需要的物体或标记,填补被去除部分的图像信息。
- 遮挡修复:处理由于遮挡或图像损坏导致的缺失区域。
图像修复技术可以有效地恢复图像的完整性和视觉质量,广泛应用于图像编辑、数字修复以及计算机视觉等领域。
如图10-8所示:
图 10-8:用 OpenCV 进行图像修复的示例。左图显示了由用户标记的“破损”区域。右图显示了经过图像修复后的结果
10.5.2 利用霍夫变换检测直线
霍夫变换 是一种经典的图像处理技术,用于检测图像中的直线或其他形状。霍夫变换通过将图像空间的直线检测转换为参数空间的峰值检测,从而实现直线的检测。
核心思想
-
直线方程:
- 在笛卡尔坐标系中,直线方程为 y = m x + c y = mx + c y=mx+c,其中 m m m 是斜率, c c c 是截距。
- 在霍夫变换中,通常使用极坐标系表示直线: ρ = x cos θ + y sin θ \rho = x \cos \theta + y \sin \theta ρ=xcosθ+ysinθ
其中, ρ \rho ρ 是直线到原点的距离, θ \theta θ 是直线的角度。
-
参数空间:
- 通过将每个图像中的点转换为参数空间中的直线表示,所有的直线将映射到参数空间中的一条曲线。
-
累加器:
- 在参数空间中,对每条曲线进行累加,形成一个累加器数组。直线的峰值对应于参数空间中的高响应值。
-
峰值检测:
- 在累加器中寻找峰值,这些峰值对应于图像中真实存在的直线。
霍夫变换步骤
-
边缘检测:
- 使用边缘检测算法(如 Canny 边缘检测)检测图像中的边缘点。
-
霍夫变换:
- 将每个边缘点转换为参数空间中的曲线,并在累加器中进行累加。
-
峰值检测:
- 在累加器中检测峰值,找到参数空间中的直线。
-
绘制直线:
- 根据检测到的直线参数,在原图像上绘制直线。
应用场景
- 车道检测:用于自动驾驶系统中检测车道标线。
- 建筑物结构分析:分析建筑物中的直线结构。
- 图像校正:校正图像中的直线变形。
霍夫变换通过将图像空间中的问题转换到参数空间,能够有效检测直线,并广泛应用于各种计算机视觉任务中。
示例代码如下:
import cv2
import numpy as np
import matplotlib.pyplot as plt# 读取图像
image = cv2.imread('img_1.png')
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)# 边缘检测
edges = cv2.Canny(gray, 50, 150)# 霍夫变换检测直线
lines = cv2.HoughLines(edges, 1, np.pi / 180, 200)# 在图像上绘制直线
if lines is not None:for line in lines:rho, theta = line[0]a = np.cos(theta)b = np.sin(theta)x0 = a * rhoy0 = b * rhox1 = int(x0 + 1000 * (-b))y1 = int(y0 + 1000 * (a))x2 = int(x0 - 1000 * (-b))y2 = int(y0 - 1000 * (a))cv2.line(image, (x1, y1), (x2, y2), (0, 0, 255), 2)# 显示结果
plt.imshow(cv2.cvtColor(image, cv2.COLOR_BGR2RGB))
plt.title('Detected Lines')
plt.axis('off')
plt.show()
处理结果如下:
实验图2 直线检测结果
相关文章:

Python计算机视觉 第10章-OpenCV
Python计算机视觉 第10章-OpenCV OpenCV 是一个C 库,用于(实时)处理计算视觉问题。实时处理计算机视觉的 C 库,最初由英特尔公司开发,现由 Willow Garage 维护。OpenCV 是在 BSD 许可下发布的开源库,这意味…...
多层感知机 (Multilayer Perceptron, MLP)
多层感知机 (Multilayer Perceptron, MLP) 通俗易懂算法 多层感知机(Multilayer Perceptron,MLP)是一种前馈人工神经网络。它的主要特点是由多层神经元(或节点)组成,包括至少一个隐藏层。MLP 是监督学习的…...
reg和wire的区别 HDL语言
文章目录 数据类型根本区别什么时候要定义wire小结 数据类型 HDL语言有三种数据类型:寄存器数据类型(reg)、线网数据类型(wire)、参数数据类型(parameter)。 根本区别 reg: 寄存器…...
前置声明和头文件之间的关系 问题
出现这些问题的原因是 ORB_SLAM3::MultiGraph 被前置声明了,但在使用的时候,编译器并没有看到 MultiGraph 类的完整定义。前置声明只能用于指针和引用,但如果要访问其成员函数或变量,必须包含完整的类定义。 解决方案步骤&#x…...
Linux02
1.相对路径和绝对路径 cd用于切换目录,对于路径可以用相对路径和绝对路径 例如:cd /home/user/public和cd public效果一样,都是将目录切换到HOME文件夹下的public文件夹 2.特殊路径符 .表示当前目录 ..表示上级目录 ~表示HOME目录 3.m…...
df 命令:显示磁盘空间使用情况
一、df 命令简介 df命令用于显示文件系统的磁盘空间利用情况,包括文件系统的总空间、已用空间、可用空间以及挂载点信息。通过df命令,用户可以快速了解系统中各个文件系统的空间使用情况。 二、df 命令参数 df [选项] [目录/驱动器]选项&am…...
深入解析Go语言的容器包
在Go语言中,container标准包为开发者提供了三个非常有用的数据结构:堆(heap)、链表(list)和环(ring)。这些数据结构的实现分别位于container/heap、container/list和container/ring中…...
STM32 + W5500 实现HTTPS !
两点: 1. 让我们先站在操作系统之上的网络协议栈再之上来思考…… 2. 我们先简单粗暴地理解为:http + (加密)= https 先弄一个简单的HTTP网络客户端,连接服务器并读取默认页面。该应用程序可能如下所示: #include <sys/types.h> #include <sys/socket.h> …...
使用DuckDuckGo搜索API进行高效信息检索:Python实践指南
使用DuckDuckGo搜索API进行高效信息检索:Python实践指南 引言 在当今信息爆炸的时代,快速准确地获取所需信息变得越来越重要。DuckDuckGo作为一个注重隐私的搜索引擎,提供了强大的搜索API,让开发者能够轻松地将搜索功能集成到自…...

UE4_后期处理_后期处理材质四—场景物体描边
一、效果如下图: 二、分析: 回顾复习:在后期处理材质三中,我们通过计算开启自定义深度通道物体的像素点上下左右4个像素SceneTextureCustomDepth深度之和来判断物体的外部(包含物体的边)和内部,…...

华为OD机试 - 推荐多样性(Python/JS/C/C++ 2024 E卷 100分)
华为OD机试 2024E卷题库疯狂收录中,刷题点这里 专栏导读 本专栏收录于《华为OD机试真题(Python/JS/C/C)》。 刷的越多,抽中的概率越大,私信哪吒,备注华为OD,加入华为OD刷题交流群,…...
梧桐数据库(WuTongDB):CBO(Cost-Based Optimizer)基于代价的优化器技术简介
CBO(基于代价的优化器,Cost-Based Optimizer)是现代数据库系统中最广泛使用的查询优化器之一。它通过计算执行查询时可能消耗的资源(如CPU、内存、I/O)来选择最优的执行计划,以提高查询性能。 1. CBO 的工…...
深入探索Go语言中的函数:匿名函数、指针参数与函数返回
1. Go语言中的函数 函数是任何编程语言中的核心元素,它们帮助我们将大型程序分解为更小的、易于管理的部分。在Go语言中,函数是通过 func 关键字定义的。理想的函数应当是独立的,完成单一任务。如果你发现某个函数正在执行多个任务ÿ…...

Android12_13左上角状态栏数字时间显示右移动
文章目录 问题场景解决问题 一、基础资料二、代码追踪三、解决方案布局的角度解决更改paddingStart 的默认值设置marginLeft 值 硬编码的角度解决 问题场景 1)早期一般屏幕都是方形的,但是曲面屏,比如:好多车机Android产品、魔镜…...

望繁信科技携流程智能解决方案亮相CNDS 2024新能源产业数智峰会
9月13日,CNDS 2024中国新能源产业数智峰会在北京圆满落幕。本次峰会以“走向数字新能源”为主题,汇聚了来自新能源领域的顶尖领袖、专家学者及知名企业代表,共同探讨数字化技术在新能源行业中的创新应用和发展趋势。上海望繁信科技有限公司&a…...

nginx负载均衡(轮询与权重)
文章目录 1. nginx的介绍2. nginx使用场景3. nginx在windows的下载与安装4. nginx的简单使用5. nginx进行轮询测试6. nginx进行权重测试7. 总结 1. nginx的介绍 Nginx(engine x)是一个高性能的HTTP和反向代理web服务器,同时也是一个开源的、…...

【计算机网络】网络通信中的端口号
文章目录 一、引入端口号二、端口号的作用三、端口号的确定 在TCP/IP协议中,传输层有两个重要的协议:TCP(传输控制协议)和UDP(用户数据报协议)。TCP用于提供可靠的数据传输,而UDP则适合用于广播…...

Python 解析 JSON 数据
1、有如下 JSON 数据,存放在 data.json 文件: [{"id":1, "name": "小王", "gender": "male", "score": 96.8}, {"id":2, "name": "小婷", "gender&qu…...
利用LlamaIndex构建ARG本地知识库
文章目录 1. 环境准备2. 启用诊断日志3. 配置本地模型4. 配置本地向量模型5. LlamaIndex全局配置6. 创建 PGVectorStore7. 从数据库加载数据8. 文本分割器: SpacyTextSplitter9. 配置管道10. 创建向量存储索引11 .指定响应模式,以及启用流式响应 在现代的人工智能应…...
PCM的缺点
PCM的主要缺点包括需要较大的数据传输带宽和存储空间,导致无法实现高压缩比,相对较低的数据压缩效率。 PCM(脉冲编码调制)作为一种无损编码技术,虽然能够保留原始信号的完整性,适用于需要高保…...

Appium+python自动化(十六)- ADB命令
简介 Android 调试桥(adb)是多种用途的工具,该工具可以帮助你你管理设备或模拟器 的状态。 adb ( Android Debug Bridge)是一个通用命令行工具,其允许您与模拟器实例或连接的 Android 设备进行通信。它可为各种设备操作提供便利,如安装和调试…...
【磁盘】每天掌握一个Linux命令 - iostat
目录 【磁盘】每天掌握一个Linux命令 - iostat工具概述安装方式核心功能基础用法进阶操作实战案例面试题场景生产场景 注意事项 【磁盘】每天掌握一个Linux命令 - iostat 工具概述 iostat(I/O Statistics)是Linux系统下用于监视系统输入输出设备和CPU使…...

全球首个30米分辨率湿地数据集(2000—2022)
数据简介 今天我们分享的数据是全球30米分辨率湿地数据集,包含8种湿地亚类,该数据以0.5X0.5的瓦片存储,我们整理了所有属于中国的瓦片名称与其对应省份,方便大家研究使用。 该数据集作为全球首个30米分辨率、覆盖2000–2022年时间…...
vue3 定时器-定义全局方法 vue+ts
1.创建ts文件 路径:src/utils/timer.ts 完整代码: import { onUnmounted } from vuetype TimerCallback (...args: any[]) > voidexport function useGlobalTimer() {const timers: Map<number, NodeJS.Timeout> new Map()// 创建定时器con…...

12.找到字符串中所有字母异位词
🧠 题目解析 题目描述: 给定两个字符串 s 和 p,找出 s 中所有 p 的字母异位词的起始索引。 返回的答案以数组形式表示。 字母异位词定义: 若两个字符串包含的字符种类和出现次数完全相同,顺序无所谓,则互为…...
JAVA后端开发——多租户
数据隔离是多租户系统中的核心概念,确保一个租户(在这个系统中可能是一个公司或一个独立的客户)的数据对其他租户是不可见的。在 RuoYi 框架(您当前项目所使用的基础框架)中,这通常是通过在数据表中增加一个…...

接口自动化测试:HttpRunner基础
相关文档 HttpRunner V3.x中文文档 HttpRunner 用户指南 使用HttpRunner 3.x实现接口自动化测试 HttpRunner介绍 HttpRunner 是一个开源的 API 测试工具,支持 HTTP(S)/HTTP2/WebSocket/RPC 等网络协议,涵盖接口测试、性能测试、数字体验监测等测试类型…...
适应性Java用于现代 API:REST、GraphQL 和事件驱动
在快速发展的软件开发领域,REST、GraphQL 和事件驱动架构等新的 API 标准对于构建可扩展、高效的系统至关重要。Java 在现代 API 方面以其在企业应用中的稳定性而闻名,不断适应这些现代范式的需求。随着不断发展的生态系统,Java 在现代 API 方…...

RushDB开源程序 是现代应用程序和 AI 的即时数据库。建立在 Neo4j 之上
一、软件介绍 文末提供程序和源码下载 RushDB 改变了您处理图形数据的方式 — 不需要 Schema,不需要复杂的查询,只需推送数据即可。 二、Key Features ✨ 主要特点 Instant Setup: Be productive in seconds, not days 即时设置 :在几秒钟…...
基于 HTTP 的单向流式通信协议SSE详解
SSE(Server-Sent Events)详解 🧠 什么是 SSE? SSE(Server-Sent Events) 是 HTML5 标准中定义的一种通信机制,它允许服务器主动将事件推送给客户端(浏览器)。与传统的 H…...