软件环境

本系列文章中所提到的接口及代码在以下环境中得到过验证:

Python == 3.8.5
opencv-contrib-python == 4.5.5.64

前言

OpenCV的imread()、imwrite()、imshow()函数分别用于读写和显示图像。VideoCapture类和VideoWriter类提供了视频处理能力,支持各种格式的视频文件。

截取官方文档对该部分的描述如下:查看原文

opencv创建纹理 opencv writer_灰度

计算机在处理图像信息时,将灰度处理为256级(0~255),0表示黑色,255表示白色,用一个字节来存储一个像素值。OpenCV使用单通道的二维数组来表示灰度图像。对于彩色通道,颜色的表示方法有所不同,可以根据公式相互转化。例如R、G、B通道,用3个通道的像素组合表示彩色图像。在OpenCV中可以对图像的彩色通道进行拆分和合并(需要注意的是OpenCV默认的图像格式为BGR)。

读、写、显示图像

提供一张图片供测试,右键图片另存为成test.jpg

opencv创建纹理 opencv writer_ide_02

1、读取彩色图像并进行显示

import cv2

image1 = cv2.imread('test.jpg',cv2.IMREAD_COLOR) # 加载彩色图像。任何图像的透明度都会被忽视。它是默认标志
image2 = cv2.imread('test.jpg',cv2.IMREAD_GRAYSCALE) # 以灰度模式加载图像
image3 = cv2.imread('test.jpg',cv2.IMREAD_UNCHANGED) # 加载图像,包括alpha通道
cv2.imshow("IMREAD_COLOR",image1)
cv2.imshow("IMREAD_GRAYSCALE",image2)
cv2.imshow("IMREAD_UNCHANGED",image3)
cv2.waitKey()

结果:

opencv创建纹理 opencv writer_ide_03

2、加载、保存、显示彩色图像

import cv2

image1 = cv2.imread('test.jpg',cv2.IMREAD_COLOR) # 加载彩色图像

cv2.imwrite('test1.jpg',image1)     # 保存图像

cv2.imshow("IMREAD_COLOR",image1)   # 显示图像
cv2.waitKey()

opencv创建纹理 opencv writer_计算机视觉_04

3、使用imread()读取RGB图像,利用 matplotlib.pyplot显示图像

注:Matplotlib 是一个 Python 的 2D绘图库,常用于绘制数学图表

import cv2
import matplotlib.pyplot as plt

image = cv2.imread('test.jpg', cv2.IMREAD_COLOR)
image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB) # 转换颜色通道

plt.imshow(image)
plt.axis('off')
plt.show()

opencv创建纹理 opencv writer_ide_05

读、写、播放视频

视频处理的一般步骤如下:
(1) 将视频文件或摄像头作为数据来源来创建VideoCapture对象。
(2) 调用VideoCapture对象的read()方法获取视频中的帧,每一帧都是一幅图像。
(3)调用VideoWriter对象的writer()方法将帧写入视频文件,或者调用cv2.imshow()函数在窗口中显示帧(即播放视频)。

1、从视频文件获取图像数据,并在窗口中展示

import cv2

capture = cv2.VideoCapture('test.mp4') # 读取视频文件

frame_width = capture.get(cv2.CAP_PROP_FRAME_WIDTH)
frame_height = capture.get(cv2.CAP_PROP_FRAME_HEIGHT)
fps = capture.get(cv2.CAP_PROP_FPS)

print("frame width(宽): {}".format(frame_width))
print("frame height(高): {}".format(frame_height))
print("frames per second(帧FPS): {}".format(fps))

if capture.isOpened() is False: # 判断摄像头是否打开 capture.isOpened() --> 返回True or False
    print('CAMERA ERROR !')
    
while capture.isOpened():
    ret, frame = capture.read() # 通过摄像头,一帧一帧的捕获,返回一个布尔值(True/False),捕获每一帧(每一张照片)
    if ret is True: # ret读取成功为True、读取失败为False --> 本地视频文件读取完成后关闭(brake)视频
        cv2.imshow('FRAME', frame) # 显示捕获的帧
        gray_frame = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY) # 将捕获的帧转化为灰度的帧
        cv2.imshow('GRAY FRAME', gray_frame) # 显示灰度的帧
        k = cv2.waitKey(1)
        if k == ord('q'):
            break
    else:
        break
capture.release()
cv2.destroyAllWindows()

2、读取彩色视频文件,从100帧开始保存为灰度视频文件

import cv2

# 读取彩色视频文件,从100帧开始保存为灰度视频文件
capture = cv2.VideoCapture('test.mp4')

frame_width = capture.get(cv2.CAP_PROP_FRAME_WIDTH)
frame_height = capture.get(cv2.CAP_PROP_FRAME_HEIGHT)
fps = capture.get(cv2.CAP_PROP_FPS)

capture.set(cv2.CAP_PROP_POS_FRAMES,100)    # 从第100帧开始读取

if capture.isOpened() is False:
    print("Camera Error")
    
fourcc = cv2.VideoWriter_fourcc(*"XVID")
output_gray = cv2.VideoWriter('test_out.mp4', fourcc, int(fps), (int(frame_width),int(frame_height)), False)

while capture.isOpened():
    ret, frame = capture.read()
    
    if ret is True:
        
        gray_frame = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
        output_gray.write(gray_frame)
        
        cv2.imshow('Gray',gray_frame)
        k = cv2.waitKey(1)
        if k == ord('s'):
            break
    else:
        break

capture.release()
output_gray.release()
cv2.destroyAllWindows()

3、API介绍

(1)从视频文件、图像序列或摄像机捕获视频

opencv创建纹理 opencv writer_opencv创建纹理_06


如果是从视频文件中读取视频:

capture = cv2.VideoCapture('test.mp4') # 读取视频文件

如果是从摄像头读取视频:

capture = cv2.VideoCapture(0) # 0一般代表笔记本自带的摄像头,不同的数字代表不同的摄像头

(2)获取视频流的参数信息

官方文档中罗列了所有支持获取到的参数信息,下面的例子是获取视频流中帧的宽度与高度:

frame_width = capture.get(cv2.CAP_PROP_FRAME_WIDTH)
frame_height = capture.get(cv2.CAP_PROP_FRAME_HEIGHT)

注:在部分场景下,所获取到的视频流信息不一定准确,使用过程中需要留意。

opencv创建纹理 opencv writer_灰度_07

(3)设置视频流的参数

官方文档中罗列了可能的参数,但是不是所有参数都是支持设置的
下面的示例是让视频流从(视频文件)第100帧的时候开始读取:

capture.set(cv2.CAP_PROP_POS_FRAMES,100)    # 从第100帧开始读取

注:以上示例的操作是会耗费一定时间的,使用时请注意(耗时与所设置的帧数有关,有机会另外写文章进行介绍)

(4)读取视频帧

以下操作为抓取、解码并返回下一个视频帧:

# The method/function combines VideoCapture::grab() and VideoCapture::retrieve() in one call. 
ret, frame = capture.read()

😄如果只是想跳帧(即只抓取,不解码),使用下面的操作速度更快:

# 该方法/函数从视频文件或摄像机中抓取下一帧,并在成功的情况下返回 true(非零)。
ret = capture.grab()

引用

官方接口文档:https://docs.opencv.org/4.5.5/d6/d00/tutorial_py_root.html 【OpenCV-Python】3.OpenCV的图像基础操作: