python-opencv图像和视频的读取及分解

OpenCV中提供了一个基本的视频操作类VideoCapture,它是OpenCV用来通过摄像头、视频文件或图像序列来获取及操作视频的类。VideoCapture有两种读取视频的方法,分别是通过摄像头读取和通过视频文件读取。
(1)通过打开摄像头捕捉视频

# (1) 通过打开摄像头捕捉视频
import cv2

# 获取一个视频并打开
cap = cv2.VideoCapture(0)   # 表示打开摄像头并创建摄像头对象
# 其中0表示打开内置摄像头,1表示打开外接摄像头
if cap.isOpened():      # VideoCapture对象是否成功打开
    print('已经打开了摄像头捕捉视频')
else:
    print('打开摄像头失败')

(2)通过打开视频文件读取视频

#(2)通过打开视频文件读取视频
import cv2

# 获取一个视频并打开
cap = cv2.VideoCapture('1.mp4')

if cap.isOpened():
    print('已经打开了视频')
else:
    print('视频文件打开失败')

(3)视频的分解
视频其实是由连续的图像画面组成的。当连续的图像变化每秒超过24帧画面以上时,根据视觉暂留原理,人眼就无法识别是否是静态画面了,这样平滑连续的视觉效果看起来就像是视频了。
帧率是以帧为单位的位图图像连续出现在显示器上的频率,通俗来说,就是1秒钟的帧(fps),也就是1秒钟展示的图像数量。

import os
import cv2

# 获取一个视频并打开
cap = cv2.VideoCapture('1.mp4')

if cap.isOpened():
    print('已经打开了视频文件')
    fps = cap.get(cv2.CAP_PROP_FPS)     # 返回视频的fps--帧率
    width = cap.get(cv2.CAP_PROP_FRAME_WIDTH)       # 返回视频的宽
    height = cap.get(cv2.CAP_PROP_FRAME_HEIGHT)     # 返回视频的高
    print('fps:', fps, 'width:', width, 'height:', height)
    i=0
    while 1:
        if i==15:
            print('保存了视频的前15帧图像,保存结束')
            break
        else:
            i = i+1
            # ret 读取了数据就返回True,没有读取数据(已到尾部)就返回False
            # frame 返回读取的视频数据--——帧数据
            ret, frame = cap.read()     # 读取一帧视频
            file_name = 'img'+str(i)+'.jpg'
            path = 'image'
            # cv2.imwrite(file_name, frame)     # 将图片写入当前路径下
            # 将图像写入指定路径下
            cv2.imwrite(os.path.join(path,file_name), frame)
else:
    print('视频文件打开失败')

(4)图像读取
图像读取:在算法操作中,首先要获得图像,才能进行相关的算法操作,比如目标检测、人脸识别等。

import cv2

# 读取图片函数
def read_image(src):
    # 使用opencv中的imread函数,读取图片
    img = cv2.imread(src)
    # 获取图片的宽度和高度
    height, width = img.shape[0], img.shape[1]
    print('image height is : '+str(height))
    print('image width is :'+str(width))
    # 很多时候图片长宽太大,屏幕显示不全
    # 为了便于查看图片,将图片的大小缩放到某一尺寸,比如(500,600),即宽500像素,高600像素
    img = cv2.resize(img, (500,600))
    # 显示图片
    cv2.imshow('Image', img)
    # 显示图片停顿的时间,如果是0,则一直显示。如果是100,则显示100ms
    cv2.waitKey(0)

img_path = 'person.png'
# 使用read_image函数,读取并显示图像
read_image(img_path)

(5)视频读取及跳帧处理
视频读取:视频是由一帧帧图像组成的(比如一秒25帧),但是在项目中,并不需要对所有的视频都进行读取处理,所以要学会跳帧操作(比如隔5帧使用一帧)。

import cv2

def cap_video(src):
    # 使用openCV中的VideoCapture函数,读取视频
    cap = cv2.VideoCapture(src)
    # 初始化定义frame_id,便于后面跳帧
    frame_id = 0
    # 判断cap是否读取成功
    while cap.isOpened():
        # 因为视频采集,每秒可能会采集N帧,因此使用read函数,逐帧读取
        # ret 返回True或False,表示是否读取到图片
        ret, frame = cap.read()
        # 当ret为False时,not ret为True,表示没有读取到图片,说明采集结束
        if not ret:
            # 打印输出,提示信息
            print('Camera cap over')
            continue
        # frame_id加1,便于跳帧
        frame_id += 1
        # 如果frame除以2,不等于0,则不断循环,只有等于0时,才进行到下面的显示步骤,这样可以达到跳帧的效果
        if not int(frame_id) % 2 == 0:
            continue
        # 便于观察,缩放图片,,比如(1000,800),即宽1000像素,高800像素
        frame = cv2.resize(frame, (1000,800))
        cv2.imshow('Image', frame)
        cv2.waitKey(20)

cap_video('video.mp4')

(6)视频资源释放

cap = cv2.VideoCapture('video_test.mp4')

cap.release()
cv2.destroyAllWindows()

转载自:
https://www.cnblogs.com/liming19680104/p/12307654.html

猜你喜欢

转载自blog.csdn.net/u011125673/article/details/123287174