You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Flask中配置OpenCV,以直接IP地址路径形式获取图像流?

实现Flask返回静态URL形式的实时OpenCV处理图像

核心思路

不需要维持MJPEG流式连接,而是创建一个固定路径的路由,每次请求该URL时,实时捕获、处理OpenCV帧并返回JPEG格式的图像响应。前端直接通过ip.address.of.server/latest_frame.jpg这类URL访问即可。

实现步骤

  1. 初始化全局摄像头捕获对象
    把OpenCV的摄像头捕获对象设为全局,避免每次请求都重新初始化摄像头(会导致卡顿或设备占用冲突):
import cv2
import numpy as np
from flask import Flask, Response, make_response

app = Flask(__name__)

# 初始化摄像头,0为默认摄像头索引,树莓派使用CSI摄像头可尝试调整为0或cv2.CAP_V4L2
cap = cv2.VideoCapture(0)

# 检查摄像头是否成功打开
if not cap.isOpened():
    raise RuntimeError("无法打开摄像头,请检查设备连接或索引设置")
  1. 创建返回实时图像的路由
    写一个路由,路径设为你想要的文件名形式(比如/latest_frame.jpg),在路由函数里完成帧捕获、处理、编码和响应返回:
@app.route('/latest_frame.jpg')
def get_latest_frame():
    # 捕获一帧图像
    ret, frame = cap.read()
    if not ret:
        # 捕获失败时返回一张黑色占位图
        placeholder = np.zeros((480, 640, 3), dtype=np.uint8)
        _, jpeg_data = cv2.imencode('.jpg', placeholder)
        return Response(jpeg_data.tobytes(), mimetype='image/jpeg')
    
    # 这里添加你的OpenCV处理逻辑,示例:转为灰度图后转回3通道(保证JPEG编码正常)
    processed_frame = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
    processed_frame = cv2.cvtColor(processed_frame, cv2.COLOR_GRAY2BGR)
    
    # 将处理后的帧编码为JPEG字节
    _, jpeg_data = cv2.imencode('.jpg', processed_frame)
    jpeg_bytes = jpeg_data.tobytes()
    
    # 构建响应并禁用缓存,避免浏览器复用旧图像
    resp = make_response(jpeg_bytes)
    resp.headers['Content-Type'] = 'image/jpeg'
    resp.headers['Cache-Control'] = 'no-store, no-cache, must-revalidate, max-age=0'
    resp.headers['Pragma'] = 'no-cache'
    return resp
  1. 前端调用
    直接在HTML中使用该URL,若需要自动刷新图像,可通过JS添加时间戳避免缓存:
<!-- 基础写法,仅加载一次最新图像 -->
<img src="http://ip.address.of.server/latest_frame.jpg" />

<!-- 自动刷新版本,每100毫秒更新一次(可调整间隔) -->
<img id="live-img" src="" />
<script>
    function updateImage() {
        const img = document.getElementById('live-img');
        // 加?t=时间戳强制浏览器请求新图像
        img.src = 'http://ip.address.of.server/latest_frame.jpg?t=' + new Date().getTime();
    }
    setInterval(updateImage, 100);
</script>
  1. 启动Flask应用
    添加启动代码,允许外部设备访问:
# 释放摄像头资源的钩子,程序关闭时自动执行
import atexit
def release_camera():
    cap.release()
atexit.register(release_camera)

if __name__ == '__main__':
    # host设为0.0.0.0允许外部访问,端口可自定义
    app.run(host='0.0.0.0', port=5000, debug=True)

注意事项

  • 摄像头索引:若设备有多个摄像头,需调整cv2.VideoCapture()的参数,比如USB摄像头可能用1,树莓派CSI摄像头可尝试0或cv2.CAP_V4L2。
  • 性能优化:若处理逻辑复杂,可降低帧大小或调整刷新间隔,避免服务器资源占用过高。

内容的提问来源于stack exchange,提问作者lincolnberryiii

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.28 03:22:51