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基础知识

主要功能:
  1. 图像读取和显示

    • 读取图像:cv2.imread()
    • 显示图像:cv2.imshow()
    • 保存图像:cv2.imwrite()
  2. 图像处理

    • 图像转换:cv2.cvtColor()
    • 图像平滑:cv2.GaussianBlur(), cv2.medianBlur()
    • 边缘检测:cv2.Canny()
  3. 几何变换

    • 图像缩放:cv2.resize()
    • 旋转和仿射变换:cv2.warpAffine()
    • 透视变换:cv2.warpPerspective()
  4. 特征检测与描述

    • 角点检测:cv2.cornerHarris()
    • 特征匹配:cv2.BFMatcher(), cv2.FlannBasedMatcher()
  5. 视频处理

    • 捕捉视频:cv2.VideoCapture()
    • 播放视频:cv2.imshow()(与图像处理相同)
  6. 机器学习与深度学习

    • 加载预训练模型: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 示例代码处理结果

其中:

  1. 读取图像cv2.imread('test.jpg)

  2. 转换为灰度图cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)

  3. 图像平滑cv2.GaussianBlur(gray_image, (5, 5), 0)

  4. 边缘检测cv2.Canny(smoothed_image, 100, 200)

  5. 显示结果:使用 matplotlib 展示灰度图、平滑图像和边缘检测结果

10.3 处理视频

OpenCV 提供了全面的视频处理功能,主要包括以下几个方面:

  1. 读取视频

    • 打开视频文件或摄像头进行视频流读取。
    • 使用 cv2.VideoCapture() 进行视频捕捉。
  2. 显示视频

    • 显示视频帧或视频流。
    • 使用 cv2.imshow() 显示每一帧图像。
  3. 处理视频

    • 对视频帧进行各种图像处理操作,如颜色转换、滤镜应用、对象检测等。
  4. 写入视频

    • 将处理后的视频保存到文件中。
    • 使用 cv2.VideoWriter() 进行视频编写和保存。
  5. 视频属性获取

    • 获取视频的帧率、分辨率、总帧数等信息。
    • 通过 cv2.CAP_PROP_FPScv2.CAP_PROP_FRAME_WIDTHcv2.CAP_PROP_FRAME_HEIGHT 获取视频属性。
  6. 逐帧处理

    • 对每一帧进行个性化处理,例如去噪、边缘检测、特效添加等。
  7. 视频流处理

    • 实时处理来自摄像头的视频流,包括实时特效应用和流媒体处理。

这些功能使得 OpenCV 能够实现丰富的视频分析和处理任务,如视频编辑、运动跟踪、实时监控等。

10.4 跟踪

视频跟踪是计算机视觉中的一项重要任务,用于在视频序列中持续追踪特定的对象。OpenCV 提供了多种跟踪算法,可以用于实现目标跟踪功能。

主要功能:
  1. 初始化跟踪器

    • 使用预定义的跟踪器算法(如 KLT、MOSSE、CSRT 等)来初始化跟踪器。
  2. 目标检测

    • 在视频的第一帧中检测并确定要跟踪的目标区域。
  3. 跟踪目标

    • 在后续帧中持续追踪目标,更新目标的位置。
  4. 更新跟踪器

    • 根据每帧中的目标位置更新跟踪器。
  5. 可视化跟踪结果

    • 在视频帧上绘制跟踪结果,例如矩形框或轨迹。
常见跟踪器:
  • 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 算法 是一种经典的光流法,用于在视频序列中估计每一帧图像中像素的运动。它基于局部区域的假设,通过求解局部区域内光流的速度来实现目标的跟踪和运动估计。

核心思想
  1. 局部光流假设

    • 假设目标在连续帧之间的运动是局部一致的,即在小区域内所有像素的运动是相同的。
  2. 光流约束方程

    • 基于光流约束方程: 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 是光流的水平和垂直分量。
  3. 局部光流求解

    • 使用局部窗口内的像素梯度信息,通过最小二乘法来估计光流的速度。通常,采用 3 × 3 3 \times 3 3×3 的窗口进行光流的计算。
  4. 光流计算

    • 通过求解以下线性方程组得到光流速度:
      [ ∑ 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} [Ix2IxIyIxIyIy2][uv]=[IxItIyIt]
      其中, ∑ \sum 表示在局部窗口内的积分。
优点
  • 准确性:在平滑和一致的区域内能够提供较高的准确性。
  • 实现简单:相对简单的数学模型,易于实现。
缺点
  • 对大位移敏感:在目标快速移动或存在较大位移的情况下,光流计算的准确性可能降低。
  • 需要平滑区域:算法在具有纹理的区域效果较好,对于平坦区域或重复纹理区域可能不够准确。
应用场景
  • 运动检测:估计视频序列中物体的运动。
  • 目标跟踪:在视频流中追踪特定目标的运动。
  • 光流估计:用于图像对齐、稳定化和动作分析等。

Lucas-Kanade 算法因其简单有效的特性,广泛应用于各种计算机视觉任务中,是视频处理和目标跟踪中的基础算法之一。

如图10-6所示:
在这里插入图片描述

图 10-6:通过 LKTrack 类利用 Lucas-Kanade 算法进行跟踪

10.5 更多实例

10.5.1 图像修复

图像修复是指对图像中丢失或损坏的部分进行重建的过程。这个过程不仅包括用于恢复丢失数据或损坏部分的算法,还包括在照片编辑应用程序中去除不需要的元素,如红眼或物体。图像修复旨在填补图像中的缺失区域,使其恢复到尽可能完整和自然的状态。

主要步骤:
  1. 标记损坏区域

    • 确定图像中需要修复的区域,通常通过掩模图像标记这些区域。掩模图像中的标记区域会指示需要修复的部分。
  2. 选择修复算法

    • 选择适当的图像修复算法。例如,均值填补(Inpainting)方法使用周围像素的信息来填补损坏区域。Navier-Stokes 算法和纹理合成等方法也可用于不同类型的图像修复。
  3. 应用修复算法

    • 利用所选的算法对损坏区域进行修复。算法会根据周围区域的图像数据来填补缺失部分。
  4. 处理结果

    • 对修复后的图像进行后处理,以确保修复区域与周围区域自然融合。检查和调整修复效果,以实现更好的视觉效果。
应用场景:
  • 图像恢复:修复老旧或损坏的照片,使其恢复到原始状态。
  • 去除红眼:在照片编辑中去除红眼效果。
  • 物体去除:在照片中去除不需要的物体或标记,填补被去除部分的图像信息。
  • 遮挡修复:处理由于遮挡或图像损坏导致的缺失区域。

图像修复技术可以有效地恢复图像的完整性和视觉质量,广泛应用于图像编辑、数字修复以及计算机视觉等领域。

如图10-8所示:
在这里插入图片描述

图 10-8:用 OpenCV 进行图像修复的示例。左图显示了由用户标记的“破损”区域。右图显示了经过图像修复后的结果

10.5.2 利用霍夫变换检测直线

霍夫变换 是一种经典的图像处理技术,用于检测图像中的直线或其他形状。霍夫变换通过将图像空间的直线检测转换为参数空间的峰值检测,从而实现直线的检测。

核心思想
  1. 直线方程

    • 在笛卡尔坐标系中,直线方程为 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 θ 是直线的角度。
  2. 参数空间

    • 通过将每个图像中的点转换为参数空间中的直线表示,所有的直线将映射到参数空间中的一条曲线。
  3. 累加器

    • 在参数空间中,对每条曲线进行累加,形成一个累加器数组。直线的峰值对应于参数空间中的高响应值。
  4. 峰值检测

    • 在累加器中寻找峰值,这些峰值对应于图像中真实存在的直线。
霍夫变换步骤
  1. 边缘检测

    • 使用边缘检测算法(如 Canny 边缘检测)检测图像中的边缘点。
  2. 霍夫变换

    • 将每个边缘点转换为参数空间中的曲线,并在累加器中进行累加。
  3. 峰值检测

    • 在累加器中检测峰值,找到参数空间中的直线。
  4. 绘制直线

    • 根据检测到的直线参数,在原图像上绘制直线。
应用场景
  • 车道检测:用于自动驾驶系统中检测车道标线。
  • 建筑物结构分析:分析建筑物中的直线结构。
  • 图像校正:校正图像中的直线变形。

霍夫变换通过将图像空间中的问题转换到参数空间,能够有效检测直线,并广泛应用于各种计算机视觉任务中。

示例代码如下:

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 直线检测结果

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

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

相关文章

2024/9/11学校教的响应式前端能学到什么?

9.11 1)砌砖 确定整体框架,而不是想到一点写一点,类似盖大楼,不是想到哪盖到哪,先砌砖,再装修 砌砖前先划分好砌砖范围(初始化样式) 清除body自带的内外边距 * { margin: 0; padding: 0; }去掉li的小圆点…

【新片场-注册安全分析报告-无验证方式导致安全隐患】

前言 由于网站注册入口容易被黑客攻击,存在如下安全问题: 1. 暴力破解密码,造成用户信息泄露 2. 短信盗刷的安全问题,影响业务及导致用户投诉 3. 带来经济损失,尤其是后付费客户,风险巨大,造…

微信小程序开发第三课

1 wxml语法 1.1 模版语法 # 1 在页面 xx.js 的 Page() 方法的 data 对象中进行声明定义 # 2 在xx.wxml 中使用 {{}} 包裹,显示数据 # 3 可以显示如下,不能编写js语句或js方法-变量-算数运算-三元运算-逻辑判断# 4 只是单纯通过赋值,js中…

快速生成服务器响应json-server的安装和使用

json-server介绍地址:https://www.geeksforgeeks.org/json-server-setup-and-introduction/ 1.json-server是什么? 基于自定义的json文件,快速生成服务端响应,可用于前端调试接口 2.安装和卸载json-server 2.1 安装: 使用npm命令: npm install -g json-server 2.2 卸载 npm …

工厂方法模式和抽象工厂模式

工厂方法模式 一个工厂只能创建一种产品 工厂方法模式的结构 工厂方法模式包含以下4个角色 Product(抽象产品) ConcreteProduct(具体产品) Factory(抽象工厂) ConcreteFactory(具体工厂…

(论文解读)Visual-Language Prompt Tuning with Knowledge-guided Context Optimization

Comment: accepted by CVPR2023 基于知识引导上下文优化的视觉语言提示学习 摘要 提示调优是利用任务相关的可学习标记将预训练的视觉语言模型(VLM)适应下游任务的有效方法。基于CoOp的代表性的工作将可学习的文本token与类别token相结合,…

项目需求 | MySQL增量备份与恢复的完整操作指南

目录 一、MySql数据库增量备份的工作原理 1、全量备份与增量备份 2、增量备份原理 二、进行增量备份 步骤1:启用二进制日志 使用 SHOW VARIABLES 命令查看二进制日志状态 步骤2:执行增量备份脚本 三、使用增量备份恢复损坏的数据库 步骤1&#…

WSL安装Redis

前言 本来一直是在虚拟机的Ubuntu开发 但是 搞着搞着内存不足 导致我某些数据损坏了 然后目前迁移到Wsl开发 运行WSL的相较于虚拟机你不需要很多的性能开销! 我只是代码开发和git交互,如果是搞逆向还是虚拟机。 记录一下redis 安装卸载 免得以后又忘了…

java基于PDF底层内容流的解析对文本内容进行编辑

本文实现了基于坐标位置对PDF内容的底层修改而非覆盖,因此不会出现在某些高级PDF编辑器中可以移除插入内容或者文件随着编辑次数增多而大幅增大(原因是原内容还在文件中)的问题,而且使用的pdfbox是一个开源的、免费的PDF处理库&am…

SSHamble:一款针对SSH技术安全的研究与分析工具

关于SSHamble SSHamble是一款功能强大的SSH技术安全分析与研究工具,该工具基于Go语言开发,可以帮助广大研究人员更好地分析SSH相关的安全技术与缺陷问题。 功能介绍 SSHamble 是用于 SSH 实现的研究工具,其中包含下列功能: 1、针…

ESP01的AT指令连接到阿里云平台

物联网平台提供安全可靠的设备连接通信能力,支持设备数据采集上云,规则引擎流转数据和云端数据下发设备端。此外,也提供方便快捷的设备管理能力,支持物模型定义,数据结构化存储,和远程调试、监控、运维。总…

移动UI案例:工具类app整套案例

工具类App是指提供各种实用工具和功能的手机应用程序。这些工具可以包括但不限于日历、闹钟、备忘录、翻译、计算器、单位转换、天气预报、地图导航、音乐播放器、相机、视频编辑等。这些工具类App能够帮助用户解决日常生活和工作中的各种问题,提高效率和便利性。 …

Java数据结构(十)——冒泡排序、快速排序

文章目录 冒泡排序算法介绍代码实现优化策略复杂度和稳定性 快速排序算法介绍优化策略非递归实现代码演示复杂度和稳定性 冒泡排序 算法介绍 冒泡排序是一种简单的排序算法。它重复地遍历要排序的数列,一次比较两个元素,如果它们的顺序错误就交换。遍历…

多线程篇(其它容器- CopyOnWriteArrayList)(持续更新迭代)

一、CopyOnWriteArrayList(一) 1. 简介 并发包中的并发List只有CopyOnWriteArrayList。 CopyOnWriteArrayList是一个线程安全的ArrayList,对其进行的修改操作都是在底层的一个复制的数 组(快照)上进行的&#xff0…

redis 基本数据类型—string类型

一、介绍 Redis 中的字符串,直接就是按照二进制数据的方式存储的,不会做任何的编码转换。 Redis对于 string 类型,限制了大小最大是512M 二、命令 SET 将 string 类型的 value 设置到 key 中。如果 key 之前存在,则覆盖&#…

Jwt、Filter、Interceptor

目录 JWT(Json Web Token) jwt令牌 组成 应用场景 生成令牌 解析令牌 登录实例 Filter过滤器 Filter Filter登录校验 Interceptor拦截器 Interceptor 拦截路径 执行流程 登录实例 JWT(Json Web Token) jwt令牌 定义了一种简洁的、自包含的格式,…

二、(JS)JS中常见的键盘事件

一、常见的键盘事件 onkeydown 某个键盘按键被按下onkeypress 某个键盘按键被按下onkeyup 某个键盘按键被松开 二、事件的执行顺序 onkeydown、onkeypress、onkeyup down 事件先发生;press 发生在文本被输入;up …

【大模型理论篇】大模型周边自然语言处理技术(NLP)原理分析及数学推导(Word2Vec、TextCNN、Gated TextCNN、FastText)

1. 背景介绍 进入到大模型时代,似乎宣告了与过去自然语言处理技术的结束,但其实这两者并不矛盾。大模型时代,原有的自然语言处理技术,依然可以在大模型的诸多场景中应用,特别是对数据的预处理阶段。本篇主要关注TextCN…

使用Python生成多种不同类型的Excel图表

目录 一、使用工具 二、生成Excel图表的基本步骤 三、使用Python创建Excel图表 柱形图饼图折线图条形图散点图面积图组合图瀑布图树形图箱线图旭日图漏斗图直方图不使用工作表数据生成图表 四、总结 Excel图表是数据可视化的重要工具,它通过直观的方式将数字信…

PCIe进阶之TL:First/Last DW Byte Enables Rules Traffic Class Field

1 First/Last DW Byte Enables Rules & Attributes Field 1.1 First/Last DW Byte Enables Rules Byte Enable 包含在 Memory、I/O 和 Configuration Request 中。本文定义了相应的规则。Byte Enable 位于 header 的 byte 7 。对于 TH 字段值为 1 的 Memory Read Request…