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

Python+Flask+OpenCV人脸计数项目跨函数访问变量问题求解

问题原因分析
  • 进程内存隔离:multiprocessing.Process 创建的子进程与Flask主进程拥有独立的内存地址空间,主进程中修改的全局变量No_of_face无法同步到子进程,因此FacesCount读取的始终是子进程初始化时的初始值0。
  • 全局变量声明缺失:gen_frames 函数内对No_of_face赋值时没有声明global,此时修改的是gen_frames的局部变量,根本不会更新全局作用域的No_of_face。
可行实现方案

这里选用多线程替代多进程的方案,线程共享进程内存空间,改造成本最低,完全满足你的两个需求:既能正确读取人脸计数,定时写入也不会阻塞视频流生成逻辑。

修改后完整代码

from flask import Flask, render_template, Response
from datetime import datetime
import cv2
import time
# 替换Process为Thread
from threading import Thread

app=Flask(__name__)
camera=cv2.VideoCapture(0)
Classifier=cv2.CascadeClassifier('Vhicle_37.xml')
No_of_face=0

# 存储数据到csv
def FacesCount():
    global No_of_face
    while True:
        with open('data.csv','a') as f:
            Count = str(No_of_face)
            now =  datetime.now()
            dtString = now.strftime('%H:%M:%S')
            f.writelines(f'{Count},{dtString}\n')
        # 写入间隔1秒,调整这里改写入频率
        time.sleep(1)

# 生成视频流
def gen_frames():
    global No_of_face
    while True:
        success, frame = camera.read()
        if not success:
            break
        else:
            img=cv2.resize(frame,(0,0),None,0.40,0.40)
            gray=cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
            Faces = Classifier.detectMultiScale(gray, scaleFactor=1.1, minNeighbors=2)
            for (x,y,w,h) in Faces:
                cv2.rectangle(img, (x,y), (x+w,y+h), (0,255,0), thickness=2)
            # 更新全局人脸计数
            No_of_face=len(Faces)
            cv2.putText(img,f'Faces:{str(No_of_face)}',(10,100),cv2.FONT_HERSHEY_SIMPLEX,0.5,(255,0,0),2)
            ret, buffer = cv2.imencode('.jpg', img)
            img = buffer.tobytes()
            yield (b'--frame\r\n'
                   b'Content-Type: image/jpeg\r\n\r\n' + img + b'\r\n')

@app.route('/')
def index():
    return render_template('index.html')

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

if __name__=='__main__':
    # 启动定时写入的子线程,daemon=True保证主线程退出时子线程同步销毁
    f=Thread(target=FacesCount, daemon=True)
    f.start()
    app.run(debug=False)

修改点说明

  • 把多进程Process替换为多线程Thread,解决内存隔离问题。
  • 在gen_frames和FacesCount函数内都加上global No_of_face声明,确保修改和读取的都是全局作用域的计数变量。
  • 把循环逻辑移到FacesCount内部,减少不必要的函数调用开销。
注意事项

如果开启Flask的debug模式,框架会自动启动重载进程,导致计数线程重复启动,建议运行时关闭debug模式,生产环境可使用uWSGI、Gunicorn等WSGI服务器部署。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 23:42:00