教程1_图像视频入门

一、图像入门

1、cv2.imread()函数

  cv2.imread() 是 OpenCV 库中的一个函数,用于读取图像文件。下面是 cv2.imread() 函数的基本介绍和使用方法:

函数定义

cv2.imread(filename, flags=cv2.IMREAD_COLOR)

参数

  • filename:要读取的图像的路径和文件名。
  • flags:这是一个可选参数,用于指定读取图像的方式。常用的选项有:
    • cv2.IMREAD_COLOR:默认参数,读取一张彩色图像。这是任何图像加载的默认标志。
    • cv2.IMREAD_GRAYSCALE:以灰度模式读取图像。
    • cv2.IMREAD_UNCHANGED:读取图像,包括其 alpha 通道(如果存在)。

返回值

        如果成功读取图像,该函数将返回一个多维 numpy 数组,代表图像的像素值。如果无法读取图像(例如,文件不存在或格式不支持),则返回 None

2、cv2.imshow()函数

   是 OpenCV 库中的一个函数,用于在窗口中显示图像。这个函数允许开发者将图像数据可视化,使得用户可以直观地查看和分析图像内容。

函数定义

cv2.imshow(winname, mat)

参数

  • winname:一个字符串,表示窗口的名字。通过这个窗口名,我们可以引用、移动或关闭这个特定的窗口。
  • mat:要显示的图像。这通常是一个由 cv2.imread() 函数加载的图像,或者是一个通过其他 OpenCV 函数处理后的图像。

返回值

  cv2.imshow() 函数本身没有返回值。它的主要目的是在屏幕上显示图像。

3、cv2.waitKey()函数

  cv2.waitKey() 和 cv2.destroyAllWindows() 是 OpenCV 库中用于控制图像显示窗口的两个重要函数。这两个函数通常与 cv2.imshow() 一起使用,以实现图像显示的交互性。

  cv2.waitKey() 函数用于等待一个特定的键盘按键事件。它在显示图像后使程序暂停执行,直到用户按下一个键或者等待指定的时间。

函数定义

cv2.waitKey(delay=None)

参数

  • delay:等待键盘输入的时间(以毫秒为单位)。如果参数为0,则函数会无限期地等待,直到用户按下一个键。

返回值

  cv2.waitKey() 返回按下的键的ASCII码。如果在指定的延迟时间内没有键被按下,则返回-1。

使用方法

  cv2.waitKey() 常用于创建一个简单的键盘事件循环,让用户有机会查看和交互图像。通常,它放在 cv2.imshow() 后面,以便在显示图像后暂停程序。

4、cv2.destroyAllWindows()函数

  cv2.destroyAllWindows() 函数用于关闭所有由 OpenCV 创建的高GUI窗口。 在显示图像并等待用户交互后,通常使用 cv2.destroyAllWindows() 来清理并关闭所有打开的窗口。这是一个良好的编程实践,可以确保资源得到正确释放,并避免程序结束时留下悬挂的窗口。

5、示例演示

import cv2  # 读取彩色图像  
color_image = cv2.imread('path_to_image.jpg', cv2.IMREAD_COLOR)  # 读取灰度图像  
gray_image = cv2.imread('path_to_image.jpg', cv2.IMREAD_GRAYSCALE)  # 检查图像是否成功读取  
if color_image is not None:  cv2.imshow('Color Image', color_image)  # 等待用户按键,参数0表示无限期等待  key = cv2.waitKey(0)  # 根据按键执行不同的操作(可选)  if key == ord('q'):  # 如果按下'q'键  # 关闭所有OpenCV窗口  cv2.destroyAllWindows()
else:  print("Error: Unable to load image.")

二、视频入门

1、读取摄像机视频

        通常情况下,我们必须用摄像机捕捉实时画面。提供了一个非常简单的界面。让我们从摄像头捕捉一段视频(我使用的是我笔记本电脑内置的网络摄像头) ,将其转换成灰度视频并显示出来。只是一个简单的任务开始。

        要捕获视频,你需要创建一个 VideoCapture 对象。它的参数可以是设备索引或视频文件的名称。设备索引就是指定哪个摄像头的数字。正常情况下,一个摄像头会被连接(就像我的情况一样)。所以我简单地传0(或-1)。你可以通过传递1来选择第二个相机,以此类推。在此之后,你可以逐帧捕获。

import numpy as np  
import cv2 as cv  # 创建一个VideoCapture对象,参数0表示使用计算机的第一个摄像头  
cap = cv.VideoCapture(0)  # 检查摄像头是否成功打开  
if not cap.isOpened():  print("无法打开摄像头")  exit()  # 无限循环,直到遇到退出条件  
while True:  # 逐帧捕获视频  # ret是一个布尔值,如果正确读取帧,则ret为True;否则为False  # frame是读取到的帧图像  ret, frame = cap.read()  # 检查是否成功读取到帧  if not ret:  print("无法接收帧(流结束?)。正在退出...")  break  # 将图像从BGR颜色空间转换为灰度颜色空间  gray = cv.cvtColor(frame, cv.COLOR_BGR2GRAY)  # 显示转换后的灰度图像  cv.imshow('frame', gray)  # 等待键盘输入,参数1表示等待时间为1毫秒  # 如果按下'q'键,则退出循环  if cv.waitKey(1) == ord('q'):  break  # 释放VideoCapture对象,关闭摄像头  
cap.release()  # 销毁所有OpenCV创建的窗口  
cv.destroyAllWindows()

        这段代码实现了一个简单的摄像头视频流捕获和显示程序。它使用OpenCV库来从计算机摄像头捕获视频帧,将每帧图像转换为灰度图像,并在窗口中显示。当按下'q'键时,程序将退出。在退出前,它会释放摄像头资源并销毁所有OpenCV创建的窗口。

2、读取保存的文件视频

        它与从相机捕获相同,只是用视频文件名更改摄像机索引。另外,在显示框架时,请使用适当的时间cv.waitKey()。如果太小,则视频将非常快,而如果太大,则视频将变得很慢(嗯,这就是显示慢动作的方式)。正常情况下25毫秒就可以了,或者使用sleep延时来代替(带验证)。

import numpy as np  
import cv2 as cv  # 使用cv2.VideoCapture方法读取名为'vtest.avi'的视频文件  
cap = cv.VideoCapture('vtest.avi')  # 当视频流处于打开状态时,循环读取视频帧  
while cap.isOpened():  # 读取视频帧,ret是读取是否成功的标志,frame是读取到的视频帧  ret, frame = cap.read()  # 如果ret为False,说明没有成功读取到视频帧(可能是视频已播放完毕)  # 打印提示信息,并退出循环  # 如果正确读取帧,ret为True  if not ret:  print("无法接收帧(视频结束?)。正在退出...")  break  # 将读取到的视频帧从BGR颜色空间转换为灰度颜色空间  gray = cv.cvtColor(frame, cv.COLOR_BGR2GRAY)  # 使用cv2.imshow方法显示灰度视频帧,窗口名为'frame'  cv.imshow('frame', gray)  # 等待键盘输入,参数1表示等待时间为1毫秒  # 如果按下'q'键,则退出循环  if cv.waitKey(1) == ord('q'):  break  # 释放VideoCapture对象,关闭视频文件  
cap.release()  # 销毁所有OpenCV创建的窗口  
cv.destroyAllWindows()

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

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

相关文章

使用Spring Data Elasticsearch实现与Elasticsearch的集成,进行全文搜索和数据分析。

使用Spring Data Elasticsearch实现与Elasticsearch的集成,进行全文搜索和数据分析。 使用Spring Data Elasticsearch可以很容易地实现与Elasticsearch的集成,从而进行全文搜索和数据分析。下面是一个简单的示例,演示如何在Spring Boot应用程…

Excel 导入、导出的封装

最近在封装公司统一使用的组件,主要目的是要求封装后开发人员调用简单,不用每个项目组中重复去集成同一个依赖l,写的五花八门,代码不规范,后者两行泪。 为此,我们对EasyExcel进行了二次封装,我…

flutter const InviteFriendReward(),用setState刷新不了

列布局里面添加了InviteFriendReward(),InviteFriendReward()里面有请求接口的开关是否显示,但是因为里面有波浪形,所以加了const,导致setState时,即使开关是开的,也没有再显示了 const InviteFriendRewar…

python怎样打开一个pdf文件?

要在Python中打开PDF文件,可以使用PyPDF2库。 首先,确保已安装PyPDF2库,可以使用以下命令安装: pip install PyPDF2 然后,可以按照以下步骤打开PDF文件: 导入PyPDF2库: import PyPDF2 打开…

《机器学习:引领数字化时代的技术革命》

随着科技的不断发展,机器学习作为人工智能的重要支柱之一,正迅速崛起并引领着数字化时代的技术革命。本文将从机器学习的技术进展、技术原理、行业应用案例、面临的挑战与机遇以及未来趋势预测和学习路线等方面展开探讨,为您揭示机器学习的神…

人工智能时代如何高效完成营销内容计划

智能对话升级!【Kompas AI】AI对话助手,让沟通更高效 在人工智能时代,要高效完成营销计划,我们可以利用人工智能的多种能力来增强营销策略的精准度和执行效率。借助人工智能的力量,企业不仅可以提高营销计划的执行效率…

python项目练习——4.手写数字识别

使用Python和Scikit-learn库进行机器学习模型训练的项目——手写数字识别。 项目分析: 数据准备:使用公开数据集(如MNIST)作为训练和测试数据。数据预处理:对图像数据进行归一化、展平等操作,以便输入到机…

DMA知识

提示:文章 文章目录 前言一、背景二、 2.1 2.2 总结 前言 前期疑问: 本文目标: 一、背景 2024年3月26日23:32:43 今天看了DMA存储器到存储器的DMA传输和存储器到外设的DMA实验,在keil仿真可以看到效果。还没有在protues和开发…

Linux(CentOS)/Windows-C++ 云备份项目(服务器数据管理模块设计)

数据管理模块功能: 后续项目需要使用的数据如下 文件实际存储路径:当客户端需要下载文件时,从这个文件中进行读取响应文件压缩包存放路径名:如果文件是非热点文件会被压缩 如果客户端需要下载这些文件,需要先进行解压…

使用Flask实现:基于midjourney-proxy的MJ绘画实现(开源)

文章目录 实现效果实现步骤完整源码 实现效果 运行mj.py,如下所示。输入中文,自动生成提示词,自动开始下载。用户选择是否需要变换图片,选择需要对哪个图片变换,自动保存。 之前想做一个网页版,只实现了…

一些常见的ClickHouse问题和答案

什么是ClickHouse?它与其他数据库系统有什么区别? ClickHouse是一个开源的列式数据库管理系统(DBMS),专门用于高性能、大规模数据分析。与传统的行式数据库相比,ClickHouse具有更高的查询性能、更高的数据…

新书速览|Django 5企业级Web应用开发实战:视频教学版

掌握Django框架开发技能,实战投票应用系统和内容管理系统 本书内容 《Django 5企业级Web应用开发实战:视频教学版》精选当前简单、实用和流行的Django实例代码,帮助读者学习和掌握Django 5框架及其相关技术栈的开发知识。本书系统全面、内容…

【STM32学习计划】

项目名称:STM32学习计划 项目目标: 熟悉STM32单片机的基本概念和应用掌握STM32的软硬件开发流程完成一个基于STM32的简单项目 项目任务和交付物: 任务 1:熟悉STM32单片机基本概念 学习STM32单片机的基本架构和功能特性交付物…

mysql如何存Emoji表情

如何存Emoji表情 背景解决方案一: 如果是自己搭建的数据库,参考如下。 1:先创建数据库,utf8编码2: 修改mysql 的配置文件 /etc/my.cnf 文件3:然后把你的表和字段也要支持utf8md4编码4:修改你连…

javaWeb教务查询系统

一、简介 在教育管理领域,教务管理系统是一个至关重要的工具,它能够有效地协调学校、教师和学生之间的各种活动。我设计了一个基于JavaWeb的教务管理系统,该系统包括三个角色:管理员、教师和学生。管理员拥有课程管理、学生管理、…

Spark重温笔记(五):SparkSQL进阶操作——迭代计算,开窗函数,结合多种数据源,UDF自定义函数

Spark学习笔记 前言:今天是温习 Spark 的第 5 天啦!主要梳理了 SparkSQL 的进阶操作,包括spark结合hive做离线数仓,以及结合mysql,dataframe,以及最为核心的迭代计算逻辑-udf函数等,以及演示了几…

JWT(JSON Web Token)

JSON Web Token 是一种开放标准,用于在网络上安全传输信息的简洁、自包含的方式。它通常被用于身份验证和授权机制。 JWT 由三部分组成:头部(Header)、载荷(Payload)和签名(Signature&#xff…

微软开源项目Garnet:Redis的竞争者还是替代者?

对于开源社区,最近的一大新闻就是Redis宣布从7.4版本开始,将采用Redis源代码可用许可证(RSALv2)和服务器端公共许可证(SSPLv1)的双重许可证,取代原有的BSD三条款许可证。这一变化引发了开发者社…

阿里云子域名配置,且不带端口访问

进入阿里云控制台,创建一个SSL证书 # 域名名称child.domain.com创建完成后,将返回主机记录以及记录值,保存好,用于下一步使用 创建DNS解析 创建DNS的TXT类型解析 选择记录类型:TXT 填写主机记录:_dnsa…

一些常见的与 Vim 相关的文件类型及其描述

配置文件: .vimrc (Unix/Linux) 或 _vimrc (Windows):这是 Vim 的主要配置文件,用户可以在其中设置各种选项、快捷键映射、插件加载等。Vim 在启动时会自动读取这个文件,并根据其中的设置来配置编辑器。init.vim:对于 …