Python计算机视觉 第10章-OpenCV

news2024/9/21 19:40:36

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 * rho
        y0 = b * rho
        x1 = 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.coloradmin.cn/o/2139237.html

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

相关文章

[产品管理-20]:NPDP新产品开发 - 18 - 产品设计与开发工具 - 初始设计与规格定义

目录 前言: 一、什么是初始设计规格 二、初始设计与规格定义的工具 2.1 用户 - 功能性设计 1、定义与目的 2、主要内容 3、重要性 4、注意事项 2.2 用户 - 可用性设计 1、定义与目的 2、主要原则 3、实施步骤 4、重要性 2.3 生产 - 可生产性设计 1、…

Linux FTP服务问题排查

一、问题描述 最近linux虚拟机重启之后发现,FTP服务总是不正常,工具无法连接。 二、排查及处理过程 1、检查ftp服务是否正常安装:yes rpm -qa|grep vsftpd 2、检查ftp服务是否正常启动: systemctl status vsftpd 启动vsftpd sys…

Lnux-gcc/g++使用

目录 1.gcc/g介绍 1.什么是 gcc / g 2.gcc/g指令格式 2. gcc / g 实现程序翻译的过程 1.预处理(进行宏替换) 2.编译(生成汇编) 3.汇编(生成机器可识别代码) 4.连接(生成可执行文件或库文件) 1.gcc/g介绍 1.什么…

浪潮信息首推3秒智能控温!告别服务器开机噪音

在当前的数据中心运维实践中,运维人员在部署服务器时常被“飞机起飞”般的开机噪音所困扰。服务器刚刚接通电源,其内部元件尚处于预热待命状态,而风扇却已全速运转,这不仅加剧了噪音污染,还拖慢了启动速度,…

电子电气架构 --- 基于ISO 26262的车载电子软件开发流程

我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 屏蔽力是信息过载时代一个人的特殊竞争力,任何消耗你的人和事,多看一眼都是你的不…

kettle从入门到精通 第八十五课 ETL之kettle kettle中javascript步骤调用外部javascript/js文件

场景:交流学习群里面有小伙伴咨询kettle中的javascript代码步骤如何调用外部js文件中的函数,觉得有点意思的,于是就抽时间整理了一下。 1、外部js文件为test.js,代码如下: function test(param){return "接收到了…

2024CSP-J初赛全真模拟卷选择题篇(原创,难度偏简单)

注意,本卷由再临TSC原创,禁止转载! 本卷难度偏简单,若想要通过初赛本卷应拿80分左右 查看答案的方法: if(设备"PC") { 把光标移到答案上面,选中答案,就会显示(); } …

计算机的错误计算(九十四)

摘要 探讨 的计算精度问题。 正如其它许多函数或运算一样,以2为底的对数运算,也包含在 IEEE 754-2019 的列表中[1]。 例1. 已知 计算 不妨用Go代码计算: package mainimport ("fmt""math" )func main() {x : 0.…

Java网络编程 TCP通信(Socket 与 ServerSocket)

1.TCP通信原理 TCP通信涉及两个端点:客户端和服务器。服务器端使用 ServerSocket 监听特定端口,等待客户端的连接请求。客户端使用 Socket 连接到服务器的IP地址和端口。一旦连接建立,双方就可以通过输入输出流进行数据交换. ServerSocket是…

PHP泛目录生成源码,可生成长尾关键词页面,带使用方法视频教程

介绍: 真正的好东西,搞网站优化seo从业必备。可以快速提升网站权重,带来的流量哗哗的 PHP泛目录生成源码 可生成新闻页面和关键词页面 带使用方法视频教程 泛目录可以用来提升网站收录和排名 合理运用目录可以达到快速出词和出权重的效果…

福建科立讯通信 指挥调度管理平台 SQL注入漏洞

北峰通信-福建科立讯通信 指挥调度管理平台 SQL注入漏洞 厂商域名和信息收集 域名: 工具sqlmap python sqlmap.py -u "http://ip:端口/api/client/down_file.php?uuid1" --batch 数据包 GET /api/client/down_file.php?uuid1%27%20AND%20(SELECT%20…

MYSQL基础-多表操作-事务-索引

1. 多表设计 概述 项目开发中,在进行数据库表结构设计时,会根据业务需求及业务模块之间的关系,分析并设计表结构,由于业务之间相互关联,所以各个表结构之间也存在着各种联系,基本上分为三种: …

云计算服务的底层,虚拟化技术的实现原理

虚拟化技术: 一、 从cpu说起, intel和amd等cpu制造商 为了提高其cpu对 虚拟化程序的运算速度, 给cpu硬件里面 增加了指令集 VMLAUNCH, VMRESUME, VMEXIT, VMXOFF 这些指令集称为硬件辅助虚拟化技术的指令集。 ---------------------…

探索Python的Excel世界:openpyxl的魔法之旅

文章目录 探索Python的Excel世界:openpyxl的魔法之旅背景:为什么选择openpyxl?什么是openpyxl?如何安装openpyxl?简单的库函数使用方法场景应用:openpyxl在实际工作中的应用常见bug及解决方案总结 探索Pyth…

倒序循环(一)

题目描述 输入一个正整数n,输出从 n~ 1 递减的序列。 输入格式 一行一个整数 n 输出格式 n 行,每行一个符合题目要求的整数 样例数据 样例输入#1 5样例输出#1 5 4 3 2 1样例输入#2 6样例输出#2 6 5 4 3 2 1数据范围 对于100%的数据&#xff…

(c++)用取模符%、除运算判断是否是某个数的倍数,判断个位十位是否有某个数

结果易懂&#xff0c;但凡和7有关&#xff0c;都输出相应的关系。关系分为三种&#xff0c;7的倍数&#xff0c;十位是7&#xff0c;个位是7 #include<iostream>using namespace std;int main() {for (int num 1; num < 100; num){if (num % 7 0)//是7的倍数{cout …

51单片机快速入门之按键应用拓展

51单片机快速入门之按键应用拓展 LED的点动控制: 循环检测,当key 为0 时 led 亮 反之为熄灭 while(1){ if(key!1) { led0; }else { led1; } } LED的锁定控制: 当按钮按下,led取反值 while(1) { if(key!1) { led!led; } } LED的4路抢答控制: bz默认为0 !bz 取反值,循环启动…

git快熟

Git版本控制 内容背景集中式与分布式版本控制安装git代码托管服务Git必要配置公钥和私钥注册gitee配置ssh公钥实现远程仓库与本地仓库免密登录git常用命令git|全局设置获取git仓库工作区&#xff0c;暂存区&#xff0c;版本库 概念本地仓库操作远程仓库提交git分支操作idea集成…

<Linux> 进程间通信

目录 一、进程间通信介绍 1. 进程间通信概念 2. 进程间通信目的 3. 进程间通信的本质 4. 进程间通信发展 5. 进程间通信分类 管道&#xff08;文件缓冲区&#xff09; System V IPC POSIX IPC 二、管道 1. 匿名管道 1.1 匿名管道原理 1.2 pipe系统调用 1.3 匿名管道的使用 1.4…

vue3 透传 Attributes

前言 Vue 3 现在正式支持了多根节点的组件&#xff0c;也就是片段&#xff01; Vue 2.x 遵循单根节点组件的规则&#xff0c;即一个组件的模板必须有且仅有一个根元素。 为了满足单根节点的要求&#xff0c;开发者会将原本多根节点的内容包裹在一个<div>元素中&#x…