OpenCV中的GUI特性 —— 图片与视频的读写和显示

这篇具有很好参考价值的文章主要介绍了OpenCV中的GUI特性 —— 图片与视频的读写和显示。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

OpenCV中的GUI特性——图片与视频的读写和显示

在这一部分我们将介绍在OpenCV中的GUI特性之图片和视频的读写和显示,包括图像的cv.imread / imshow / imwrite和VideoCapture/Writer等函数的使用

1.1 在OpenCV中的图片读写和展示

在OpenCV中的基础图片操作涉及了三个函数:cv.imread()cv.imshow()cv.imwrite()

1.1.1 cv.imread()读取图像

使用imread()函数并传入两个参数,第一个参数是图片的路径(在项目目录下的相对路径或在计算机上的绝对路径),第二个参数是一个标志,它指定了图像的读取方式:彩色图像、灰度图或包括alpha通道读取图像

第二个参数即是一个表示,它包含了三个相关的参数:

  • cv.IMREAD_COLOR: 加载彩色图像,任何图像的透明度都会被忽视(它是默认标志)
  • cv.IMREAD_GRAYSCALE:以灰度模式加载图像
  • cv.IMREAD_UNCHANGED:加载图像,包括alpha通道

这三个图像可以用三个简单的参数代替:1/0或-1,分别代表上述的三个标志

1.1.2 cv.imshow()显示图片

显示图片使用imshow()函数可以实现,其同样需要传递两个参数,第一个参数代表窗口的名称,它是一个字符串,第二个参数代表图像对象

需要注意的是,通过imshow()函数显示图片时,窗口大小自适应图片的尺寸,当然我们也可以人为地改变或规定窗口的尺寸

代码实现

import numpy as np
import cv2 as cv
#加载彩色灰度图像
img = cv.imread('messi5.jpg'0)
cv.imshow('image',img)
cv.waitKey(0)
cv.destroyAllWindows()

通过上面的代码我们观察发现,在使用imread()函数读取图像并用imshow()函数显示图片之后,我们又使用了两个函数:cv.waitKey()cv.destoryAllWindows()

cv.destroyAllWindows()只会破坏我们创建的所有窗口,如果要销毁任何特定的窗口,请使用函数cv.destroyWindow()在其中传递确切的窗口名称作为参数

cv.destroyWindow()在其中传递确切的窗口名称作为参数

cv.waitKey()函数是一个键盘绑定函数,其参数是以毫秒为单位的时间,该函数等待任意键盘事件指定的毫秒,如果你在这段时间内按下任何键,程序将继续运行,如果0被传递,它将无限期地等待一次敲击键,它也可以设置为检测特定的按键

我们举一个按下键盘 ‘q’ 键后关闭窗口的例子

cv.imshow('frame', img)
if cv.waitKey(1) == ord('q'):
    break
cv.destroyAllWindows()

这里我们使用了ord()函数作为捕获键盘事件的一个方式,ord()的参数是一个字符,它会返回这个字符对应的ASCII 数值,或者 Unicode 数值(取决于编码方式),然后询问cv.waitKey()函数的返回值是否等于ord()函数的返回值,而在这里,ord()函数的返回值就是键盘键 ‘q’ 的ASCII数值

我们再举一个按下键盘Esc键关闭窗口的例子

cv2.imshow('res', res)
if cv2.waitKey(1) == 27:
    break
# 关闭窗口
cv2.destroyAllWindows()

这里我们没有使用ord()函数,而是直接询问cv.waitKey()函数的返回值是否等于某个数,而这里的27这个数,就代表着键盘的Esc键

1.1.3 cv.imwrite() 写入图片

关于图片的写入关乎到函数cv.imwrite()保存图像,其包含了两个参数,第一个参数是文件名,第二个参数是我们想保存的图像对象

比如语句cv.imwrite(‘messigray.png’,img),这会将图像img以PNG格式保存在工作目录中

总结代码实现

import numpy as np
import cv2 as cv
img = cv.imread('messi5.jpg',0)
cv.imshow('image',img) k = cv.waitKey(0)
if k == 27: # 等待ESC退出
 cv.destroyAllWindows()
elif k == ord('s'): # 等待关键字,保存和退出
cv.imwrite('messigray.png',img)
cv.destroyAllWindows()
1.1.4 在OpenCV中使用Matplotlib

Matplotlib是Python的绘图库,可以为你提供多种绘图方法,在这一小节我们先学习如何使用Matplotlib显示图像以及拓展学习常用的plt.subplot()函数的功能和用法

关于使用Matplotlib绘图库绘图的代码实现:

import numpy as np
import cv2 as cv
from matplotlib import pyplot as plt
img = cv.imread('messi5.jpg',0)
plt.imshow(img, cmap = 'gray', interpolation = 'bicubic')
plt.xticks([]), plt.yticks([]) # 隐藏 x 轴和 y 轴上的刻度值
plt.show()

在这里我们需要拓展学习的是plt的xticks()函数、yticks()函数和·imshow()函数

1、xticks()和yticks()这两个函数都有三个参数:locs, [labels], **kwargs

python学习:python的星号*和双星号**用法

“ * ” 表示该位置接受任意多个非关键字参数,在函数中将其转化为元组

“ ** ” 表示这个位置接受任意多个关键字参数,在函数中将其转化为字典

第一个参数locs表示x轴或y轴刻度线标注的位置,加入我们想在刻度线上表示1-12的所有数字,我们可以把locs参数设置为range(1,13,1)来满足我们的需求

第二个参数[labels]表示横纵坐标上各刻度的名称,可以是月数、人们等,它是一个数组类型的参数

第三个参数**kwargs提供了两个关键字供我们使用:color和rotation,color可以赋予其字符串类型的值,它可以设置刻度标签的显示颜色,而rotation可以赋予其整型或浮点型的数字,它代表了刻度标签按逆时针旋转的角度,综合使用这些属性可以让我们绘出的图形更加美观

2、imshow()函数有些复杂,在这里我们不多做解释,仅解释代码中出现的三个参数即可:img、camp和interpolation

img参数表示图像数据,camp参数将标量数据映射到色彩图,其取值默认为img.cmap,但是在代码中我们将其设置为"gary"表示将原来的色彩图以灰度图的形式映射,interpolation表示使用的插值方式,关于插值方式我们在后面的文章再细说

1.2 在OpenCV中的视频读写和展示

关于OpenCV中视频的读写和展示我们着重学习两个功能:cv.VideoCapture(),cv.VideoWriter()

1.2.1 cv.VideoCapture()视频的读取

在视频的读取中,我们首先要创建一个VideoCapture对象用来捕获视频,在这个功能中我们需要传入一个参数,这个参数是设备索引或文件名称,设备索引在当前阶段我们可以简单地认为“ 0 ”就是我们笔记本电脑自带的摄像头的设备索引,“ 1 ”就是我们附加的一个外设摄像头的设备索引,以此类推

在此之后我们要逐帧捕获视频(在最后不用忘记释放俘虏!),上代码!

import numpy as np
import cv2 as cv
cap = cv.VideoCapture(0)
if not cap.isOpened():
     print("Cannot open camera")
     exit()
while True:
     # 逐帧捕获
     ret, frame = cap.read()
     # 如果正确读取帧,ret为True
     if not ret:
     print("Can't receive frame (stream end?). Exiting ...")
     break
        # 我们在框架上的操作到这里
     gray = cv.cvtColor(frame, cv.COLOR_BGR2GRAY)
     # 显示结果帧e
     cv.imshow('frame', gray)
     if cv.waitKey(1) == ord('q'):
     break
# 完成所有操作后,释放捕获器
cap.release()
cv.destroyAllWindows()

代码解释:如我们前面所说的一样,在读取视频前我们先创建一个VideoCapture对象用来捕获视频(代码中我们传入的参数是“ 0 ”,所以此时我们用的就是笔记本自带的摄像头或台式计算机外接的第一个外设摄像头!),然后万年不变的是要先判断视频捕捉器(摄像头)的状态,是的就是cap.isOpened()函数,摄像头的状态是否正常,就反映在这个函数的返回值上

在后来就要进入我们的核心代码区了:逐帧捕获

我们使用了一个while循环来重复执行捕捉帧的操作,ret和frame这两个一个都不能少,我们用read()读取(当然后面有用下划线“ _ ”代替的情况,我们到时候再说),逐帧捕捉后,为了处理一些异常或者保持我们程序的安全性,要判断此帧有没有问题,如果有问题就要作出相应的处理:在控制台打印错误提示然后退出视频捕捉器,如果没有问题就继续往下进行,我们把这个一小块图像frame用cvtColor(frame, cv.COLOR_BGR2GRAY)函数改变为灰度图,然后用gray存储frame,并通过imshow()函数显示这一小块图像,往复进行,就实现了我们的视频读取

我们还可以使用 cap.get(propId) 方法访问该视频的某些功能,其中propId是0到18之间的一个数字,个数字表示视频的属性(如果适用于该视频),并且可以显示完整的详细信息在这里看到:cv.VideoCapture::get()。其中一些值可以使用 cap.set(propId,value) 进行修改,value是你想要的新值

例如,我可以通过 cap.get(cv.CAP_PROP_FRAME_WIDTH) 和 cap.get(cv.CAP_PROP_FRAME_HEIGHT)检查框架的宽度和高度

# 改变框架的分辨率
ret = cap.set(cv.CAP_PROP_FRAME_WIDTH,320)
ret = cap.set(cv.CAP_PROP_FRAME_HEIGHT,240)
1.2.2 从文件播放视频

它与从相机捕获相同,只是用视频文件名更改摄像机索引,在显示框架时要特别注意cv.waitKey()函数的参数传递,如果参数太小则视频加速播放,如果参数太大则视频慢速播放(这就是快/动作放映的方式,正常情况下25毫秒即可)

代码实现

import numpy as np
import cv2 as cv
cap = cv.VideoCapture('vtest.avi')
while cap.isOpened():
    ret, frame = cap.read()
     # 如果正确读取帧,ret为True
     if not ret:
     print("Can't receive frame (stream end?). Exiting ...")
     break
     gray = cv.cvtColor(frame, cv.COLOR_BGR2GRAY)
     cv.imshow('frame', gray)
     if cv.waitKey(1) == ord('q'):
     break
cap.release()
cv.destroyAllWindows()
1.2.3 cv.VideoWriter()保存视频

还记得我们保存图像时用的imwrite()函数吗,在保存图像时我们要换一种新的方式,那就是使用VideoWriter对象

在保存视频时,我们先要创建一个VideoWriter对象,然后指定输出的文件名,指定FourCC代码,传递帧率的数量和大小,最后标志颜色

  • 在Fedora中:DIVX,XVID,MJPG,X264,WMV1,WMV2(最好使用XVID,MJPG会生成大尺寸的视频。X264会生成非常小的尺寸的视频)

  • 在Windows中:DIVX(尚待测试和添加)

  • 在OSX中:MJPG(.mp4),DIVX(.avi),X264(.mkv)

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

代码实现:从摄像头捕获的画面沿垂直方向翻转并保存

import numpy as np
import cv2 as cv
cap = cv.VideoCapture(0)
# 定义编解码器并创建VideoWriter对象
fourcc = cv.VideoWriter_fourcc(*'XVID')
out = cv.VideoWriter('output.avi', fourcc, 20.0, (640, 480))
    while cap.isOpened():
     ret, frame = cap.read()
     if not ret:
         print("Can't receive frame (stream end?). Exiting ...")
         break
     frame = cv.flip(frame, 0)
     # 写翻转的框架
     out.write(frame)
     cv.imshow('frame', frame)
     if cv.waitKey(1) == ord('q'):
     break
# 完成工作后释放所有内容
cap.release()
out.release()
cv.destroyAllWindows()

(注:文章内容参考OpenCV4.1中文官方文档)
如果文章对您有所帮助,记得一键三连支持一下哦~文章来源地址https://www.toymoban.com/news/detail-403229.html

到了这里,关于OpenCV中的GUI特性 —— 图片与视频的读写和显示的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • opencv+图像处理(GUI)1-0图像:创建加载显示保存关闭

    本专栏代码地址 https://github.com/xiawei20161308104/xv_opencv_tutorials 本节代码路径 xv_opencv_tutorials/ImageProcessinginOpenCV/load_img.py 创建窗口 namedWindow 从本地加载图像 imread 在窗口中展示图像 imshow 将图像写入文件 imwrite 关闭窗口 destroyWindow destroyAllWindows opencv提供 cv.namedWindow 函数实现创建一

    2023年04月21日
    浏览(41)
  • openCV视频的读写操作

    在opencv当中视频的打开主要依靠一个类VideoCapture,在构造对象时,打开视频和摄像头主要区别就是初始的参数 如下列 显然我们不难看出,如果你想要打开摄像头,那么你的初始化参数就应该是0; 如果你要打开视频文件的时候,那么就应该是你当前视频的 路径+名字 用来检测

    2024年02月01日
    浏览(52)
  • pillow opencv matplotlib读写图片有什么区别

    区别: opencv-python读出来的是BGR颜色通道的 PIL读出的是PIL类格式的,而cv和plt是numpy数组 BRG和RGB格式互转 区别: plt没法读取时设置读灰色图像,但是可以在plt.imshow()的时候设置按照灰度图显示 opencv的flags参数 常数 值 效果 cv2.IMREAD_COLOR 1 读取图像时保留颜色通道(默认值)

    2024年02月04日
    浏览(55)
  • OpenCV边缘检测与视频读写

    OpenCV中的边缘检测原理主要基于图像梯度的计算,包括一阶梯度和二阶梯度。 一阶梯度 :它反映了图像亮度变化的速度。Sobel算法就是一种以一阶梯度为基础的边缘检测算法。它通过计算图像在水平和垂直方向上的梯度来检测边缘。这种方法简单有效,但对于噪声较为敏感。

    2024年02月21日
    浏览(39)
  • OpenCV-视频读写(java版)

       OpenCV 2 中提供了两个类来实现视频的读写。读视频的类是 VideoCapture ,写视频的类是 VideoWriter VideoCapture 既可以从视频文件读取图像,也可以从摄像头读取图像。该类提供了一系列构造函数和方法打开视频文件或摄像头。下方对VideoCapture的常用方法进行说明 方法 说明 o

    2023年04月14日
    浏览(35)
  • OpenCV视频读写(videoio模块)

    TODO:videoio的工作原理,注册表,优先级 Video4Linux的 WITH_V4L (Linux;默认值: ON ) 使用 Video4Linux API 从相机捕获图像。必须安装 Linux 内核头文件。 FFmpeg的 WITH_FFMPEG (默认值: ON ) 与 FFmpeg 库集成,用于解码和编码视频文件和网络流。该库可以读取和写入许多流行的视频格式。它

    2024年04月23日
    浏览(34)
  • 【opencv+图像处理】(Gui Features in OpenCV) 1-1摄像头:采集摄像头视频,读取视频帧,录制视频

    本专栏代码总库地址 https://github.com/xiawei20161308104/xv_opencv_tutorials 本节代码路径 xv_opencv_tutorials/VideoRelated/get_started_with_videos.py xv_opencv_tutorials/VideoRelated/get_and_set_video.py xv_opencv_tutorials/VideoRelated/save_video.py 参考官网 https://docs.opencv.org/4.x/d6/d00/tutorial_py_root.html 从设备,可以是摄像

    2024年02月03日
    浏览(71)
  • 【Python】OpenCV4图像、视频读写操作

    OpenCV提供了imread函数来从文件中加载图像,以及imwrite函数来将图像写入文件。这些函数支持各种静态图像的文件格式。通常支持BMP、PNG、JPEG和TIFF等格式。 让我们来探索在OpenCV和NumPy中表示图像的结构。图像是一个多维数组;它有列和行的像素,并且每个像素有一个值。对于

    2024年02月10日
    浏览(32)
  • LabVIEW中使用opencv快速实现视频的读写

    ‍‍🏡博客主页: virobotics的CSDN博客:LabVIEW深度学习、人工智能博主 🎄所属专栏:『LabVIEW深度学习实战』 🍻上期文章: 【YOLOv8-Seg】实战三:LabVIEW+TensoRT实现YOLOv8-seg的极速推理(毫秒级) 📰如觉得博主文章写的不错或对你有所帮助的话,还望大家多多支持呀! 欢迎大家

    2024年02月10日
    浏览(51)
  • opencv显示图片

      要使用OpenCV在Python中显示图像,您需要遵循以下步骤: 1. 首先,确保已经安装了OpenCV。您可以使用以下命令安装OpenCV: ``` pip install opencv-python ``` 2. 然后,编写一个简单的程序来读取并显示图像。以下是一个示例代码: ```python import cv2 # 读取图像 image = cv2.imread(\\\'exam

    2024年02月07日
    浏览(34)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包