首页 > 其他分享 >flask_video_stream

flask_video_stream

时间:2023-05-05 23:57:02浏览次数:27  
标签:__ stream img flask cap cv2 video io

/Users/song/Code/flask_video_stream/main3.py

from flask import Flask, Response, send_file
import cv2
from PIL import Image
import io

app = Flask(__name__)

def generate_frames():
    cap = cv2.VideoCapture(0) #打开第一个摄像头

    if not cap.isOpened():
        print("ERROR!!Unable to open camera 1")
        exit()

    while True:
        ret, img = cap.read() #从第一个摄像头捕获图像

        # 将 OpenCV 图像转换为 JPEG 图像
        ret, jpeg = cv2.imencode('.jpg', img)

        # 返回 JPEG 图像数据
        yield (b'--frame\r\n'
               b'Content-Type: image/jpeg\r\n\r\n' + jpeg.tobytes() + b'\r\n\r\n')

@app.route('/video_feed')
def video_feed():
    return Response(generate_frames(),
                    mimetype='multipart/x-mixed-replace; boundary=frame')

@app.route('/capture')
def capture():
    cap = cv2.VideoCapture(1) #打开第二个摄像头

    if not cap.isOpened():
        return "ERROR!!Unable to open camera 2"

    ret, img = cap.read() #从第二个摄像头捕获图像

    cap.release() #释放第二个相机捕获对象

    # 将 OpenCV 图像转换为 PIL 图像
    img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
    pil_img = Image.fromarray(img)

    # 将 PIL 图像保存到内存中
    img_io = io.BytesIO()
    pil_img.save(img_io, 'JPEG')
    img_io.seek(0)

    # 使用 send_file 函数返回图像
    return send_file(img_io, mimetype='image/jpeg')

if __name__ == '__main__':
    app.run()

/Users/song/Code/flask_video_stream/main6.py

import time
from flask import Flask, Response, send_file
import cv2
from PIL import Image
import io
import threading

app = Flask(__name__)

# 定义一个全局变量,用于控制视频流是否关闭
close_video = False

# 定义一个条件变量,用于实现线程间的同步
cond = threading.Condition()

def generate_frames():
    global close_video, cond

    cap = cv2.VideoCapture(0) #打开第一个摄像头

    if not cap.isOpened():
        print("ERROR!!Unable to open camera 1")
        exit()

    while True:
        with cond:
            # 如果 close_video 为 True,则释放摄像头并等待
            if close_video:
                cap.release()
                cond.wait()
                cap.open(0)

        ret, img = cap.read() #从第一个摄像头捕获图像

        # 将 OpenCV 图像转换为 JPEG 图像
        ret, jpeg = cv2.imencode('.jpg', img)

        # 返回 JPEG 图像数据
        yield (b'--frame\r\n'
               b'Content-Type: image/jpeg\r\n\r\n' + jpeg.tobytes() + b'\r\n\r\n')

@app.route('/video_feed')
def video_feed():
    return Response(generate_frames(),
                    mimetype='multipart/x-mixed-replace; boundary=frame')

@app.route('/capture')
def capture():
    global close_video, cond

    with cond:
        # 设置 close_video 为 True,使视频流关闭
        close_video = True

    cap = cv2.VideoCapture(0) #打开第二个摄像头
    time.sleep(3)

    if not cap.isOpened():
        return "ERROR!!Unable to open camera 2"

    ret, img = cap.read() #从第二个摄像头捕获图像

    cap.release() #释放第二个相机捕获对象

    # 将 OpenCV 图像转换为 PIL 图像
    img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
    pil_img = Image.fromarray(img)

    # 将 PIL 图像保存到内存中
    img_io = io.BytesIO()
    pil_img.save(img_io, 'JPEG')
    img_io.seek(0)

    with cond:
        # 设置 close_video 为 False,使视频流重新打开
        close_video = False
        # 唤醒等待的线程
        cond.notify_all()

    # 使用 send_file 函数返回图像
    return send_file(img_io, mimetype='image/jpeg')

if __name__ == '__main__':
    app.run()

/Users/song/Code/flask_video_stream/main2.py

from flask import Flask, send_file
import cv2
import numpy as np
from PIL import Image
import io
import time

app = Flask(__name__)

@app.route('/capture')
def capture():
    cap = cv2.VideoCapture(0) #打开相机
    time.sleep(3)

    if not cap.isOpened():
        return "ERROR!!Unable to open camera"

    ret, img = cap.read() #捕获图像

    cap.release() #释放相机捕获对象

    # 将 OpenCV 图像转换为 PIL 图像
    img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
    pil_img = Image.fromarray(img)

    # 将 PIL 图像保存到内存中
    img_io = io.BytesIO()
    pil_img.save(img_io, 'JPEG')
    img_io.seek(0)

    # 使用 send_file 函数返回图像
    return send_file(img_io, mimetype='image/jpeg')

if __name__ == '__main__':
    app.run(debug=True)

/Users/song/Code/flask_video_stream/main5.py

import time
from flask import Flask, Response, send_file
import cv2
from PIL import Image
import io
import threading

app = Flask(__name__)

# 定义一个全局变量,用于控制视频流是否暂停
pause_video = False

# 定义一个条件变量,用于实现线程间的同步
cond = threading.Condition()

def generate_frames():
    global pause_video, cond

    cap = cv2.VideoCapture(0) #打开第一个摄像头

    if not cap.isOpened():
        print("ERROR!!Unable to open camera 1")
        exit()

    while True:
        with cond:
            # 如果 pause_video 为 True,则等待
            while pause_video:
                cond.wait()

        ret, img = cap.read() #从第一个摄像头捕获图像

        # 将 OpenCV 图像转换为 JPEG 图像
        ret, jpeg = cv2.imencode('.jpg', img)

        # 返回 JPEG 图像数据
        yield (b'--frame\r\n'
               b'Content-Type: image/jpeg\r\n\r\n' + jpeg.tobytes() + b'\r\n\r\n')

@app.route('/video_feed')
def video_feed():
    return Response(generate_frames(),
                    mimetype='multipart/x-mixed-replace; boundary=frame')

@app.route('/capture')
def capture():
    global pause_video, cond

    with cond:
        # 设置 pause_video 为 True,使视频流暂停
        pause_video = True

    cap = cv2.VideoCapture(0) #打开第二个摄像头
    time.sleep(3)

    if not cap.isOpened():
        return "ERROR!!Unable to open camera 2"

    ret, img = cap.read() #从第二个摄像头捕获图像


    cap.release() #释放第二个相机捕获对象

    # 将 OpenCV 图像转换为 PIL 图像
    img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
    pil_img = Image.fromarray(img)

    # 将 PIL 图像保存到内存中
    img_io = io.BytesIO()
    pil_img.save(img_io, 'JPEG')
    img_io.seek(0)

    with cond:
        # 设置 pause_video 为 False,使视频流恢复
        pause_video = False
        # 唤醒等待的线程
        cond.notify_all()

    # 使用 send_file 函数返回图像
    return send_file(img_io, mimetype='image/jpeg')

if __name__ == '__main__':
    app.run(debug=True)

/Users/song/Code/flask_video_stream/main.py

from flask import Flask
import cv2

app = Flask(__name__)

@app.route('/capture')
def capture():
    cap = cv2.VideoCapture(0) #打开相机

    if not cap.isOpened():
        return "ERROR!!Unable to open camera"

    ret, img = cap.read() #捕获图像

    cv2.imwrite("photo.jpg", img) #保存图像

    cap.release() #释放相机捕获对象

    return "Capture success!"

if __name__ == '__main__':
    app.run()

/Users/song/Code/flask_video_stream/main4.py

from flask import Flask, Response, send_file
import cv2
from PIL import Image
import io

app = Flask(__name__)

# 定义一个全局变量,用于控制视频流的返回内容
show_local_image = False

def generate_frames():
    global show_local_image

    # cap = cv2.VideoCapture(0) #打开第一个摄像头

    # if not cap.isOpened():
    #     print("ERROR!!Unable to open camera 1")
    #     exit()

    while True:
        if show_local_image:
            # 读取本地图片
            img = cv2.imread('photo.jpg')
        else:
            # 从第一个摄像头捕获图像
            img = cv2.imread('photo2.jpg')
            # ret, img = cap.read()

        # 将 OpenCV 图像转换为 JPEG 图像
        ret, jpeg = cv2.imencode('.jpg', img)

        # 返回 JPEG 图像数据
        yield (b'--frame\r\n'
               b'Content-Type: image/jpeg\r\n\r\n' + jpeg.tobytes() + b'\r\n\r\n')

@app.route('/video_feed')
def video_feed():
    return Response(generate_frames(),
                    mimetype='multipart/x-mixed-replace; boundary=frame')

@app.route('/capture')
def capture():
    global show_local_image

    # 设置 show_local_image 为 True,使视频流返回本地图片
    show_local_image = True

    cap = cv2.VideoCapture(0) #打开第二个摄像头

    if not cap.isOpened():
        return "ERROR!!Unable to open camera 2"

    ret, img = cap.read() #从第二个摄像头捕获图像

    cap.release() #释放第二个相机捕获对象

    # 将 OpenCV 图像转换为 PIL 图像
    img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
    pil_img = Image.fromarray(img)

    # 将 PIL 图像保存到内存中
    img_io = io.BytesIO()
    pil_img.save(img_io, 'JPEG')
    img_io.seek(0)

    # 设置 show_local_image 为 False,使视频流恢复原来的效果
    show_local_image = False

    # 使用 send_file 函数返回图像
    return send_file(img_io, mimetype='image/jpeg')

if __name__ == '__main__':
    app.run()

标签:__,stream,img,flask,cap,cv2,video,io
From: https://www.cnblogs.com/zhuoss/p/17375723.html

相关文章

  • Java8 Stream流的合并
    最近的需求里有这样一个场景,要校验一个集合中每个对象的多个Id的有效性。比如一个Customer对象,有3个Id:id1,id2,id3,要把这些Id全部取出来,然后去数据库里查询它是否存在。@Data@AllArgsConstructorpublicclassCustomer{privateStringname;privateStringid1;p......
  • flask_简单服务器搭建----根据不同的路由实现不同的功能
     当函数中出现很多的条件分支==,可使用字典封装 ......
  • gstreamer使用rtsp服务器
    目录将videotestsrc推送为rtsp链接教程网址https://gist.github.com/hum4n0id/2760d987a5a4b68c24256edd9db6b42b#stream-web-camjetson-nano将videotestsrc推送为rtsp链接先安装开发环境#installgst-rtsp-serverlibssudoapt-getinstalllibgstrtspserver-1.0libgstr......
  • 一Python flask框架
    一:Pythonflask框架前言1.Python面向对象的高级编程语言,以其语法简单、免费开源、免编译扩展性高,同时也可以嵌入到C/C++程序和丰富的第三方库,Python运用到大数据分析、人工智能、web后端等应用场景上。2.Python目前主要流行的web框架:flask、Django、Tornado补充一下,我们......
  • flask--app.add_url_rule()函数 和 类视图详解
    flask--app.add_url_rule()函数和类视图详解app.add_url_rule()函数在flask中,我们知道给一个函数添加url的时候,只需要使用装饰器@app.route('')装饰对应的函数就可以了。为什么这个装饰器就可以给函数视图添加url规则呢?查看app.route()源码发现,这个装饰器在里面调用的另外一......
  • Flask - 基础知识入门解析
    Flask-基础知识入门解析框架比较Djangoweb框架:优点-组件非常全,教科书框架,adminmodel-ORMsession缺点-资源浪费,因为组件多,大,还是互相关联的,随便卸载组件,可能会造成项目的崩溃Flaskweb框架:优点-扩展性强,精简,简单,第三方组件丰富sessionFlask-SessionFlask-Adm......
  • flask blueprint
    定义fromflaskimportBlueprintfrom.importdataApidefregister_url():bp=Blueprint('layers',__name__,url_prefix='/<regex("[0-9a-zA-Z-]+"):system>/<SN>/<source>/<project_id>')bp.add_u......
  • flask 服务器简单搭建
    一个简单的服务器过程大概分为4步1、搭建服务2、监听动作,while,0.1s监听3、处理程序4、返回数据到套接字,生成一个响应对象 搭建简单的服务器  前端访问 ......
  • C# 细数AForge.Video.FFMPEG使用过程中踩的坑及解决方案
    细数AForge.Video.FFMPEG使用过程中踩的坑及解决方案在后台代码中只要有引用到AForge.Video.FFMPEG都不用等到具体调用,只要运行直接就报错解决方案:发生这个问题的原因比较简单,因为AForge.Video.FFMPEG使用VC++写的,编译的时候已经被编译成本地代码,而C#一般目标平台都是“AnyCP......
  • 2023-05-04:用go语言重写ffmpeg的scaling_video.c示例,用于实现视频缩放(Scaling)功能。
    2023-05-04:用go语言重写ffmpeg的scaling_video.c示例,用于实现视频缩放(Scaling)功能。答案2023-05-04:这段代码实现了使用libswscale库进行视频缩放的功能。下面是程序的主要流程:1.获取命令行参数,包括输出文件名和目标图像大小。2.解析目标图像大小,生成指定大小的输出文件。3.创建缩......