当前位置: 首页 > news >正文

使用OpenCV进行视频边缘检测:案例Python版江南style

1. 引言

本文将演示如何使用OpenCV库对视频中的每一帧进行边缘检测,并将结果保存为新的视频文件。边缘检测是一种图像处理技术,它可以帮助我们识别出图像中不同区域之间的边界。在计算机视觉领域,这项技术有着广泛的应用,比如物体识别、运动分析等。

2. 环境准备

为了运行本示例,您需要安装Python以及OpenCV库。可以通过pip来安装OpenCV:

pip install opencv-python

确保您的系统上已经有一个可用的视频文件,该文件将作为输入提供给程序。

3. 代码详解

接下来,我们将逐步解析用于实现视频边缘检测的Python代码。

3.1 导入库与变量定义

首先导入必要的库并设置输入输出视频路径。

import cv2  # 导入OpenCV库video_path = r"C:\Users\20220\Desktop\275954384_nb2-1-16.mp4"  # 输入视频文件路径
output_path = r"C:\Users\20220\Desktop\edge_detected_video.avi"  # 输出视频文件路径

这里r前缀表示原始字符串,避免转义字符问题。

3.2 视频文件的读取

接下来,我们使用cv2.VideoCapture函数来打开指定路径下的视频文件。

# 打开指定路径下的视频文件
cap = cv2.VideoCapture(video_path)# 检查是否成功打开视频文件
if not cap.isOpened():print("无法打开视频文件")exit()

这里我们还检查了视频文件是否成功被打开。如果未能打开(例如文件路径错误或格式不支持),程序将打印错误信息并退出。

3.3 获取视频属性

为了正确配置输出视频,我们需要获取输入视频的一些关键属性,比如帧率、宽度和高度。

# 获取视频帧率
fps = cap.get(cv2.CAP_PROP_FPS)
frame_width = int(cap.get(cv2.CAP_PROP_FRAME_WIDTH))
frame_height = int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT))

这些参数对于保持输出视频与原始视频的一致性非常重要。

3.4 创建输出视频对象

基于之前获取的信息,我们可以创建一个VideoWriter对象,用来保存处理后的视频帧。

# 创建VideoWriter对象用于保存处理后的视频
fourcc = cv2.VideoWriter_fourcc(*'XVID')
out = cv2.VideoWriter(output_path, fourcc, fps, (frame_width, frame_height), isColor=False)

这里选择了XVID编码器,并且设置为灰度模式(因为边缘检测的结果是黑白图像)。

3.5 设置Canny边缘检测参数

定义用于Canny边缘检测算法的两个阈值。

# Canny边缘检测的阈值
canny_threshold1 = 100
canny_threshold2 = 200

这两个阈值决定了边缘强度的最小值和最大值。通过调整它们,可以控制边缘检测的效果。

3.6 处理视频帧

现在进入循环中逐帧读取视频,并对每一帧进行处理。

while True:# 从视频流中读取下一帧ret, frame = cap.read()# 如果没有更多帧可以读取,跳出循环if not ret:break# 对当前帧进行高斯模糊以减少噪声blurred_frame = cv2.GaussianBlur(frame, (5, 5), 0)# 将当前帧转换成灰度图像gray_frame = cv2.cvtColor(blurred_frame, cv2.COLOR_BGR2GRAY)# 对灰度图像进行Canny边缘检测edges = cv2.Canny(gray_frame, canny_threshold1, canny_threshold2)

此段代码首先读取一帧,然后对其进行预处理(包括去噪和转灰度),最后应用Canny算法来进行边缘检测。

3.7 显示和保存处理后的帧

在完成边缘检测后,我们希望能够在屏幕上显示结果,并将这些处理过的帧写入到输出视频文件中。

    # 显示含有边缘的图像cv2.imshow('Edge Detected Video', edges)# 写入处理后的帧到输出视频out.write(edges)

使用cv2.imshow函数可以实时查看每一帧经过边缘检测后的效果。同时,通过out.write(edges)方法,我们将每帧的结果保存至之前创建的VideoWriter对象中。

此外,在循环内还添加了按键监听逻辑,以便用户可以通过按“q”键来手动终止程序执行:

    # 检测是否有按键事件,如果是'q'键则中断循环if cv2.waitKey(1) & 0xFF == ord('q'):break
3.8 资源释放

当所有帧都已经被处理或用户主动中断时,我们需要正确地关闭所有打开的资源,以避免内存泄漏或其他潜在问题。

# 释放资源
cap.release()
out.release()
cv2.destroyAllWindows()

这里调用了release()方法来关闭视频捕获器和写入器,以及cv2.destroyAllWindows()来销毁所有由OpenCV创建的窗口。
###运行结果
在这里插入图片描述

Python版江南style

4. 结论

本文展示了如何利用Python与OpenCV实现视频中的边缘检测功能。通过这个例子,您不仅学会了如何读取、处理并保存视频数据,同时也掌握了基本的图像处理技术之一——Canny边缘检测。这种能力对于从事计算机视觉相关工作的开发者来说是非常有用的。

相关文章:

使用OpenCV进行视频边缘检测:案例Python版江南style

1. 引言 本文将演示如何使用OpenCV库对视频中的每一帧进行边缘检测,并将结果保存为新的视频文件。边缘检测是一种图像处理技术,它可以帮助我们识别出图像中不同区域之间的边界。在计算机视觉领域,这项技术有着广泛的应用,比如物体…...

DataWhale10月动手实践——Bot应用开发task04学习笔记

一、图像流 1. 什么是图像流? 图像流是一种直观的图像处理流程工具,用户可以灵活组合各类图像处理模块。该系统将不同的图像处理工具模块化,并通过可视化界面,将这些模块以拖拽方式组合,构建完整的处理流程。用户可以…...

关于 IntelliJ IDEA 2024 安装使用

补丁文件...

React是如何工作的?

从编写组件到最后屏幕生成界面,如上图所示,我们现在需要知道的就是后面几步是如何运行的。 概述 这张图解释了 React 渲染过程的几个阶段: 渲染触发:通过更新某处的状态来触发渲染。渲染阶段:React 调用组件函数&…...

llama.cpp 去掉打印,只显示推理结果

llama.cpp 去掉打印,只显示推理结果 1 llama.cpp/common/log.h #define LOG_INF(...) LOG_TMPL(GGML_LOG_LEVEL_INFO, 0, __VA_ARGS__) #define LOG_WRN(...) LOG_TMPL(GGML_LOG_LEVEL_WARN, 0, __VA_ARGS__) #define LOG_ERR(…...

Word、PDF转换为图片Java

Word、PDF转换为图片Java 需求要在小程序端展示文档内容,所以将文档每页转换为图片后显示 参考和其他等方案: https://blog.csdn.net/strggle_bin/article/details/140599514 https://www.modb.pro/db/566986 https://blog.csdn.net/spring_is_comin…...

iOS IPA上传到App Store Connect的三种方案详解

引言 在iOS应用开发中,完成开发后的重要一步就是将IPA文件上传到App Store Connect以便进行测试或发布到App Store。无论是使用Xcode进行原生开发,还是通过uni-app、Flutter等跨平台工具生成的IPA文件,上传到App Store的流程都是类似的。苹果…...

Java中的Arrays类

java.util.Arrays是一个非常实用的类,提供了许多静态方法来操作数组,如排序、查找、复制和填充等。 1. toString - 将数组转换为字符串 // 导入java.util.Arrays类 import java.util.Arrays;public class ArraysExample {public static void main(Stri…...

GUI编程

GUI编程 【Java从0到架构师课程】笔记 GUI简介 GUI:图形用户界面,在计算机中采用图形的方式显示用户界面 java的GUI开发 AWT:java最早推出的GUI编程开发包,界面风格跟随操作系统SWT:eclipse就是java使用SWT开发的Sw…...

(multi)map和set--C++

文章目录 一、序列式容器和关联式容器二、set系列的使用1、set和multiset参考文档2、set类的介绍3、set的构造和迭代器4、set的增删查5、insert和迭代器遍历使用样例:6、find和erase使用样例:7、multiset和set的差异 三、map系列的使用1、map和multimap参…...

jmeter响应断言放进csv文件遇到的问题

用Jmeter的json 断言去测试http请求响应结果,发现遇到中文时出现乱码,导致无法正常进行响应断言,很影响工作。于是,察看了其他测试人员的解决方案,发现是jmeter本身对编码格式的设置导致了这一问题。解决方案是在jmete…...

复旦大学全球供应链研究中心揭牌,合合信息共话大数据赋能

10月13日,复旦大学全球供应链研究中心(以下简称“中心”)揭牌仪式在复旦大学管理学院政立院区隆重举行。我国的供应链体系庞大复杂,在百年未有之大变局下,保障产业链供应链安全已成为我国的重要战略目标。中心的设立旨…...

达那福发布新品音致系列:以顶尖降噪技术,开启清晰聆听新篇章

近日,国际知名助听器品牌达那福推出其最新研发的音致系列助听器。该系列产品旨在通过顶尖的声音处理技术,直面助听器市场中普遍存在的挑战——如何在噪声环境中提供清晰的语音辨识。 根据助听器行业协会2022年的调查数据,高达86%的佩戴者认为…...

当物理学奖遇上机器学习:创新融合的里程碑

作为一名程序员,看到 2024 年诺贝尔物理学奖颁发给机器学习与神经网络领域研究者,心中满是感慨与思考。 从编程技术角度出发,这意味着传统编程理念与物理思维有了更紧密的结合。在以往的编程中,算法优化多侧重于数据结构和计算效率…...

模拟电路2

BJT双极性晶体管 1.1 BJT共射特性曲线 输入特性: iB f(uBE)|UceC 定量分析,确定只有一个变量 输出特性 放大区:发射结正偏,集电结反偏 截至区:双结反偏 CE断路 饱和区:双结正偏 UCEs0.3 CE类似于开关闭…...

大数据面试题整理——MapReduce

系列文章目录 第一章 HDFS面试题 第二章 MapReduce面试题 文章目录 系列文章目录一、请简要解释一下 MapReduce 的工作原理。二、什么是 map 函数和 reduce 函数?它们的作用分别是什么?三、如何处理数据倾斜问题在 MapReduce 中?四、在 MapR…...

【景观生态学实验】实验一 ArcGIS地理数据处理及制图基础

实验目的 1.掌握ArcGIS软件基本操作:通过实验操作与学习,熟练掌握ArcGIS软件相关的基本操作,包括界面熟悉、工具栏使用、数据的加载和保存、基本数据处理操作等; 2.掌握如何使用ArcGIS进行影像拼接及裁剪:通过实验操作与学习&am…...

今年双十一最值得入手的好物有哪些?双十一值得选购的好物盘点!

在这个全民狂欢的购物盛宴——双十一,每一个角落都弥漫着诱人的优惠与不可错过的精品。从科技潮品到生活必需品,从时尚尖货到家居好物,无数精选商品在这一季集中绽放,等待着慧眼识珠的你将它们带回家,今年的双十一&…...

【OpenCV】人脸识别方法

代码已上传GitHub:plumqm/OpenCV-Projects at master EigenFace、FisherFace、LBPHFace 这三种方法的代码区别不大所以就一段代码示例。 EigenFace与FisherFace 1. 将人脸图像展开为一维向量,组成训练数据集 2. PCA(EigenFace)或…...

xxl-job定时任务

学习中心 清理Redis中的历史榜单: 持久化榜单数据: 创建历史榜单表: 支付服务 待退款订单检查: 未支付订单检查: 交易服务 退款单处理: 促销中心 优惠券发放状态处理:...

C#从零开始学习(如何构建应用)(1)

开始使用 C# 本章所有的代码都放在 https://github.com/hikinazimi/head-first-Csharp 创建一个控制台应用 打开Visual Studio 2019 创建项目 选择控制台应用程序 创建后点击运行,就可以在控制台打印Hello World 构建一个游戏(创建WPF项目) 构建游戏的步骤 首先创建WPF项…...

OpenCV高级图形用户界面(7)获取指定窗口的属性值函数getWindowProperty()的使用

操作系统:ubuntu22.04 OpenCV版本:OpenCV4.9 IDE:Visual Studio Code 编程语言:C11 算法描述 提供窗口的参数。 函数 getWindowProperty 返回窗口的属性。 cv::getWindowProperty() 函数用于获取指定窗口的属性值。这个函数允许你查询窗口…...

Java实现文件上传功能

目录 1、准备工作 2、注意事项 3、jsp页面代码 4、Servlet 5、注册Servlet 1、准备工作 导入依赖:commons-fileupload和commons-io 2、注意事项 ①为保证服务器安全,上传文件应该放在外界无法直接访问的目录下,比如WEB-INF目录下 ②为…...

Leetcode|24. 两两交换链表中的节点 ● 19.删除链表的倒数第N个节点 ● 面试题 02.07. 链表相交 ● 142.环形链表II

24. 注意:涉及头节点的修改或者删除时,最好设置一个虚拟的头结点,方便简化代码,不必进行是否为头节点的的判断,简化code class Solution { public:ListNode* swapPairs(ListNode* head) {ListNode* dummyHead new Li…...

OpenCV学习笔记5——图像的数值计算

目录 一、简单数值计算 二、opencv中提供函数进行计算 三、cv2.addWeighted 一、简单数值计算 在opencv中,我们有许多可以获取图像各类数值的办法,许多函数能获得各种方面的数据。但如果我们什么都不用,仅仅对图像上每一个点做加法运算会…...

P3137 [USACO16FEB] Circular Barn S

P3137 [USACO16FEB] Circular Barn S 思路&#xff1a;数据范围为O(n^2)那么因此我们可以暴力&#xff0c;那么如何进行构造呢&#xff1f;首先假设一头奶牛在a&#xff0c;一头在b&#xff0c;如果要使一个到b&#xff0c;另一个到c&#xff0c;&#xff08;a<b<c)&…...

yocto编辑软件包-devtool的使用方法

之前用了很多次devtool&#xff0c;总是忘记用法&#xff0c;故此记录一下。 假设你有一个软件包名叫foo&#xff0c;并且已经下载编译过&#xff0c;需要修改它的源码并生成patch 生成修改工作区 devtool modify foo modify命令会将foo的源码压缩包解压到build/workspace/so…...

51单片机快速入门之 串行通信 2024/10/21

51单片机快速入门之 串行通信 并行通信: 好处:传输快 适合短距离通信弊端:占用大量io 接线形式为8对8 串行通信 异步通信: 数据一帧一帧传送,传输完一帧之后,可继续或者等待(等待时为高电平) 其帧细分为(图片来源) 起始位:数据帧开始,一定为 0 外部设备只有接受到 0 之后…...

webpack 老项目升级记录:node-sass 规定的 node v8 提升至支持 node v22

老项目简介 技术框架 vue 2.5.17webpack 4.16.5"webpack-cli": "3.1.0""node-sass": "^4.7.2" 几个阶段 第一步&#xff1a;vue2 升级到最新 第一步&#xff1a;升级 vue2 至最新版本&#xff0c;截止到目前&#xff08;2024-10-…...

【wpf】08 xml文件的存取操作

在使用wpf编程过程中&#xff0c;会用到xml的配置文件&#xff0c;实现对其读取和存储的操作是必须的。 1 xml说明 可扩展标记语言 (Extensible Markup Language, XML) &#xff0c;标准通用标记语言的子集&#xff0c;可以用来标记数据、定义数据类型&#xff0c;是一种允许…...