如何在Flask和YOLOv5开发的HTML网页上解决摄像头无法显示检测框的问题?

如何在flask和yolov5开发的html网页上成功打开摄像头并显示检测框?

在使用flask框架和yolov5开发html网页时,打开摄像头并进行实时检测是常见的需求。然而,有时会遇到无法成功显示检测框的问题。下面我们将逐步分析问题并提供解决方案。

首先来看一下前端代码:

    
输入数据:
输出结果:
@@##@@
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); }); }

接着是后端代码:

# 视频推流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"

用户反馈说在打开摄像头时无法显示检测框,并希望能够正确识别图像的置信度。

问题的关键在于以下几点:

立即学习“前端免费学习笔记(深入)”;

摄像头路径问题
在 cv2.videocapture(path) 中,path 参数需要正确设置。可以是以下几种情况:

本地笔记本摄像头:填写数字 0ip摄像头的rtsp地址本地绝对路径文件(如 mp4, jpeg 等)

但是在你的代码中,gen(f’upload/{f}’) 通过接口传递的 f 是什么?这需要明确。

报错信息
没有提供具体的报错信息,这使得问题诊断更加困难。如果有报错信息,建议提供出来,以便进一步分析。接口调用问题
你提到的 /video_feed 接口在前端代码中并没有被调用。需要确保前端正确调用这个接口以显示检测结果。

为了解决这个问题,我们可以采取以下步骤:

检查摄像头路径:确保 cv2.videocapture(path) 中的 path 参数设置正确。如果是本地摄像头,尝试使用 0。如果是文件路径,确保使用绝对路径或完整路径。前端调用后端接口:在前端的 start() 函数中,应该调用 /video_feed 接口来获取检测结果并显示在 img 标签中。例如,可以在 setinterval 函数内添加对 /video_feed 的调用,并更新 img 标签的 src 属性。查看报错信息:如果有任何报错信息,仔细查看并分析错误原因,可能是权限问题、路径错误或其他配置问题。

通过上述步骤,应该能够解决在打开摄像头时无法显示检测框的问题,并正确识别图像的置信度。

如何在Flask和YOLOv5开发的HTML网页上解决摄像头无法显示检测框的问题?

以上就是如何在Flask和YOLOv5开发的HTML网页上解决摄像头无法显示检测框的问题?的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1360118.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2025年12月13日 23:21:31
下一篇 2025年12月13日 23:21:37

相关推荐

发表回复

登录后才能评论
关注微信