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

教程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()

相关文章:

  • 众创空间、孵化器、加速器!2024年度陕西省科技企业孵化器认定类型条件、奖补
  • 滴滴出行高级Node.js开发工程师笔试题2024
  • vivo X Fold3系列旗舰折叠新品正式发布
  • 【Pytorch】利用PyTorch实现图像识别
  • Stable Diffusion 本地部署教程
  • 反射率光纤光谱仪检测汽车后视镜反射率
  • HTTPS 从懵懵懂懂到认知清晰、从深度理解到落地实操
  • 基于Java+SpringMvc+vue+element实现上海汽车博物馆平台
  • HCIP—BGP路由发布
  • 达梦数据库自动备份(全库)+还原(全库) 控制台
  • Flink SQL填坑记3:两个kafka数据关联查询
  • 使用npm仓库的优先级以及.npmrc配置文件的使用
  • [HackMyVM]靶场Crossbow
  • 港大新工作 HiGPT:一个模型,任意关系类型 !
  • Hana数据库 No columns were bound prior to calling SQLFetch or SQLFetchScroll
  • ESLint简单操作
  • JS笔记四:作用域、变量(函数)提升
  • Laravel Mix运行时关于es2015报错解决方案
  • spring + angular 实现导出excel
  • spring boot 整合mybatis 无法输出sql的问题
  • Spring Cloud Alibaba迁移指南(一):一行代码从 Hystrix 迁移到 Sentinel
  • Sublime Text 2/3 绑定Eclipse快捷键
  • ucore操作系统实验笔记 - 重新理解中断
  • Yii源码解读-服务定位器(Service Locator)
  • Zepto.js源码学习之二
  • 简单实现一个textarea自适应高度
  • 精彩代码 vue.js
  • 开源SQL-on-Hadoop系统一览
  • 深度学习中的信息论知识详解
  • 小试R空间处理新库sf
  • 译有关态射的一切
  • 在weex里面使用chart图表
  • ​flutter 代码混淆
  • #162 (Div. 2)
  • (10)Linux冯诺依曼结构操作系统的再次理解
  • (6)添加vue-cookie
  • (M)unity2D敌人的创建、人物属性设置,遇敌掉血
  • (WSI分类)WSI分类文献小综述 2024
  • (读书笔记)Javascript高级程序设计---ECMAScript基础
  • (附源码)node.js知识分享网站 毕业设计 202038
  • (附源码)springboot青少年公共卫生教育平台 毕业设计 643214
  • (附源码)ssm考生评分系统 毕业设计 071114
  • (附源码)ssm学生管理系统 毕业设计 141543
  • (附源码)计算机毕业设计SSM疫情社区管理系统
  • (七)Java对象在Hibernate持久化层的状态
  • (区间dp) (经典例题) 石子合并
  • (转)Spring4.2.5+Hibernate4.3.11+Struts1.3.8集成方案一
  • ***linux下安装xampp,XAMPP目录结构(阿里云安装xampp)
  • .【机器学习】隐马尔可夫模型(Hidden Markov Model,HMM)
  • .NET / MSBuild 扩展编译时什么时候用 BeforeTargets / AfterTargets 什么时候用 DependsOnTargets?
  • .NET Compact Framework 3.5 支持 WCF 的子集
  • .net core webapi Startup 注入ConfigurePrimaryHttpMessageHandler
  • .NET处理HTTP请求
  • .pub是什么文件_Rust 模块和文件 - 「译」
  • ?.的用法