通过 Python、Flask 和 OPENCv 打开网络摄像头的 HTML 按钮

问题描述

我从事一个项目已经有一段时间了。场景,我想从后端启动我的网络摄像头服务,以便我可以执行一些 AI 任务,例如物体识别和人脸识别。我在后端使用 Flask,但使用附加到我的索引页面的切换按钮来启动该过程遇到了严峻的挑战。

当我使用无限while循环在没有任何按钮命令的情况下运行该过程时,相机可以顺利启动,但我只想在有带有启动命令的按钮命令时才启动相机。

在我的代码下方找到:

Index.html


<form action="javascript:0" id="show-cam" class="col s12">
     <label class="form-switch">
           <span id="webcam-caption">Click to Start Camera</span>
           <input type="checkBox" name="checkBox" id="webcam-switch">          
      </label>  
      <div id="attend-image" class="row">
          <div class="container">
              <div class="row">
                 <div>
                   <h3>Live Streaming</h3>
                   <img src="{{ url_for('video_Feed') }}" >
                 </div>
              </div>
          </div>                        
      </div>          
   </form>

我的Javascript文件如下:

app.js

$('input[name=checkBox]').change(function () {
      if($(this).is(':checked')){
        console.log("CheckBox is checked..") 
        let command = 'start';

        $.ajax({
          url: '/camera_cmd',type: 'POST',dataType: 'json',data: JSON.stringify({
            'command': command,}),contentType: 'application/json,charset=UTF-8',success: function(data) {
            // location.reload();
            console.log(command);
          },error: function(err){
            console.log(err);
          }
        });
      }
      else {        
        $('#attend-image').removeClass('hide'); 
        console.log("CheckBox is not checked..");
        let command = 'stop';

        $.ajax({
          url: '/camera_cmd',error: function(err){
            console.log(err);
          }
        });
      }        
   });

从 Javascript 中,您会注意到我使用 Ajax 将命令发送到服务器。 在服务器上,有一个处理请求的路由,并调用函数来完成如下工作:

app.py

import JSON
import os
import cv2
import threading
from camera import VideoCamera

command = False

video_stream = VideoCamera()

app = Flask(__name__)

@app.route('/camera_cmd',methods=['POST'])
def camera_cmd():
    global command
    
    req = request.get_json()
    
    take_it  = req['command']
     
    state = print(take_it)
    if take_it:
        if take_it == 'start':
            command = True   
            print('command is True')              
        elif take_it == 'stop':
            command = False 
            print('command is False')     
               
    flash("Camera had a smooth operation!","flash_success") 
        
    t1 = threading.Thread(target=thread_delay,args=('t1',5))
    t1.start()
    t1.join()   
        
    return json.dumps(state)

def gen(camera):
    global command
    print('Arrived camera Loop')

    while command: 
        print('In the Loop Now!')
        frame = camera.get_frame()
        yield (b'--frame\r\n'
               b'Content-Type: image/jpeg\r\n\r\n' + frame + b'\r\n\r\n')
    
    video_stream.release()


def thread_delay(thread_name,delay):
    global command
    while command:
        time.sleep(delay)
        print(thread_name,'---------->',time.time())
        t2 = threading.Thread(target=gen,args=(video_stream,))
        t2.start()
        t2.join()

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

我收到了从前端发送的命令,打印得很好,它成功地将我的命令全局变量更新为相应的 True 或 False 以运行 while 循环。 请注意,我在线程中将相机控制函数定义为 gen(camera)thread_delay(thread_name,delay) 函数,但 gen(camera) 拒绝调用,以便它可以启动我的相机。

我确信有更好的方法来实现这一目标,但不知道如何实现,有人可以帮我吗? 我想要实现的是,当我点击拨动开关时,我想启动我的网络摄像头处理一些人工智能功能,当我完成后,我返回拨动开关,相机应该关闭

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)