从opencv-python入门opencv--GUI功能之图像和视频操作

server/2024/10/17 21:39:22/

opencv-python入门opencv--GUI功能之图像和视频操作

  • 一、文章介绍
  • 二、图像的读取显示及保存
    • 1、 cv.imread()
    • 2、cv.imshow()
    • 3、cv.imwrite()
    • 4、cv.waitKey()
    • 5、cv.destroyAllWindows()
    • 6、图像读写存完整示例代码及效果
  • 三、视频读取保存功能
    • 1、cv.VideoCapture()
      • (1)打开相机
      • (2)播放视频文件
      • (3)保存视频

一、文章介绍

本文主要介绍opencv的GUI(Graphics User Interface)中的图像和视频操作,GUI中文指图像用户界面。
包括:图像读写显示、视频读写显示功能。

二、图像的读取显示及保存

1、 cv.imread()

opencv的imread()函数读取指定路径中的一张图像。
在这里插入图片描述
(1)其中filename表示图像的路径,可以输入相对路径,也可以输入绝对路径。
常见的图像格式有:
【1】JPEG (.jpg, .jpeg): 使用广泛的压缩格式,适合照片和复杂图像。
【2】PNG (.png): 支持无损压缩和透明度通道,适合需要透明背景的图像。
【3】BMP (.bmp): 位图格式,通常不压缩,占用较大存储空间。
【4】TIFF (.tiff, .tif): 支持多种压缩方式和多页图像,常用于专业摄影和印刷。
【5】GIF (.gif): 支持动画和透明度,但颜色深度有限(最多256种颜色)。
【6】WEBP (.webp): Google 开发的图像格式,支持无损和有损压缩,适合网页使用。
【7】PPM (.ppm): 简单的位图格式,通常用于图像处理的实验。
【8】PGM (.pgm): 灰度图像格式。

(2)其中flag表示读取图像的方式
【1】cv2.IMREAD_COLOR (默认值):
以彩色图像读取,忽略透明度通道。读取结果为 BGR 格式。对应值为 1。
【2】cv2.IMREAD_GRAYSCALE:
以灰度图像读取,将图像转换为单通道灰度图像。对应值为 0。
【3】cv2.IMREAD_UNCHANGED:
以原始格式读取图像,包括 alpha 通道(透明度)。如果图像是 PNG 格式并包含透明度通道,读取结果将保留该通道。对应值为 -1。

2、cv.imshow()

opencv的imshow()函数在窗口中显示图像,窗口自动适应图像的大小。可以创建任意多个显示窗口,但是名称一样的情况下,上一张图像会被覆盖。
在这里插入图片描述
(1)其中winname表示显示窗口的名称
(2)mat表示要显示的图像变量

3、cv.imwrite()

opencv的imwrite()函数用于保存图像到指定路径。
在这里插入图片描述
(1)const String & filename:
输出文件的路径和名称,包括文件扩展名(如 .jpg, .png 等)。
(2)InputArray img:
要保存的图像,可以是任意类型的图像数组(如 cv::Mat)。
(3)const std::vector & params = std::vector() (可选):
用于指定图像编码参数的可选参数。不同的图像格式支持不同的参数。例如,对于 JPEG 格式,可以指定图像质量;对于 PNG 格式,可以指定压缩级别。
例如:

	# 设置 JPEG 图像的质量为 90params = [int(cv2.IMWRITE_JPEG_QUALITY), 90]# 保存图像success = cv2.imwrite('output_quality.jpg', img, params)

4、cv.waitKey()

cv.waitKey() 是一个键盘绑定函数,它的参数是以毫秒为单位的时间。该函数为任意键盘事件等待指定毫秒。如果你在这段时间内按下任意键,程序将继续。如果传的是 0,它会一直等待键盘按下。它也可以设置检测特定的击键执行不同的代码,如下:

if k == 27: # ESC 退出cv.destroyAllWindows()
elif k == ord('s'): # 's' 保存退出cv.imwrite('data\gui\starry_night.png',img)cv.destroyAllWindows()

在这里插入图片描述

5、cv.destroyAllWindows()

cv.destroyAllWindows() 简单的销毁我们创建的所有窗口。如果你想销毁任意指定窗口,应该使用函数 cv.destroyWindow() 参数是确切的窗口名。
在这里插入图片描述

6、图像读写存完整示例代码及效果

python">#####################################
#该代码学习opencv-python对于图像的读取、显示以及保存功能
#####################################
import cv2 as cv
img = cv.imread('data\gui\starry_night.jpg')
cv.imshow('image',img)
k = cv.waitKey(0)
if k == 27: # ESC 退出cv.destroyAllWindows()
elif k == ord('s'): # 's' 保存退出cv.imwrite('data\gui\starry_night.png',img)cv.destroyAllWindows()

读取显示效果:
在这里插入图片描述

保存效果:
在这里插入图片描述

三、视频读取保存功能

1、cv.VideoCapture()

opencv的视频捕捉接口可以直接打开相机(可用笔记本内置摄像头测试),也可以从路径读取视频进行播放。

(1)打开相机

代码:

python">import numpy as np
import cv2 as cv
cap = cv.VideoCapture(0)
while(True):# 一帧一帧捕捉ret, frame = cap.read()# 显示返回的每帧cv.imshow('frame',frame )if cv.waitKey(1) & 0xFF == ord('q'):break
# 当所有事完成,释放 VideoCapture 对象
cap.release()
cv.destroyAllWindows()

如果想从摄像机获取视频,需要对cv.VideoCapture()传入设备索引,其中,0表示默认摄像头,1表示第二个摄像头,以此类推。
cap.read() 返回一个 bool 值(True/False)。如果加载成功,它会返回True。因此,你可以通过这个返回值判断视频是否结束。

cap 表示创建一个VideoCapture对象,用来捕获视频。有时,cap 可能没有初始化 capture。在这种情况下,此代码显示错误。你可以通过该方法 cap.isOpened() 检查它是否初始化。如果它是 True,那么是好的,否则用 cap.open() 打开在使用。

(2)播放视频文件

代码:

python">import numpy as np
import cv2 as cv
cap = cv.VideoCapture('vtest.avi')
while(cap.isOpened()):ret, frame = cap.read()cv.imshow('frame',frame )if cv.waitKey(25) & 0xFF == ord('q'):break
cap.release()
cv.destroyAllWindows()

它和从相机捕获一样,只需要用视频文件名更改相机索引。同时显示 frame,为 cv.waitKey() 使用合适的时间。如果它太小,视频将非常快,如果太大,视频将很慢 (嗯,这就是如何显示慢动作)。正常情况下,25 毫秒就可以了。

(3)保存视频

代码:

python">import numpy as np
import cv2 as cv
cap = cv.VideoCapture(0)
# 声明编码器和创建 VideoWrite 对象
fourcc = cv.VideoWriter_fourcc(*'XVID')
out = cv.VideoWriter('output.avi',fourcc, 20.0, (640,480))
while(cap.isOpened()):ret, frame = cap.read()if ret==True:frame = cv.flip(frame,0)# 写入已经翻转好的帧out.write(frame)cv.imshow('frame',frame)if cv.waitKey(1) & 0xFF == ord('q'):breakelse:break
# 释放已经完成的工作
cap.release()
out.release()
cv.destroyAllWindows()

代码解读:
【1】fourcc = cv.VideoWriter_fourcc(*‘XVID’)
首先需要指明FourCC码。FourCC 是用于指定视频解码器的 4 字节代码,可用编码的列表。

常见的编码如下:
{1}In Fedora: DIVX, XVID, MJPG, X264, WMV1, WMV2. (XVID 是最合适的. MJPG 结果比较大. X264 结果比较小)
{2}In Windows: DIVX (还需要测试和添加跟多内容)
{3}In OSX: MJPG (.mp4), DIVX (.avi), X264 (.mkv).

对于 MJPG, FourCC 的代码作为 cv.VideoWriter_fourcc(‘M’,’J’,’P’,’G’) 或 cv.VideoWriter_fourcc(*’MJPG’) 传递。

【2】out = cv.VideoWriter(‘output.avi’,fourcc, 20.0, (640,480))
接着需要创建一个视频写入(VideoWriter)对象,指明输出文件的名字,20表示每秒的帧数,0表示编码器使用灰度帧,如果是1表示使用彩色帧。(640,480)表示每一帧的大小。


http://www.ppmy.cn/server/131749.html

相关文章

SpringBoot项目错误日志打印不容易注意到的坑

文章目录 一、不要使用e.printStackTrace()二、不要使用log.error(e.getMessage())三、不要在日志打印时进行字符串拼接 先说结论:建议使用log.error(String msg, Throwable t)方式打印错误日志,最好在加上try中的各种参数的信息方便排查 Slf4j public …

YARN调度原理详解

YARN(Yet Another Resource Negotiator)是 Hadoop 集群的资源管理和作业调度框架,它的设计旨在更好地管理和调度 Hadoop 集群中的资源。YARN 解决了传统 Hadoop MapReduce 中资源管理与作业调度紧耦合的问题,使得不同类型的计算任…

数据中心物理安全的历史和演变

在当今的数字时代,数据中心托管已成为我们互联世界的支柱。这些设施在存储、管理和处理我们日常生活所需的大量信息方面发挥着至关重要的作用。从社交媒体平台和电子商务网站到流媒体服务和云计算,数据中心为我们依赖的数字服务提供支持。 随着企业越来…

基于FPGA的多路视频缓存

对于多路视频传输的场合,需要正确设置同步。 uifdma_dbuf0 的写通道输出帧同步计数器直接接入 uifdma_dbuf0,uifdma_dbuf1, uifdma_dbuf2, uifdma_dbuf3 的写通道同步计数输入。uifdma_dbuf0 的读通道,延迟 1 帧于 uifdma_dbuf0 的写通道帧计…

React Native源码学习

核心组件 基础组件:View、Text、Image、TextInput、ScrollView(性能没有FlatList好,因为它会一次性把子元素渲染出来)、StyleSheet交互组件:button列表视图:FlatList(优先渲染屏幕上可见的元素&…

交替最小二乘法(ALS)的工作原理

假设我们有一个评分矩阵,我们希望通过交替优化用户矩阵和物品矩阵来最小化误差。 假设: 我们有一个评分矩阵 ( R ),它的维度是 ( m \times n ),即 ( m ) 个用户和 ( n ) 个物品(比如电影、商品等)。矩阵分…

CSS常用声明(属性)

目录 一、文本 1、字体属性 2、文本修饰 二、图像 1、图像边框样式 2、图像透明度 三、背景 1、background-color:背景颜色 2、background-img:背景图像 3、背景展示效果 4、background-size:背景图大小 5、background-position&…

Vue3 watch 监视属性

作用:监视数据的变化(和Vue2中的watch作用一致)特点:Vue3中的watch只能监视以下四种数据: ref定义的数据。reactive定义的数据。函数返回一个值(getter函数)。一个包含上述内容的数组。 我们在V…