使用opencv处理视频后通过局域网转发实现网页实时查看
安装所需的软件
- OpenCV: 用于处理图像和视频流
- Flask: 用于创建Web服务器和处理HTTP请求
原理
- 使用OpenCV的VideoCapture类来捕获摄像头的视频流
- 使用OpenCV的imencode函数将每一帧图像编码成JPEG格式
- 使用Flask框架创建一个Web服务器,并定义一个路由来处理视频流的请求
- 使用Response对象将视频流以multipart/x-mixed-replace格式返回给客户端
- 客户端通过标签请求视频流,并显示在网页上
使用方法
- 安装OpenCV和Flask
pip install opencv-python flask
- 运行脚本
python camera_test.py
- 打开浏览器,访问
- http://0.0.0.0:5000/,即可看到摄像头的实时视频流(本地访问)
- http://192.168.31.83:5000/ (以太网IP地址或者WLAN IP地址)
测试
视频
总结
蛮好用的,我的镜头模糊和抖动是因为我的摄像头很唠,34块200万像素720P自动对焦,不准喷;明显本地访问和以太网访问(第二个网址是以太网的)没有啥差别,速度很快,用手机热点(第三个)就很卡,但我觉得问题不大,因为我用的是iPhone11,4G手机+IPhone,debuff叠满了属于是,所以我觉得 上5G问题的话,视频流应该没那么卡。
做机器人的时候,测试起来蛮方便的。
源代码
import cv2
from flask import Flask, Response
app = Flask(__name__)
# 打开摄像头,参数0表示第一个摄像头
cap = cv2.VideoCapture(0)
if not cap.isOpened():
print("无法打开摄像头")
exit()
def generate_frames():
while True:
# 读取一帧图像
ret, frame = cap.read()
if not ret:
print("无法接收帧 (stream end?). Exiting ...")
break
# 编码成JPEG格式
ret, buffer = cv2.imencode('.jpg', frame)
frame = buffer.tobytes()
# 使用yield生成视频流
yield (b'--frame\r\n'
b'Content-Type: image/jpeg\r\n\r\n' + frame + b'\r\n')
@app.route('/video_feed')
def video_feed():
return Response(generate_frames(), mimetype='multipart/x-mixed-replace; boundary=frame')
@app.route('/')
def index():
return '''
<html>
<head>
<title>Camera Stream</title>
</head>
<body>
<h1>Camera Stream</h1>
<img src="/video_feed">
</body>
</html>
'''
if __name__ == '__main__':
app.run(host='0.0.0.0', port=5000)
# 释放摄像头并关闭所有窗口
cap.release()
cv2.destroyAllWindows()