欢迎来到军工软件开发人才培养基地——学到牛牛

读取图像和视频

时间:2024-05-06 07:01:10 来源:学到牛牛

1、图像处理

在OpenCV中使用vc2.imread()函数读取图像,cv2.imread()有两个参数,第一个参数filename是图片路径,第二个参数flags表示图片读取模式,常用有两种。

cv2.IMREAD_COLOR:加载彩色图片,这个是默认参数,可以直接写1。

cv2.IMREAD_GRAYSCALE:以灰度模式加载图片,可以直接写0。

 

在OpenCV开发过程中,经常用将RGB图像转换为灰度图像进行操作,因为在灰度图像中更利于检测和操作。在OpenCV的任意阶段,均可以将灰度图与彩色图进行互相转换。

读取灰色图示例如下。

import cv2

img = cv2.imread(“xx.png”, cv2.IMREAD_GRAYSCALE)

或者

import cv2

img = cv2.imread(“xx.png”, 1)

 

运行结果如图1.1。

图1.1 灰度图运行结果

1.1 常用属性

img.shape:获取图片的hwc,其中h为图片高度,w为图片宽度,c为图片通道。彩色图像有3个通道,分别为B、G、R;灰度图像只有1个通道,使用shape属性查询后不显示通道个数。

type(img):type()函数用于查看变量类型,所有的图像对象的底层类型是numpy.ndarray类型。

img.size:用于获取图像的像素个数(即:宽 X 高)。

img.dtype:用于查看数据的类型。

cv2.imwrite(dst, img):用于保存图像到指定位置。dst表示存储的路径,img表示图像对象。

 

2、视频读取

2.1 读取视频或连接摄像头

OpenCV中使用cv2.VideoCapture(str | 0)函数来读取视频,返回值为cv2.VideoCapture类型,如果该函数中的值是str,参数是视频文件路径。如果函数中的值是0,表示打开笔记本的内置摄像头。

视频是由多帧组成,每一帧可以看成一张图像,将图像连接在一起就可以看成一个动态的图像集(即视频)。

示例如下。

video = cv2.VideoCapture("E:/tmp/img/2023711.mp4")

2.2 按帧读取视频

ret, frame = video.read()

video.read()按帧读取视频,ret, frame是获cap.read()方法的两个返回值。 其中ret是布尔值,如果读取帧是正确的则返回True,如果文件读取到结尾,它的返回值就为False。frame就是每一帧的图像,是个三维矩阵。

2.3 等待键盘输入

cv2.waitKey(50)

waitKey()方法本身表示等待键盘输入,参数是50,表示延时50ms切换到下一帧图像。

对于视频而言;参数为0,如cv2.waitKey(0)只显示当前帧图像,相当于视频暂停;参数过大如cv2.waitKey(1000),会因为延时过久而卡顿感觉到卡顿。

v2.waitKey()返回值是键盘输入的ASCII码,esc键对应的ASCII码是27,即当按esc键是if条件句成立。

2.4 显示每一帧图像

cv2.imshow("result", frame)

imshow()函数用于显示图像,result为是窗口的名字(ID),frame是需要显示图像的三维矩阵。

使用video.read()函数循环读取视频,然后使用cv2.imshow()函数循环在同一个窗口中显示,即可以实现视频播放效果。

2.5 释放摄像头

调用video.release()函数用于释放摄像头或视频,调用cv2.destroyAllWindows()关闭所有图像窗口。

2.6 视频读取示例

以下示例用于打开一个视频,并将每一帧图像修改为灰度图像,然后再循环显示出来,实现彩色视频转为黑白视频的效果。

import cv2

 

# 读取视频文件,参数为0表示打开摄像头

video = cv2.VideoCapture("E:/tmp/img/2023711.mp4")

while True:

    # read()读取当前桢图片,返回两个值,ret用于接收是否成功读取,frame用于接收读取到的当前图像矩阵

    ret, frame = video.read()

    # 如果frame为空,则表示没有图像矩阵,中止循环即可

    if frame is None:

        break

    # 如果当前图像为True,进行图像处理后再显示

    if ret:

        gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)

        # 将转换好的图像在result窗口中打开(即下一张会覆盖上一张)

        cv2.imshow("result", gray)

 

        # 如果键盘输入为Esc键,则结束视频

        # 27表示Esc键,更多字符对应数字见“符号对应数字表”

        # ord()函数用于将字符转为对应数字

key = cv2.waitKey(25)

        if key == 27 or key == ord("q"):

            break

 

# 释放视频

video.release()

# 销毁所有窗口

cv2.destroyAllWindows()