【OpenCV图像处理1】图像&视频的加载与显示(上)

简介: 【OpenCV图像处理1】图像&视频的加载与显示(上)

一、图像&视频的加载与显示

1、创建和显示窗口

1.1 namedWindow() 创建命名窗口

namedWindow()用法:

cv2.namedWindow(winname, flags)

参数说明:

  • winname:新建窗口的名称,可任意取(字符串类型)。
  • flags:窗口的标识,一般默认为 WINDOW_AUTOSIZE ,还有其他几种参数,具体用法如下表所示:
参数 描述
WINDOW_NORMAL 显示图像后,允许用户随意调整窗口大小
WINDOW_AUTOSIZE 根据图像大小显示窗口,不允许用户调整大小
WINDOW_OPENGL 创建窗口的时候会支持OpenGL
WINDOW_FULLSCREEN 全屏显示窗口
WINDOW_FREERATIO 调整图像尺寸以充满窗口
WINDOW_KEEPRATIO 保持图像的比例
WINDOW_GUI_EXPANDED 创建的窗口允许添加工具栏和状态栏
WINDOW_GUI_NORMAL 创建没有状态栏和工具栏的窗口

以上两种标蓝色的参数是最为常见的。

1.2 resizeWindow() 修改窗口尺寸

resizeWindow()用法:

cv2.resizeWindow(winname, width, height)

参数说明:

  • winname:被修改窗口的名称。
  • width 和 height:窗口的宽和高。

注意:当 namedWindow(winname, flags) 中的 flages 设为 WINDOW_AUTOSIZE 时,将不会对窗口尺寸进行修改。

1.3 imshow() 显示窗口

imshow()用法:

cv2.imshow(winname, mat)

参数说明:

  • winname:窗口名称,它是一个字符串。
  • mat:要展现的对象。

若 mat 设置为0,即不展示任何对象,只是一个黑框。

1.4 waitKey() 等待用户输入

waitKey()用法:

cv2.waitKey(delay)

参数说明:

  • delay:以毫秒为单位,该函数等待任何键盘事件指定的毫秒。如果在这段时间内按下任何键,程序将继续运行。
  • 如果 0 被传递,它将无限期地等待一次敲击键。

当然也可以设置按指定键退出,即使用 if 判断语句:

key = cv2.waitKey(0)
# 按q键退出
if key & 0xFF == ord('q'):
  break

1.5 destroyWindow()、destroyAllWindows销毁窗口

1、destroyWindow()用法:

cv2.destroyWindow(winname)

参数说明:

  • winname:需要销毁的窗口名称。

2、destroyAllWindows用法:

cv2.destroyAllWindows()

参数说明:

  • 无参数

3、两者区别:

destroyAllWindows() 会销毁我们创建的所有窗口

如果要销毁任何特定的窗口,使用函数 destroyWindow() ,并在其中传递确切的窗口名称作为参数。

1.6 代码实现

import cv2
cv2.namedWindow('windows', cv2.WINDOW_NORMAL)  # 创建命名窗口
cv2.resizeWindow('windows', 640, 360)  # 修改窗口尺寸
cv2.imshow('windows', 0)  # 显示窗口
cv2.waitKey(0)  # 等待用户输入
cv2.destroyAllWindows()  # 销毁窗口

2、加载显示图像

2.1 imread() 读取图像

imread()用法:

cv2.imread(filename, flags)

参数说明:

  • filename:要加载的文件名(路径)。
  • flags:读取图像的方式,一般默认为 IMREAD_COLOR ,还有其他几种参数,具体用法如下表所示:
参数 描述
IMREAD_UNCHANGED 如果设置,则按原样返回加载的图像(带有Alpha通道,否则将被裁剪)。
IMREAD_GRAYSCALE 如果设置,请始终将图像转换为单通道灰度图像。
IMREAD_COLOR 如果设置,请始终将图像转换为3通道BGR彩色图像。
IMREAD_ANYDEPTH 如果设置,则当输入具有相应的深度时返回16位/ 32位图像,否则将其转换为8位。
IMREAD_ANYCOLOR 如果设置,将以任何可能的颜色格式读取图像。
IMREAD_LOAD_GDAL 如果设置,请使用Gdal驱动程序加载图像。
IMREAD_REDUCED_GRAYSCALE_2 如果设置,则始终将图像转换为单通道灰度图像,并且图像尺寸减小1/2。
IMREAD_REDUCED_COLOR_2 如果设置,请始终将图像转换为3通道BGR彩色图像,并且图像尺寸减小1/2。
IMREAD_REDUCED_GRAYSCALE_4 如果设置,则始终将图像转换为单通道灰度图像,并且图像尺寸减小1/4。
IMREAD_REDUCED_COLOR_4 如果设置,请始终将图像转换为3通道BGR彩色图像,并且图像尺寸减小1/4。
IMREAD_REDUCED_GRAYSCALE_8 如果设置,请始终将图像转换为单通道灰度图像,并且图像尺寸减小1/8。
IMREAD_REDUCED_COLOR_8 如果设置,请始终将图像转换为3通道BGR彩色图像,并且图像尺寸减小1/8。
IMREAD_IGNORE_ORIENTATION 如果设置,请不要根据EXIF的方向标志旋转图像。

以上三种标蓝色的参数是最为常见的,除了这三个标志,我们可以分别简单地传递整数-1、0或1。

2.2 代码实现

import cv2
cv2.namedWindow('window', cv2.WINDOW_NORMAL)  # 创建命名窗口
cv2.resizeWindow('window', 502, 345)  # 修改窗口尺寸
cat = cv2.imread('../resource/cat.jpg', cv2.IMREAD_GRAYSCALE)  # 读取图片
cv2.imshow('window', cat)  # 显示窗口(图片)
cv2.waitKey(0)  # 等待用户输入
cv2.destroyAllWindows()  # 销毁窗口
  • 如果以 IMREAD_GRAYSCALE0 的方式读取图像,那么将呈现灰色图像:

  • 如果以 IMREAD_COLOR1 的方式读取图像,那么将呈现彩色或原有图像:

  • 如果 imread() 未指定 flag ,那么它默认以彩色的方式来读取图像。

3、保存图像

3.1 imwrite() 保存图像

imwrite()用法:

cv2.imwrite(filename, img)

参数说明:

  • filename:要保存的文件名(路径)。
  • img:要保存的图像。cv2.imwrite('../resource/cat.png', cat) ,这会将图像以PNG格式保存在工作目录中。

3.2 代码实现

在下面的程序中,以灰度加载图像,显示图像,按 q 键直接退出而不保存,或者按 s 键保存图像并退出:

import cv2
cv2.namedWindow('window', cv2.WINDOW_NORMAL)  # 创建命名窗口
cv2.resizeWindow('window', 502, 345)  # 修改窗口尺寸
cat = cv2.imread('../resource/cat.jpg', cv2.IMREAD_GRAYSCALE)  # 读取图片
cv2.imshow('window', cat)  # 显示窗口(图片)
key = cv2.waitKey(0)  # 等待用户输入
if key & 0xFF == ord('q'):  # 按 q 退出
    cv2.destroyAllWindows()
elif key & 0xFF == ord('s'):  # 按 s 保存和退出
    cv2.imwrite('../resource/cat.png', cat)
    cv2.destroyAllWindows()

如果使用的是64位计算机,则必须按如示修改行: key & 0xFF == ord(‘q’)

3.3 ord() 函数

我们想一想:cv2.waitKey() 返回的是什么数据类型?

key = cv2.waitKey(0)
print(type(key))print(type(cv2.waitKey(0)))
<class 'int'>

cv2.waitKey() 返回的是整型,那么我们如果写成 if key & 0xFF == 'q':行不行?

答案当然是不行,因为我们知道 key 是整型,而 ‘q’ 是字符串类型,两者属于不同类型,不能给直接作比较,这就引出了 ord() 函数

ord() 函数的作用是:将字符串转换为ASCII,也就是将字符串类型转换为相对应的整型,然后就可以直接作比较。

3.4 修改 bug

当上述代码运行时发现:我们不仅可以按 q 键退出还可以按其他键退出,这就不满足我们的要求,但我们可以添加一个 while 循环:

import cv2
cv2.namedWindow('window', cv2.WINDOW_NORMAL)  # 创建命名窗口
cv2.resizeWindow('window', 502, 345)  # 修改窗口尺寸
cat = cv2.imread('../resource/cat.jpg', cv2.IMREAD_GRAYSCALE)  # 读取图片
while True:
    cv2.imshow('window', cat)  # 显示窗口(图片)
    key = cv2.waitKey(0)  # 等待用户输入
    if key & 0xFF == ord('q'):  # 按 q 退出
        break
    elif key & 0xFF == ord('s'):  # 按 s 保存和退出
        cv2.imwrite('../resource/cat.png', cat)
    else:
        print(key)  # 打印 key 值

以上代码实现:按 q 键退出,按 s 键保存图像,按 其他 键打印该键的ASCII码。

4、视频采集

4.1 VideoCapture() 获取视频设备

VideoCapture() 用法:

cap = cv2.VideoCapture(0)

参数说明:

  • 设备索引
  • 0 表示打开笔记本的内置摄像头,1 则打开外置摄像头。
  • 视频文件
  • 视频文件所在的路径。(以下会提及)

4.2 cap.read() 读取视频帧

cap.read()用法

ret, frame = cap.read()

返回值说明:

  • ret:返回布尔值(True / False ),代表是否读取到图像。
  • frame:表示截取的一帧图像。

4.3 cap.release() 释放捕获

cap.release()用法

cap.release()

4.4 代码实现

import cv2
cv2.namedWindow('video', cv2.WINDOW_NORMAL)  # 创建窗口
cv2.resizeWindow('video', 640, 480)  # 修改窗口尺寸
cap = cv2.VideoCapture(0)  # 获取视频设备
while True:
    # 从摄像头读视频帧
    ret, frame = cap.read()
    # 将视频帧在窗口显示
    cv2.imshow('video', frame)
    # 等待键盘事件,如果为q,退出
    key = cv2.waitKey(1)
    if key & 0xFF == ord('q'):
        break
cap.release()  # 释放VideoCapture
cv2.destroyAllWindows()  # 销毁窗口

5、读取视频文件

5.1 VideoCapture() 读取视频

VideoCapture() 用法:

cap = cv2.VideoCapture('../resource/fire.mp4')

参数说明:

  • 视频文件所在的路径。

5.2 VideoCapture() 小结

参数为设备索引时:获取视频设备;参数为视频文件时:从视频文件中读取视频帧。

5.3 代码实现

import cv2
cv2.namedWindow('video', cv2.WINDOW_NORMAL)  # 创建窗口
cv2.resizeWindow('video', 640, 360)  # 修改窗口尺寸
cap = cv2.VideoCapture('../resource/fire.mp4')  # 从视频文件读取视频帧
while True:
    # 从摄像头读视频帧
    ret, frame = cap.read()
    # 将视频帧在窗口显示
    cv2.imshow('video', frame)
    # 等待键盘事件,如果为q,退出
    key = cv2.waitKey(1000 // 30)
    if key & 0xFF == ord('q'):
        break
cap.release()  # 释放VideoCapture
cv2.destroyAllWindows()  # 销毁窗口

6、录制并保存视频

6.1 VideoWriter_fourcc() 多媒体格式

VideoWriter_fourcc()用法:

fourcc = cv2.VideoWriter_fourcc(c1, c2, c3, c4)

参数说明:

  • Fedora 中:DIVX,XVID,MJPG,X264,WMV1,WMV2。(最好使用XVID。MJPG会生成大尺寸的视频。X264会生成非常小的尺寸的视频)
  • Windows 中:DIVX(.avi 尚待测试和添加)
  • OSX 中:MJPG(.mp4),DIVX(.avi),X264(.mkv)。

cv2.VideoWriter_fourcc() 的参数可以写成 ('M','J','P','G') 或者 (*'MJPG') 传递。

6.2 视频录制 VideoWriter()

VideoWriter()用法:

vw = cv2.VideoWriter('../resource/out.avi', fourcc, 25, (640, 480))

参数说明:

  • 输出文件
  • 多媒体文件格式 VideoWriter_fourcc()
  • 帧率
  • 分辨率大小
  • 颜色标志(默认为True ),编码器期望颜色帧,否则它与灰度帧一起工作。
目录
相关文章
|
2月前
|
算法 计算机视觉
基于qt的opencv实时图像处理框架FastCvLearn实战
本文介绍了一个基于Qt的OpenCV实时图像处理框架FastCvLearn,通过手撕代码的方式详细讲解了如何实现实时人脸马赛克等功能,并提供了结果展示和基础知识回顾。
105 7
基于qt的opencv实时图像处理框架FastCvLearn实战
|
1月前
|
计算机视觉
Opencv学习笔记(八):如何通过cv2读取视频和摄像头来进行人脸检测(jetson nano)
如何使用OpenCV库通过cv2模块读取视频和摄像头进行人脸检测,并提供了相应的代码示例。
83 1
|
1月前
|
计算机视觉
Opencv学习笔记(三):图像二值化函数cv2.threshold函数详解
这篇文章详细介绍了OpenCV库中的图像二值化函数`cv2.threshold`,包括二值化的概念、常见的阈值类型、函数的参数说明以及通过代码实例展示了如何应用该函数进行图像二值化处理,并展示了运行结果。
335 0
Opencv学习笔记(三):图像二值化函数cv2.threshold函数详解
|
2月前
|
算法 计算机视觉
opencv图像形态学
图像形态学是一种基于数学形态学的图像处理技术,它主要用于分析和修改图像的形状和结构。
49 4
|
2月前
|
存储 计算机视觉
Opencv的基本操作(一)图像的读取显示存储及几何图形的绘制
本文介绍了使用OpenCV进行图像读取、显示和存储的基本操作,以及如何绘制直线、圆形、矩形和文本等几何图形的方法。
Opencv的基本操作(一)图像的读取显示存储及几何图形的绘制
|
1月前
|
编解码 关系型数据库 计算机视觉
Opencv学习笔记(十一):opencv通过mp4保存为H.264视频
本文介绍了如何在OpenCV中通过使用cisco开源的openh264库来解决不支持H.264编码的问题,并提供了完整的代码示例。
62 0
Opencv学习笔记(十一):opencv通过mp4保存为H.264视频
|
1月前
|
机器学习/深度学习 算法 计算机视觉
【Python篇】Python + OpenCV 全面实战:解锁图像处理与视觉智能的核心技能
【Python篇】Python + OpenCV 全面实战:解锁图像处理与视觉智能的核心技能
69 2
WK
|
3月前
|
编解码 计算机视觉 Python
如何在OpenCV中进行图像转换
在OpenCV中,图像转换涉及颜色空间变换、大小调整及类型转换等操作。常用函数如`cvtColor`可实现BGR到RGB、灰度图或HSV的转换;`resize`则用于调整图像分辨率。此外,通过`astype`或`convertScaleAbs`可改变图像数据类型。对于复杂的几何变换,如仿射或透视变换,则可利用`warpAffine`和`warpPerspective`函数实现。这些技术为图像处理提供了强大的工具。
WK
108 1
|
3月前
|
算法 计算机视觉 Python
python利用opencv进行相机标定获取参数,并根据畸变参数修正图像附有全部代码(流畅无痛版)
该文章详细介绍了使用Python和OpenCV进行相机标定以获取畸变参数,并提供了修正图像畸变的全部代码,包括生成棋盘图、拍摄标定图像、标定过程和畸变矫正等步骤。
python利用opencv进行相机标定获取参数,并根据畸变参数修正图像附有全部代码(流畅无痛版)
|
5月前
|
算法 计算机视觉
【Qt&OpenCV 图像的感兴趣区域ROI】
【Qt&OpenCV 图像的感兴趣区域ROI】
168 1