python - 如何使用 cv2.VideoCapture() 阅读上传到 Flask 应用程序的视频?
问题描述
是否可以创建一个网络应用程序来从我们的计算机发送视频并进行处理cv2.VideoCapture()
?
在 index.html 中,我通过
<form action="{{ url_for('predict')}}" method="POST" enctype="multipart/form-data">
在 main.py
@app.route('/', methods=['POST'])
def predict():
if request.method == 'POST':
logging.debug('Before my_prediction')
uploaded_file = request.files['filename']
extent = uploaded_file.filename.split('.')[1]
app.logger.info(extent)
vidcap = cv2.VideoCapture(uploaded_file)
我试过这样做,但得到了这个错误:
TypeError: an integer is required (got type FileStorage)
解决方案
使用将文件保存到服务器上的临时文件FileStorage.save()
,然后将该临时文件的名称传递给cv2.VideoCapture
:
from pathlib import Path
import tempfile
@app.route('/', methods=['POST'])
def predict():
if request.method == 'POST':
uploaded_file = request.files['filename']
with tempfile.TemporaryDirectory() as td:
temp_filename = Path(td) / 'uploaded_video'
uploaded_file.save(temp_filename)
vidcap = cv2.VideoCapture(str(temp_filename))
# do stuff with vidcap
Request.files
是对象的字典(更准确地说是 a MultiDict
)FileStorage
,而cv2.VideoCapture
需要一个作为文件路径的字符串。
推荐阅读
- python - 如何在 Oozie 工作流中执行 Python?
- azure-data-factory-2 - 如何比较 ADF 数据流中的 2 个数据集并保存差异?
- c - 你如何存储来自同一输入的 2 个不同的值
- php - 我如何将域(例如 example.com)重定向到 AWS Route53 中的子目录 example.com/data/
- r - 如何根据每行的一部分按字母顺序对文本行进行排序?
- java - 如何使用 ZonedDateTime 将日期字符串格式化为日期和时间?
- symfony - Symfony 5 在条件下切换缓存适配器
- c++ - 持有数组内存布局的类数组
- linux - 是否可以更换实时安装的 BTRFS RAID 上的驱动器?
- c# - 使用 Microsoft.OData.Client 为导航属性和子类创建 OData 查询 URL