由于在streanlit中使用st.file_uploader上传视频后,视频文件变为BytesIO的格式无法使用opencv打开并逐帧进行处理。
我们使用创造临时文件的方法来实现opencv处理上传文件,代码如下
import streamlit as st
import tempfile
import cv2
image_placeholder = st.empty() # 创建空白块使得图片展示在同一位置
f = st.file_uploader("Upload file") # 上传本地视频
if f is not None:
tfile = tempfile.NamedTemporaryFile(delete=False)
tfile.write(f.read())
cap = cv2.VideoCapture(tfile.name) # opencv打开文件
if (cap.isOpened() == False):
st.write("Error opening video stream or file")
while (cap.isOpened()):
success, frame = cap.read()
if success:
to_show = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)
image_placeholder.image(to_show, caption='Video') # 将图片帧展示在同一位置得到视频效果
else:
break
cap.release()