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(脉冲编码调制)作为一种无损编码技术,虽然能够保留原始信号的完整性,适用于需要高保…...

【C语言】(指针系列四)回调函数+qsort函数
一、回调函数 回调函数就是通过函数指针调用的函数 如果你把函数的指针作为参数传递给另外一个函数,当这个指针被用来调用其所指向的函数时,被调用的函数就是回调函数。回调函数并不是一个单一的函数实现的,而是在某种情况下,编…...

全面理解tensor编程中矩阵的行和列
经常会在编程中遇到理解矩阵行和列的事情。 1、要明确无论这个张量有多少维度,它的矩阵乘法都只能作用于最后两个维度。 例如: import torcha torch.rand([64, 32, 3, 4]) b torch.rand([64, 32, 3, 4])c torch.matmul(a, b.transpose(2, 3)) # 交…...

【Kubernetes】常见面试题汇总(十)
目录 29.简述 Kubernetes 自动扩容机制? 30.简述 Kubernetes Service 类型? 31.简述 Kubernetes Service 分发后端的策略? 32.简述 Kubernetes Headless Service ? 29.简述 Kubernetes 自动扩容机制? (…...

CSS —— 界面布局
flexbox - 弹性盒子布局(弹性布局) 一维方向,横纵向排列。 采用flex布局的元素,称为 Flex 容器(flex container),简称"容器" flex-direction 用于设置主轴方向;子元素默…...

SpringBoot万级并发-jemeter-Address already in use: connect
一、场景 用Jmeter压力单测接口的时候,发现报 Response code:Non HTTP response code: java.net.BindException Response message:Non HTTP response message: Address already in use: connect 然后我这边是wondows的电脑操作压测的,操作系统win10&…...

P1228 地毯填补问题
 #include<bits/stdc.h> using namespace std; #define qw dfs(zxl-1,zyl-1,zx,zy,l); #define we dfs(zxl-1,zyl,zx,zyl,l); #define er dfs(zxl,zyl-1,zxl,zy,l); #define rt dfs(zxl,zyl,zxl,zyl,l);void dfs(int x,int y,int zx,int zy,int…...

【计算机网络】UDP TCP介绍
UDP & TCP介绍 UDP报文格式报文内容介绍端口号报文长度校验和载荷 TCP报文格式初步了解TCP机制确认应答超时重传连接管理滑动窗口流量控制拥塞控制紧急传输数据推送延时应答捎带应答面向字节流异常处理心跳机制 UDP 和 TCP 的区别 UDP 报文格式 对于网络协议, 本质上就是…...

JDBC初相识
文章目录 JDBC的由来JDBC的好处 JDBC核心API的介绍JDBC会用到的包JDBC四个核心对象JDBC访问数据库的步骤 客户端操作MySQL数据库的方式 使用第三方客户端来访问MySQL:SQLyog、Navicat 使用MySQL自带的命令行方式 通过Java来访问MySQL数据库,今天要学习…...

Go语言现代web开发07 map字典
Maps are complex data types used to store key-value pairs. Each key can appear only once on the map and can be used to find the value paired with that key. The default value for the map is nil. A nil map has no keys and keys cannot be added. 映射是用于存储…...

AI工具一键制作爆火的“汉语新解“卡片!
最近出现了一种很火的新玩法“汉语新解”。 AI把一个词汇,以一种特殊的视角,用幽默、讽刺等方式重新定义,然后生成一张精美的卡片。 这个玩法和之前我发的的吐槽工具玩法类似,主打的就是一个新颖、情绪释放。 今天教大家怎么快速…...