视频人脸检测——OpenCV版(三)
视频人脸检测是图片人脸检测的高级版本,图片检测详情点击查看我的上一篇《图片人脸检测——OpenCV版(二)》
往期目录
视频人脸检测——Dlib版(六)
OpenCV添加中文(五)
图片人脸检测——Dlib版(四)
视频人脸检测——OpenCV版(三)
图片人脸检测——OpenCV版(二)
OpenCV环境搭建(一)
更多更新,欢迎访问我的github:https://github.com/vipstone/faceai
实现思路:
调用电脑的摄像头,把摄像的信息逐帧分解成图片,基于图片检测标识出人脸的位置,把处理的图片逐帧绘制给用户,用户看到的效果就是视频的人脸检测。
效果预览:
实现步骤
使用OpenCV调用摄像头并展示
获取摄像头:
1 | cap = cv2.VideoCapture( 0 ) |
参数0表示,获取第一个摄像头。
显示摄像头 逐帧显示,代码如下:
1 2 3 4 5 6 7 | while ( 1 ): ret, img = cap.read() cv2.imshow( "Image" , img) if cv2.waitKey( 1 ) & 0xFF = = ord ( 'q' ): break cap.release() # 释放摄像头 cv2.destroyAllWindows() # 释放窗口资源 |
cv2.waitKey(1) & 0xFF使用了“&”位元算法,含义是获取用户输入的最后一个字符的ASCII码,如果输入的是“q”,则跳出循环。
视频的人脸识别
这个时候,用到了上一节的《图片人脸检测——OpenCV版(二)》 把人脸识别的代码封装成方法,代码如下:
1 2 3 4 5 6 7 8 9 10 11 12 | def discern(img): gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) cap = cv2.CascadeClassifier( "C:\Python36\Lib\site-packages\opencv-master\data\haarcascades\haarcascade_frontalface_default.xml" ) faceRects = cap.detectMultiScale( gray, scaleFactor = 1.2 , minNeighbors = 3 , minSize = ( 50 , 50 )) if len (faceRects): for faceRect in faceRects: x, y, w, h = faceRect cv2.rectangle(img, (x, y), (x + h, y + w), ( 0 , 255 , 0 ), 2 ) # 框出人脸 cv2.imshow( "Image" , img) |
再循环摄像头帧图片的时候,调用图片识别方法即可,代码如下:
1 2 3 4 5 6 7 8 9 10 | # 获取摄像头0表示第一个摄像头 cap = cv2.VideoCapture( 0 ) while ( 1 ): # 逐帧显示 ret, img = cap.read() # cv2.imshow("Image", img) discern(img) if cv2.waitKey( 1 ) & 0xFF = = ord ( 'q' ): break cap.release() # 释放摄像头 cv2.destroyAllWindows() # 释放窗口资源 |
完整的代码如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 | # -*- coding:utf-8 -*- # OpenCV版本的视频检测 import cv2 # 图片识别方法封装 def discern(img): gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) cap = cv2.CascadeClassifier( "C:\Python36\Lib\site-packages\opencv-master\data\haarcascades\haarcascade_frontalface_default.xml" ) faceRects = cap.detectMultiScale( gray, scaleFactor = 1.2 , minNeighbors = 3 , minSize = ( 50 , 50 )) if len (faceRects): for faceRect in faceRects: x, y, w, h = faceRect cv2.rectangle(img, (x, y), (x + h, y + w), ( 0 , 255 , 0 ), 2 ) # 框出人脸 cv2.imshow( "Image" , img) # 获取摄像头0表示第一个摄像头 cap = cv2.VideoCapture( 0 ) while ( 1 ): # 逐帧显示 ret, img = cap.read() # cv2.imshow("Image", img) discern(img) if cv2.waitKey( 1 ) & 0xFF = = ord ( 'q' ): break cap.release() # 释放摄像头 cv2.destroyAllWindows() # 释放窗口资源 |
关注下面二维码,订阅更多精彩内容。

【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· .NET Core 托管堆内存泄露/CPU异常的常见思路
· PostgreSQL 和 SQL Server 在统计信息维护中的关键差异
· C++代码改造为UTF-8编码问题的总结
· DeepSeek 解答了困扰我五年的技术问题
· 为什么说在企业级应用开发中,后端往往是效率杀手?
· 清华大学推出第四讲使用 DeepSeek + DeepResearch 让科研像聊天一样简单!
· 推荐几款开源且免费的 .NET MAUI 组件库
· 实操Deepseek接入个人知识库
· 易语言 —— 开山篇
· Trae初体验