opencv基础: 视频,摄像头读取与保存的常用方法

当然还可以从视频中抓取截图,所以现在聊一下常用的抓取视频截图的的方法。

VideoCapture 方法

python 复制代码
 cv2.VideoCapture();
 cv2.VideoCapture( device);
 cv2.VideoCapture(filename);

上面有三种构造方法,

  • 第一种是无法构造方法。

  • 第二种参数device是一个数字。

    一般笔记本如此写cv2.VideoCapture(0); 因为默认是0 ,如果有多个摄像头,就需要看设置的摄像头代表的数字了。

  • 第二种参数device是一个字符串。

    其代表是从视频文件种得到帧。

release 方法

释放资源的方法:

python 复制代码
cap = cv2.VideoCapture();
cap.release()

read 方法

read方法就是读取视频的帧的方法。

python 复制代码
cap = cv2.VideoCapture();
cap.read()
  • read() 方法返回的有两个值
    • 第一个值:为状态值,读到帧就是true
    • 第二个值:返回的视频帧,通俗的说就是图片

来一个例子:

python 复制代码
import  cv2
Cap = cv2.VideoCapture("1.mp4");
flag,phto= Cap.read();

cv2.namedWindow("Wind", cv2.WINDOW_NORMAL)
# cv2.resizeWindow("Wind", 1920, 1080)
cv2.imshow("Wind",phto)

key=cv2.waitKey(0)

if key=="q":
    cv2.destroyWindow()
Cap.release()

但是如果观察效果的话,会发现这是窗口只有镜头内容。

所以需要用一个while循环

python 复制代码
import  cv2
Cap = cv2.VideoCapture("1.mp4");
cv2.namedWindow("Wind", cv2.WINDOW_NORMAL)
# cv2.resizeWindow("Wind", 1920, 1080)
while True:
    flag, phto = Cap.read();
    if flag:
        cv2.imshow("Wind",phto)
        key=cv2.waitKey(1)
        if(key & 0xFF == ord('q')):
             break
    else:
        break
Cap.release()
#释放VideoWriter
Cap.release()
cv2.destroyAllWindows()

isOpened方法

这个方法是判断摄像头和文件是发可以正常打开,返回True 或 False:

python 复制代码
# Cap = cv2.VideoCapture(1);
Cap = cv2.VideoCapture("1.mp4");
# 可以使用判断是否摄像头打开 作为标识符值
Cap.isOpened() 

可以读取文件的方法修改为:

python 复制代码
import  cv2
# 如果是通过摄像头的话
# Cap = cv2.VideoCapture(1);
Cap = cv2.VideoCapture("1.mp4");
cv2.namedWindow("Wind", cv2.WINDOW_NORMAL)
# cv2.resizeWindow("Wind", 1920, 1080)
# Cap.isOpened():  可以使用判断是否摄像头打开  以及文件是否可以正常打开
while Cap.isOpened():
    flag, phto = Cap.read();
    if flag:
        cv2.imshow("Wind",phto)
        # cv2.resizeWindow("Wind", 1920, 1080)
        key=cv2.waitKey(1)
        if(key & 0xFF == ord('q')):
             break
    else:
        break
Cap.release()
#释放VideoWriter
Cap.release()
cv2.destroyAllWindows()

补充

这里补充一点 如果再循环外:

python 复制代码
cv2.resizeWindow("Wind", 1920, 1080)

只会在循环种呈现一次,如果真的需要,那就行说在循环体内再写一遍。

VideoWriter方法

有时候,打开摄像头等,需要将内容保存到本地,所以就需要这个方法:

如下:

python 复制代码
cv2.VideoWriter(filename, fourcc, fps, frameSize, isColor)
  1. filename(必选):要写入的视频文件的名称。

  2. fourcc(必选):用于指定视频编解码器的4个字符代码。例如,'MJPG'表示Motion JPEG编码。

    python 复制代码
    fourcc = cv2.VideoWriter_fourcc(*'MJPG')
  3. fps(必选):视频的帧率,以每秒帧数(FPS)为单位。

  4. frameSize(必选):视频帧的大小,以像素为单位。

  5. isColor(可选):一个布尔值,指示是否使用彩色。如果为True,则使用彩色,否则为灰度。

python 复制代码
filename = 'tang1.avi'
fourcc = cv2.VideoWriter_fourcc(*'MJPG')
fps = 30.0
frameSize = (640, 480)
isColor = True

# 创建VideoWriter对象
out = cv2.VideoWriter(filename, fourcc, fps, frameSize, isColor)

不过这个等于创建了个对象,还需要进入写入,所以需要在用如下方法:

python 复制代码
#frame = cv2.imread('frame.jpg') 或者是视频  flag, frame = Cap.read();
out.write(frame)

结合如下写:

python 复制代码
import  cv2
# 如果是通过摄像头的话
# Cap = cv2.VideoCapture(1);
Cap = cv2.VideoCapture("1.mp4");
cv2.namedWindow("Wind", cv2.WINDOW_NORMAL)
filename = 'tang1.avi'
fourcc = cv2.VideoWriter_fourcc(*'MJPG')
fps = 30.0
frameSize = (640, 480)
isColor = True

# 创建VideoWriter对象
out = cv2.VideoWriter(filename, fourcc, fps, frameSize, isColor)
# cv2.resizeWindow("Wind", 1920, 1080)
# Cap.isOpened():  可以使用判断是否摄像头打开  以及文件是否可以正常打开
while Cap.isOpened():
    flag, frame = Cap.read();
    if flag:
        cv2.imshow("Wind",phto)
        out.write(frame)
        # cv2.resizeWindow("Wind", 1920, 1080)
        key=cv2.waitKey(1)
        if(key & 0xFF == ord('q')):
             break
    else:
        break
Cap.release()
#释放VideoWriter
Cap.release()
cv2.destroyAllWindows()
相关推荐
科创致远4 分钟前
第一代 e+SOP 盒子配显示器实测:物美价廉的产线可视化方案
大数据·网络·人工智能·信息可视化·计算机外设·制造·精益工程
疯狂成瘾者7 分钟前
海康威视 WSS 视频取流原理:6014/559 端口、Nginx 代理与 TLS 证书问题
运维·nginx·音视频
志尊宝8 分钟前
AI原生前端开发(010):AI时代的开发者工作流重构
人工智能·重构·ai-native
努力变大白12 分钟前
用 ReAct 搭一个简单 Agent:零基础操作指南
人工智能·agent·react框架
像风一样自由202012 分钟前
59.实战为RAG系统加入评估监控权限和审计
人工智能·智能体
QYR-分析14 分钟前
汽车可开启全景天窗:座舱舒适核心配置,智能化升级打开产品溢价空间
大数据·人工智能·汽车
king135987455014 分钟前
LiteRT Tensor API:C++ 编写端侧模型图,XNNPACK、GPU 与 NPU 怎么选?
开发语言·c++·人工智能·chatgpt·架构·aigc
企业数字化笔记14 分钟前
AI视频怎么做超分辨率增强?逐帧处理、画幅控制与音画验收
网络·人工智能·音视频
解决问题no解决代码问题18 分钟前
Java 金融后端转 LLM 应用开发 Day3:LLM 写作 / 阅读 / 聊天能力拆解与核心边界(附金融场景落地方法)
人工智能
CS_Zero19 分钟前
大模型时代的SLAM
人工智能·机器学习·slam