打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
基于flask和opencv做一个实时视频流的人脸检测程序

效果如上图所示

import cv2import numpy as npfrom flask import Flask, render_template, Response
app = Flask(__name__)video_writer = None
class Camera: _instance = None def __new__(cls): if cls._instance is None: cls._instance = super().__new__(cls) cls._instance.camera = cv2.VideoCapture(0) return cls._instance
def __del__(self): self.camera.release()
def get_frame(self): success, frame = self.camera.read() if not success: return None else: ret, buffer = cv2.imencode('.jpg', frame) frame = buffer.tobytes() return frame
camera = Camera()

def convert_bytes_to_frame(frame_bytes): # 将bytes类型的图像数据解码为OpenCV图像格式 frame_array = np.frombuffer(frame_bytes, dtype=np.uint8) frame = cv2.imdecode(frame_array, flags=cv2.IMREAD_COLOR) return frame
# 获取视频流def get_video_stream(): global camera,video_writer while True: if camera is None: break frame = camera.get_frame() if frame is None: break else: frameT=convert_bytes_to_frame(frame) # frameT = cv2.cvtColor(convert_bytes_to_frame(frame), cv2.COLOR_BGR2RGB) # 转换颜色空间 gray = cv2.cvtColor(frameT, cv2.COLOR_RGB2GRAY) # 转换为灰度图像 # 加载人脸检测器 face = cv2.CascadeClassifier('haarcascade_frontalface_default.xml') # 加载眼睛检测器 eye = cv2.CascadeClassifier('haarcascade_eye.xml') faces = face.detectMultiScale(gray) # 执行人脸检测 for x, y, w, h in faces: cv2.rectangle(frameT, (x, y), (x + w, y + h), (255, 0, 0), 2) # 绘制矩形标注人脸 roi_eye = gray[y:y + h, x:x + w] # 根据人脸获得眼睛的检测范围 eyes = eye.detectMultiScale(roi_eye) # 在人脸范围内检测眼睛 for (ex, ey, ew, eh) in eyes: # 标注眼睛 cv2.circle(frameT[y:y + h, x:x + w], (int(ex + ew / 2), int(ey + eh / 2)), int(max(ew, eh) / 2), (0, 255, 0), 2)
if video_writer is not None: video_writer.write(convert_bytes_to_frame(frame))
ret, buffer = cv2.imencode('.jpg', frameT) frame = buffer.tobytes() yield (b'--frame\r\n' b'Content-Type: image/jpeg\r\n\r\n' + frame + b'\r\n')
# 关闭摄像头def close_camera(): global camera camera = None
@app.route('/open_camera', methods=['POST'])def open_camera_route(): global camera camera = Camera() return Response(get_video_stream(), mimetype='multipart/x-mixed-replace; boundary=frame')
@app.route('/close_camera', methods=['POST'])def close_camera_route(): close_camera() return 'Camera closed'
@app.route('/')def index(): return render_template('index3.html')
@app.route('/video_feed')def video_feed(): return Response(get_video_stream(), mimetype='multipart/x-mixed-replace; boundary=frame')
@app.route('/start_recording')def start_recording(): global video_writer video_writer = cv2.VideoWriter('output.avi', cv2.VideoWriter_fourcc(*'XVID'), 20.0, (640, 480)) return 'Recording started'
@app.route('/stop_recording')def stop_recording(): global video_writer video_writer.release() video_writer = None return 'Recording stopped'
if __name__ == '__main__': app.run(debug=True)
这段代码是一个使用Flask和OpenCV实现的视频流和人脸检测应用。它可以打开摄像头、实时显示视频流,并在视频中检测人脸和眼睛。
代码中的Camera类是一个单例模式,用于管理摄像头。它通过cv2.VideoCapture打开摄像头,并提供了get_frame方法来获取摄像头的当前帧。convert_bytes_to_frame函数用于将以字节形式传输的图像数据解码为OpenCV图像格式。
get_video_stream函数是一个生成器函数,用于生成视频流。它不断地从摄像头获取帧,并进行人脸和眼睛检测。检测到的人脸和眼睛会用矩形和圆圈标注在帧上。如果设置了video_writer,则会将帧写入视频文件。
open_camera_route和close_camera_route是两个路由函数,用于打开和关闭摄像头。它们分别在POST请求中被调用,并返回相应的响应。
index函数是根路由的处理函数,返回一个HTML模板。
video_feed函数是另一个路由函数,返回生成的视频流。
start_recording和stop_recording函数分别用于开始和停止录制视频。它们创建和释放video_writer对象,并返回相应的响应。
最后,通过app.run(debug=True)启动Flask应用。
要运行这段代码,需要安装Flask和OpenCV库,并在同一目录下放置名为haarcascade_frontalface_default.xml和haarcascade_eye.xml的级联分类器文件,用于人脸和眼睛检测。

完整代码下载地址:https://download.csdn.net/download/douyu0814/88475010

本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
开发一个完整的眼动追踪应用-Python版
利用flask将opencv读取摄像头的实时视频流输出到浏览器
Flask Web 框架中的 OpenCV 人脸检测部署
基于OpenCV读取摄像头进行人脸检测和人脸识别
Python 手把手实现远程控制桌面
OpenCV学习笔记(十六)
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服