使用opencv处理视频后通过局域网转发实现网页实时查看



使用opencv处理视频后通过局域网转发实现网页实时查看

安装所需的软件

  • OpenCV: 用于处理图像和视频流
  • Flask: 用于创建Web服务器和处理HTTP请求

原理

  1. 使用OpenCV的VideoCapture类来捕获摄像头的视频流
  2. 使用OpenCV的imencode函数将每一帧图像编码成JPEG格式
  3. 使用Flask框架创建一个Web服务器,并定义一个路由来处理视频流的请求
  4. 使用Response对象将视频流以multipart/x-mixed-replace格式返回给客户端
  5. 客户端通过标签请求视频流,并显示在网页上

使用方法

  1. 安装OpenCV和Flask
    pip install opencv-python flask
  2. 运行脚本
    python camera_test.py
  3. 打开浏览器,访问

测试

视频

总结
蛮好用的,我的镜头模糊和抖动是因为我的摄像头很唠,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()






文章作者: biubiu选手
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 biubiu选手 !
评论
  目录