当前位置:AIGC资讯 > 数据采集 > 正文

4.通过Opencv采集摄像头视频数据

VideoCapture() 虚拟采集器,一般设备号从0开始

cap.read() 读取视频帧

返回值有两个,第一个为状态值,读到帧为true

第二个值为视频帧

cap.release() 释放资源

示例程序:

import cv2  #引入CV库
#创建窗口
cv2.namedWindow('video',cv2.WINDOW_NORMAL)
cv2.resizeWindow('video',300,300)  #设置窗口大小

#获取视频设备
cap = cv2.VideoCapture(0)
while True:
    #从摄像头读视频帧
    ret,frame = cap.read()
    #将视频帧在窗口中显示
    cv2.imshow('video',frame)
    key = cv2.waitKey(1)  #不能为0,0为等待中断,只能读取到一帧的数据
    if(key & 0xFF == ord('q')):
        break

#释放资源
cap.release() #释放视频资源
cv2.destroyAllWindows()  #释放窗口资源

运行结果:

读取视频文件

从视频文件中读取视频帧

cap = cv2.VideoCapture("文件地址")   #从文件获取视频

只处理视频,不处理音频,所以读取到的视频没有声音

播放速度设置

key = cv2.waitKey(40) 

 将视频数据录制成多媒体文件

VideoWriter()  

write()

1秒多少帧,视频的像素(宽和高)

release()   释放资源,将磁盘中的数据输出

VideoWriter()  参数:

参数1:为输出文件位置

参数2:多媒体文件格式(VideoWriter_fourcc),fourcc所用编码器,Windows系统采用DIVX编码器

 参数3:帧率

参数4:分辨率大小,应为摄像头实际分辨率

示例程序:

import cv2

#创建VideoWriter为写多媒体文件
fourcc = cv2.VideoWriter_fourcc(*'DIVX')
vw = cv2.VideoWriter("C:\\Users\\Mengyang\\Desktop\\out.mp4",fourcc,25,(640,480))
#

#创建窗口
cv2.namedWindow('video',cv2.WINDOW_NORMAL)
cv2.resizeWindow('video',300,300)  #设置窗口大小

#获取视频设备
cap = cv2.VideoCapture(0)
#cap = cv2.VideoCapture("文件地址")   从文件获取视频

while True:
    #从摄像头读视频帧
    ret,frame = cap.read()
    #将视频帧在窗口中显示
    cv2.imshow('video',frame)
    #写数据到多媒体文件
    vw.write(frame)

    key = cv2.waitKey(1)  #不能为0,0为等待中断,只能读取到一帧的数据
    if(key & 0xFF == ord('q')):
        break

#释放资源
cap.release() #释放VideoCapture
vw.release() #释放VideoWrite
cv2.destroyAllWindows()  #释放窗口资源

代码优化

问题1:显示窗口为什么变大了?

在视频帧在窗口显示时重新设置一下窗口大小。

问题2:使用isOpened()判断摄像头是否已打开

问题3:采集数据时要判断数据是否获取到了

优化过的程序:

import cv2

#创建VideoWriter为写多媒体文件
fourcc = cv2.VideoWriter_fourcc(*'DIVX')
vw = cv2.VideoWriter("C:\\Users\\Mengyang\\Desktop\\out.mp4",fourcc,25,(640,480))

#创建窗口
cv2.namedWindow('video',cv2.WINDOW_NORMAL)
cv2.resizeWindow('video',300,300)  #设置窗口大小

#获取视频设备
cap = cv2.VideoCapture(0)
#cap = cv2.VideoCapture("文件地址")   从文件获取视频

while cap.isOpened():    #判断摄像头是否已打开,若打开返回值则为True
    #从摄像头读视频帧
    ret,frame = cap.read()
    if ret ==True : #判断是否读取到数据
        #将视频帧在窗口中显示
        cv2.imshow('video',frame)
        cv2.resizeWindow('video',300,300)  #重新设置窗口大小
        #写数据到多媒体文件
        vw.write(frame)

        key = cv2.waitKey(1)  #不能为0,0为等待中断,只能读取到一帧的数据
        if(key & 0xFF == ord('q')):
            break
    else:
        break
#释放资源
cap.release() #释放VideoCapture
vw.release() #释放VideoWrite
cv2.destroyAllWindows()  #释放窗口资源

更新时间 2023-11-08