教程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.mfbz.cn/a/496308.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

视频素材下载网站有哪些?这几个优质无水印素材网你肯定没见过

在视频创作的世界里,每个角落都隐藏着未被发现的宝藏。全球各地的视频素材网站以其独特的视角和丰富的资源,为创作者们提供了无尽的灵感和可能性。不论是寻找充满地方特色的片段,还是需要高品质通用视频素材,以下全球范围内的精选…

人工智能在产业中应用--生成智能

二、生成式人工智能 前面介绍了很多人工智能的应用,接下来部分我们会介绍当前正在进行的生成智能。生成智能和以往的人工智能有什么区别,个人觉得主要区别就在于“度”。在表现上就是以前的人工智能更多是利用既有的数据集分布挖掘和解决在这个数据集下…

linux centos7中使用 Postfix 和Dovecot搭建邮件系统

作者主页:点击! Linux专栏:点击! Postfix Postfix是一个开源的邮件传输代理(MTA),用于路由和传送电子邮件。它是一个可靠、安全且高性能的邮件服务器软件,常用于搭建邮件系统的核心…

二叉树|701.二叉搜索树中的插入操作

力扣题目链接 class Solution { public:TreeNode* insertIntoBST(TreeNode* root, int val) {if (root NULL) {TreeNode* node new TreeNode(val);return node;}if (root->val > val) root->left insertIntoBST(root->left, val);if (root->val < val) r…

v-bind=“$attrs“ v-on=“$listeners“的理解及用法

前言&#xff1a; vue通信手段有很多种&#xff0c;props/emit、vuex、event bus、provide/inject 等&#xff0c;还有 a t t r s 和 attrs和 attrs和listeners&#xff0c;主要用于隔代传值 1、$attrs 官方解释&#xff1a;包含了父作用域中不作为 prop 被识别 (且获取) 的特…

敏捷开发——Axios

一创建一个项目&#xff0c;首先要解决的是跨域问题 解决跨域问题&#xff1a; 1. 服务端解决 2. 设置代理 配置完 config 文件一定要重启&#xff0c;否则不生效 1.设置代理服务器 vue.config.js 1)用"/api" 代替目标地址"https://www.pku.edu.cn" 2…

linux下使用迅雷的完美办法(网络版免费),其他下载工具

迅雷有自家服务器的支持&#xff0c;因此&#xff0c;其他下载器&#xff0c;可能难以匹敌 &#xff1f; linux下使用迅雷的完美办法&#xff08;免费&#xff09; https://blog.csdn.net/lqrensn/article/details/8853949 网络版 Linux下安装并使用迅雷 https://www.lxlin…

独立站攻略|如何使用SEO代理优化网站排名?

每天&#xff0c;互联网上都会生成和共享大量信息&#xff0c;这使得预测哪个关键字或主题将成为趋势变得很有挑战性&#xff0c;因此人们可以预测和优化他们的搜索引擎排名。但使用“SEO 代理”&#xff0c;就会使得SEO优化更加有效且精准。 一、什么是SEO&#xff1f; 简而言…

区块链dapp开发 dapp系统开发方案

在区块链技术的兴起和普及的推动下&#xff0c;去中心化应用程序&#xff08;DApp&#xff09;成为了当前数字世界中的热门话题之一。DApp 的开发不仅需要考虑技术方面的挑战&#xff0c;还需要深入了解区块链的工作原理和应用场景。本文将介绍一种 DApp 系统开发的基本方案&am…

2024河北采煤机械展览会|河北煤矿展会|石家庄煤业展会

2024中国&#xff08;石家庄&#xff09;国际煤炭装备及矿山设备博览会 时间&#xff1a;2024年7月4-6日 地点&#xff1a;石家庄国际会展中心.正定 随着全球能源结构的转型与升级&#xff0c;煤炭行业正面临前所未有的发展机遇与挑战。作为煤炭产业的重要组成部分&#xff0…

开源模型应用落地-qwen1.5-7b-chat-LoRA微调(二)

一、前言 预训练模型提供的是通用能力&#xff0c;对于某些特定领域的问题可能不够擅长&#xff0c;通过微调可以让模型更适应这些特定领域的需求&#xff0c;让它更擅长解决具体的问题。 本篇是开源模型应用落地-qwen-7b-chat-LoRA微调&#xff08;一&#xff09;进阶篇&#…

知名策略师上调微软目标价,微软后期走势将怎样?

KlipC报道&#xff1a;美国投行知名策略师Dan Ives将微软目标价从475美元上调至500美元&#xff0c;该新目标意味着较周一收盘价有18%的上涨空间。 值得一提的是Copilot是微软在Windows 11中加入的AI助手&#xff0c;该AI助手可以帮助用户完成各种任务。随着微软人工智能助理工…

QT中的 容器(container)简介

Qt库提供了一套通用的基于模板的容器类&#xff0c;可以用这些类存储指定类型的项。比如&#xff0c;你需要一个大小可变的QString的数组&#xff0c;则使用QVector<QString>。 这些容器类比STL&#xff08;C标准模板库&#xff09;容器设计得更轻量、更安全并且更易于使…

传播力研究期刊投稿发表

《传播力研究》杂志是经国家新闻出版总署批准&#xff0c;黑龙江日报报业集团主管主办&#xff0c;面向全国公开发行的学术刊物。本刊为新闻、传媒、传播学类专业院校师生、文化传播理论研究者和从业人员及爱好者&#xff0c;开展学术交流与研讨&#xff0c;汲取当今业界新鲜的…

无线开关量收发模块如何在远距离情况下监测工厂设备运行?

PLC无线通讯一般有以下几个应用场景&#xff1a; 【应用一】开关量信号1点对多点远距离无线通讯 支持点对点及1点对多点&#xff0c;多路开关量/数字量信号远距离无线传输通讯 【应用二】开关量信号多点对1点之间远距离无线通讯 PLC、泵阀、二次仪表、继电器等I/O开关量信号…

fastadmin学习05-开启debug以及配置

FastAdmin 框架提供了对 .env 环境变量配置的支持&#xff0c;并附带一个默认示例文件 .env.sample。在安装后&#xff0c;框架并不会自动启用 env 环境变量&#xff0c;需要手动将 .env.sample 复制为 .env 并进行配置。 如果不开启.env会读取database.php中的配置 下面测试…

Ribbon简介

目录 一 、概念介绍 1、Ribbon是什么 2、认识负载均衡 2.1 服务器端的负载均衡 2.2 客户端的负载均衡 3、Ribbon工作原理 4、Ribbon的主要组件 IClientConfig ServerList ServerListFilter IRule Iping ILoadBalancer ServerListUpdater 5、Ribbon支持…

QT QInputDialog弹出消息框用法

使用QInputDialog类的静态方法来弹出对话框获取用户输入&#xff0c;缺点是不能自定义按钮的文字&#xff0c;默认为OK和Cancel&#xff1a; int main(int argc, char *argv[]) {QApplication a(argc, argv);bool isOK;QString text QInputDialog::getText(NULL, "Input …

SQLServer CONCAT 函数的用法

CONCAT函数用于将多个字符串值连接在一起。以下是一个简单的示例&#xff0c;演示了如何使用CONCAT函数&#xff1a; -- 创建一个示例表 CREATE TABLE ExampleTable (FirstName NVARCHAR(50),LastName NVARCHAR(50) );-- 插入一些示例数据 INSERT INTO ExampleTable (FirstNam…

拥抱绿色革命!揭秘CAE仿真技术在风电能源领域的应用

众所周知&#xff0c;风能是清洁能源的代表&#xff0c;而风电更是其核心。伴随着全球电力需求的日益增长以及环保节能意识的逐渐加强&#xff0c;加强生态文明建设&#xff0c;推进绿色低碳发展&#xff0c;已成为当今社会的共识。政府工作报告提到&#xff0c;过去一年可再生…
最新文章