当前位置: 首页 > 知识库问答 >
问题:

python - 用flask框架和yolov5开发html网页,打开摄像头检测框失败,该如何解决?

简烨烁
2023-12-15

这里是前端的相关内容

<body>    <div class="row" style="padding:3%;">        <div class="col-lg-6">            <h5>输入数据:</h5>            <div>                <video id="video" autoplay></video>            </div>        </div>        <div class="col-lg-6">            <h5>输出结果:</h5>            <div class="custom-file-container__image-preview">                <img id="res" src="#" >            </div>        </div>    </div>    <input type="button" onclick="start()" value="开始识别">    <input type="button" onclick="stop()" value="暂停识别">    <script>    function start() {         navigator.mediaDevices.getUserMedia({ video: true })      .then(function (stream) {        var video = document.querySelector('video');        video.srcObject = stream;        var canvas = document.createElement('canvas');        var ctx = canvas.getContext('2d');        setInterval(function () {        var videoWidth = video.videoWidth;          var videoHeight = video.videoHeight;          canvas.width = videoWidth;          canvas.height = videoHeight;          ctx.drawImage(video, 0, 0, videoWidth, videoHeight);          var imageData = canvas.toDataURL('image/png',1); // 压缩图片          // 发送数据到后端          $.ajax({            type: 'POST',            url: '/image_data',            data: {            id :$("#uid").val(),            image_data: imageData            },            success: function (response) {              console.log(response);            }          });        }, 1000 / 30); // 每秒30帧      })        $("#res").attr("src", "/img_feed?id="+$("#uid").val())      .catch(function (error) {        console.error(error);      });    }</script>
# 视频推流def gen(path):    cap = cv2.VideoCapture(path)    while cap.isOpened():        try:            # 记录开始时间            start_time = time.time()            # 获取画面            success, frame = cap.read()            if success:                im, label, c = d.detect(frame)                ret, jpeg = cv2.imencode('.png', im)                if ret:                    frame = jpeg.tobytes()                    # 计算处理时间                    elapsed_time = time.time() - start_time                    print(f"Frame processing time: {elapsed_time:.3f} seconds")                    yield (b'--frame\r\n'                           b'Content-Type: image/jpeg\r\n\r\n' + frame + b'\r\n\r\n')                else:                    break            else:                break        except Exception as e:            print(e)            continue    cap.release()    cv2.VideoCapture(path)# 视频流结果@app.route('/video_feed')def video_feed():    f = request.args.get("f")    print(f'upload/{f}')    return Response(gen(f'upload/{f}'),                    mimetype='multipart/x-mixed-replace; boundary=frame')这里是后端的内容# 前台推流@app.route('/image_data', methods=["POST"])def image_data():    image_data = request.form.get('image_data')    id = request.form.get('id')    image_data = io.BytesIO(base64.b64decode(image_data.split(',')[1]))    img = Image.open(image_data)    # 对图片进行处理,例如压缩、滤波等    output = io.BytesIO()    img.save(output, format='PNG', quality=85)    output.seek(0)    # 将处理后的图片保存到服务器    img.save(f'upload/temp{id}.png')    with open(f'upload/temp{id}.png', 'wb') as f:        f.write(output.read())    return "ok"

因为不知道怎么写,所以没有尝试,我希望在打开摄像头的时候可以显示检测框,以便我能正确识别到图像的置信度

共有2个答案

顾宸
2023-12-15

cv2.VideoCapture(path) 这里面的path要么是本地笔记本摄像头,填写数字0,要么是IP摄像头的rtsp地址, 要么是一个本地绝对路径文件<mp4, jpeg等等>。你这里通过接口传递过去的那是啥?gen(f'upload/{f}')

还有报错信息是什么?如果是本地文件路径的话,建议改成绝对路径,或者完整路径试试看。

还有你的 /video_feed 接口也没有调用啊。

巫马泰
2023-12-15

从你提供的代码来看,你正在使用 Flask 框架和 YOLOv5 进行图像识别,并通过 HTML 和 JavaScript 实现了一个简单的视频流。然而,你遇到了一个问题,即打开摄像头时无法显示检测框。

这个问题可能由几个原因导致,以下是一些可能的解决方案:

  1. 检查 YOLOv5 的检测框输出:首先,确保 YOLOv5 模型正在为输入的帧生成检测框。你可以尝试在 gen 函数中打印 imlabel,看看是否包含检测到的对象及其边界框。
  2. 检查视频流输出:确保 Flask 服务器正确地发送了视频流。你可以尝试在浏览器中访问 /video_feed 路由,看看是否能够看到摄像头的视频流。
  3. 前端显示问题:在 JavaScript 中,你可以在每个间隔中将 canvas 的内容直接绘制到 video 上,而不是使用 AJAX 发送到后端。这样,你可以在前端直接显示检测结果。修改 AJAX 部分,使其直接在前端进行检测并显示结果:
setInterval(function () {    var videoWidth = video.videoWidth;    var videoHeight = video.videoHeight;    canvas.width = videoWidth;    canvas.height = videoHeight;    ctx.drawImage(video, 0, 0, videoWidth, videoHeight);    var imageData = canvas.toDataURL('image/png',1); // 压缩图片    // 在前端进行检测    var img = new Image();    img.src = 'data:image/png;base64,' + imageData;    document.body.appendChild(img);}, 1000 / 30); // 每秒30帧
  1. 考虑性能问题:如果你的 YOLOv5 模型较大或计算复杂度较高,处理速度可能会较慢,导致检测框无法实时显示。你可以尝试优化模型或降低输入分辨率来提高性能。
  2. 检查浏览器权限:确保浏览器允许访问摄像头和执行 JavaScript 代码。某些浏览器可能会阻止访问摄像头或执行 JavaScript。
  3. 检查网络问题:如果 Flask 服务器和前端不在同一网络中,可能会出现网络延迟或连接问题,导致视频流无法正常显示。确保网络连接稳定并检查防火墙设置。

请尝试上述解决方案,并确保代码的其余部分没有错误或遗漏。如果问题仍然存在,请提供更多关于错误消息或异常的信息,以便进一步帮助你解决问题。

 类似资料:
  • "One does not live by bread alone,but by every word that comes from the mouth of God" --(MATTHEW4:4) python开发框架 不管是python,还是php,亦或别的做web项目的语言,乃至于做其它非web项目的开发,一般都要用到一个称之为什么什么框架的东西。 框架的基本概念 开发这对框架的认识,由于

  • 本文向大家介绍解释测试驱动开发框架。,包括了解释测试驱动开发框架。的使用技巧和注意事项,需要的朋友参考一下 测试驱动开发框架是从开发人员的思想出发实施的方法。在这里,开发人员编写测试用例,涵盖应用程序的每个功能,以验证代码是否正确。 一旦这些测试用例失败,开发人员将重构代码以使这些测试用例通过。该过程一直持续到所有测试用例通过为止。这种类型的方法广泛用于敏捷方法中。在此框架中,在开发产品的实际功能

  • 本文向大家介绍Python flask框架如何显示图像到web页面,包括了Python flask框架如何显示图像到web页面的使用技巧和注意事项,需要的朋友参考一下 代码如下 webfig1.py plot.html 先用py绘制了xy的图像,然后经过几个命令,让其转化为plot_url,在传给plot.html,就可以了 代码在github:https://github.com/qingnvs

  • 本文向大家介绍Python的Flask开发框架简单上手笔记,包括了Python的Flask开发框架简单上手笔记的使用技巧和注意事项,需要的朋友参考一下 最简单的hello world 之后,访问http://localhost:5000 支持post/get提交 多个url指向 不管post/get使用统一的接收 处理json请求 request的header中 处理时: 获取post提交中的ch

  • 本文向大家介绍利用python实现后端写网页(flask框架),包括了利用python实现后端写网页(flask框架)的使用技巧和注意事项,需要的朋友参考一下 如何用python做后端写网页-flask框架 什么是Flask安装flask模块Hello World更深一步:数据绑定后端传入数据从前端获取数据 数据库连接screen创建后台查看删除后台 结束 什么是Flask Flask是一个使用

  • 本文向大家介绍Python flask框架端口失效解决方案,包括了Python flask框架端口失效解决方案的使用技巧和注意事项,需要的朋友参考一下 大家可能有这样的体验,好比在程序里面我明明写了app.run(port=8001),结果程序还是在5000端口输出,我们右键点击py程序,直接运行。 可以看到,端口为5000 这时候我们要做的是点击以下图标 进入页面,填入如下内容,点击ok,再点击