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
相关产品推荐
相关产品推荐

