小白也能上手!从摄像头到图片,人脸微笑检测超详细教程
到这里,咱们的“工具”就备齐了,总结一下:✅ 安装好Python✅ 安装好OpenCV库✅ 下载好两个模型文件提示:后续写代码时,要把两个模型文件和代码文件放在同一个文件夹里,不然程序找不到模型,会报错哦!到这里,两个版本的人脸微笑检测就都完成啦!总结一下重点,小白记好:1. 前期准备一定要做足:Python、OpenCV、两个模型文件,缺一不可;2. 代码不用改,直接复制粘贴,只需要注意“模型文
哈喽各位小白同学~ 今天给大家带来一个超有意思的Python小项目——人脸微笑检测!不用复杂的算法基础,不用高深的编程技巧,跟着我一步步来,既能实现摄像头实时检测,也能改成图片识别,全程复制粘贴就能跑通,新手也能轻松拿捏!
先给大家看个效果:打开程序后,要么摄像头实时捕捉你的脸,检测到微笑就自动画框标注“smile”;要么上传一张带人脸的图片,瞬间识别出人脸和微笑区域,成就感直接拉满✨ 话不多说,开始咱们的小白实操之旅!
一、前期准备(必看!少一步都跑不通)
在写代码之前,咱们要先准备好“工具”,就像做饭前要准备好食材一样,步骤很简单,跟着做就行~
1. 安装Python(基础中的基础)
如果你的电脑还没装Python,直接去官网下载:Python官网,记得勾选“Add Python to PATH”(非常重要!不然后续找不到Python),然后下一步、下一步安装就好,全程默认设置就行,小白不用纠结。
2. 安装OpenCV库(核心工具)
OpenCV是咱们用来做图像识别、人脸检测的核心库,相当于一个“万能图像工具包”。安装方法超简单:
1. 打开电脑的“命令提示符”(Windows按Win+R,输入cmd回车;Mac按Command+空格,输入terminal回车);
2. 复制粘贴下面这行代码,按回车,等待1-2分钟,自动安装完成:
pip install opencv-python
如果出现“pip不是内部命令”,大概率是安装Python时没勾选“Add Python to PATH”,重新安装Python并勾选即可。
3. 下载人脸/微笑检测模型(关键文件)
咱们的程序能识别人脸和微笑,靠的是两个提前训练好的模型文件(不用自己训练,直接用现成的!),文件名分别是:
- haarcascade_frontalface_default.xml(人脸检测模型)
- haarcascade_smile.xml(微笑检测模型)
下载方法:直接去OpenCV官方仓库下载,地址放在这里,点击链接找到对应的文件,右键“保存链接为”,下载到电脑里即可:
人脸模型:haarcascade_frontalface_default.xml
4. 准备工作总结
到这里,咱们的“工具”就备齐了,总结一下:
✅ 安装好Python
✅ 安装好OpenCV库
✅ 下载好两个模型文件
提示:后续写代码时,要把两个模型文件和代码文件放在同一个文件夹里,不然程序找不到模型,会报错哦!
二、版本1:摄像头实时人脸微笑检测(原代码,直接用)
这个版本是原代码,功能是打开电脑摄像头,实时捕捉画面,检测到人脸就画绿色框,检测到微笑就画蓝色框,还会标注“smile”,超直观!
1. 写代码步骤
1. 新建一个文本文件,把后缀名改成“.py”(比如“smile_detect_camera.py”);
2. 打开这个.py文件,复制粘贴下面的代码(全程不用改任何地方!);
3. 把之前下载的两个模型文件,放到和这个.py文件同一个文件夹里。
2. 完整代码(直接复制粘贴)
# 人脸微笑检测(摄像头) import cv2 # 加载人脸和微笑检测模型 faceCascade = cv2.CascadeClassifier('haarcascade_frontalface_default.xml') smile = cv2.CascadeClassifier("haarcascade_smile.xml") cap = cv2.VideoCapture(0) # 初始化摄像头(0表示电脑自带摄像头) while True: # 循环处理每一帧画面 ret, image = cap.read() # 读取摄像头的一帧画面 image = cv2.flip(image, flipCode=1) # 水平翻转画面(镜像效果,和镜子里一样) # 如果没读到画面,直接退出 if ret is None: break gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY) # 把彩色画面转成灰度(方便检测) # 人脸检测:在灰度画面中找人脸 faces = faceCascade.detectMultiScale(gray, scaleFactor=1.1, minNeighbors=15, minSize=(5, 5)) # 处理检测到的每个人脸 for (x, y, w, h) in faces: # 给人脸画绿色方框(颜色:0,255,0,线条粗细:2) cv2.rectangle(image, pt1=(x, y), pt2=(x + w, y + h), color=(0, 255, 0), thickness=2) # 提取人脸区域(只在人脸区域内检测微笑,更准确) roi_gray_face = gray[y:y + h, x:x + w] cv2.imshow(winname='人脸区域', mat=roi_gray_face) # 显示提取的人脸区域 # 微笑检测:在人脸区域内找微笑 smiles = smile.detectMultiScale(roi_gray_face, scaleFactor=1.5, minNeighbors=33, minSize=(50, 50)) for (sx, sy, sw, sh) in smiles: # 给微笑画蓝色方框 a = x + sx b = y + sy cv2.rectangle(image, pt1=(a, b), pt2=(a + sw, b + sh), color=(255, 0, 0), thickness=2) # 标注“smile”文字(颜色:黄蓝渐变色,字体大小:1,线条粗细:2) cv2.putText(image,"smile",(x, y), cv2.FONT_HERSHEY_COMPLEX_SMALL, fontScale=1, color=(0, 255, 255), thickness=2) # 显示最终检测结果画面 cv2.imshow("微笑检测(摄像头)", image) key = cv2.waitKey(25) # 等待25毫秒,检测按键 if key == 27: # 按ESC键退出程序 break # 关闭摄像头,释放资源 cap.release() cv2.destroyAllWindows()
3. 运行程序&效果说明
1. 双击咱们写好的.py文件,会自动打开摄像头;
2. 画面中会出现两个窗口:一个是“微笑检测(摄像头)”,显示实时画面,绿色框是人脸,蓝色框是微笑,还有“smile”标注;另一个是“人脸区域”,显示提取的人脸灰度图;
3. 想退出程序,按键盘上的ESC键即可。
提示:如果摄像头打不开,大概率是被其他软件占用(比如微信视频、Zoom),关闭其他占用摄像头的软件,重新运行程序即可。
三、版本2:图片人脸微笑检测(修改后,小白友好)
很多小白可能不想用摄像头,想检测自己手机里的照片,没问题!我已经把原代码修改好了,只改了3处,完全保留原有的检测逻辑,复制粘贴就能用,实现“上传图片→识别微笑”的效果。
1. 核心修改说明(小白不用懂,知道就行)
原代码是“读取摄像头画面”,修改后变成“读取本地图片”,删除了摄像头循环和释放资源的代码,其他的人脸检测、微笑检测、画框标注逻辑完全不变,所以效果和摄像头版本一样,只是从“实时”变成“静态图片”。
2. 完整代码(直接复制粘贴)
# 人脸微笑检测(静态图片) import cv2 # 加载人脸和微笑检测模型(和摄像头版本一样,不用改) faceCascade = cv2.CascadeClassifier('haarcascade_frontalface_default.xml') smile = cv2.CascadeClassifier("haarcascade_smile.xml") # 核心修改:读取本地图片(替换摄像头读取) image = cv2.imread('test.jpg') # 读取图片,test.jpg是图片文件名,可修改 image = cv2.flip(image, flipCode=1) # 水平翻转图片(镜像效果,可选,不想翻可以删除这行) # 下面的代码和摄像头版本完全一样,不用改! gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY) # 彩色转灰度 # 人脸检测 faces = faceCascade.detectMultiScale(gray, scaleFactor=1.1, minNeighbors=15, minSize=(5, 5)) # 处理每个人脸 for (x, y, w, h) in faces: cv2.rectangle(image, pt1=(x, y), pt2=(x + w, y + h), color=(0, 255, 0), thickness=2) roi_gray_face = gray[y:y + h, x:x + w] cv2.imshow(winname='人脸区域', mat=roi_gray_face) # 微笑检测 smiles = smile.detectMultiScale(roi_gray_face, scaleFactor=1.5, minNeighbors=33, minSize=(50, 50)) for (sx, sy, sw, sh) in smiles: a = x + sx b = y + sy cv2.rectangle(image, pt1=(a, b), pt2=(a + sw, b + sh), color=(255, 0, 0), thickness=2) cv2.putText(image,"smile",(x, y), cv2.FONT_HERSHEY_COMPLEX_SMALL, fontScale=1, color=(0, 255, 255), thickness=2) # 显示检测结果 cv2.imshow("微笑检测(图片)", image) cv2.waitKey(0) # 等待任意按键关闭窗口 # 关闭所有窗口 cv2.destroyAllWindows()
3. 运行步骤(小白必看)
1. 新建一个.py文件(比如“smile_detect_image.py”);
2. 复制粘贴上面的代码;
3. 找一张带人脸的图片(手机拍照、网上下载都可以),把图片放到和.py文件、两个模型文件同一个文件夹里;
4. 把代码里的“test.jpg”改成你的图片文件名(比如你的图片叫“face.png”,就改成image = cv2.imread('face.png'));
5. 双击运行.py文件,会弹出两个窗口:“人脸区域”和“微笑检测(图片)”,检测结果一目了然;
6. 按任意键关闭窗口即可。
四、小白常见问题排查(必看!避免踩坑)
很多小白运行程序时会报错,不用慌,下面是最常见的3个问题,对照排查就能解决:
问题1:运行后报错“error: (-215:Assertion failed) !empty() in function 'detectMultiScale'”
原因:程序找不到模型文件(haarcascade_frontalface_default.xml 和 haarcascade_smile.xml)。
解决方法:把两个模型文件,和你的.py代码文件,放到同一个文件夹里,再重新运行。
问题2:图片版本运行后,看不到检测结果,只显示黑色窗口
原因:图片文件名写错了,或者图片和代码不在同一个文件夹。
解决方法:1. 确认图片和.py文件在同一个文件夹;2. 确认代码里的图片文件名和实际图片文件名一致(比如图片叫“123.jpg”,代码里就不能写“123.png”)。
问题3:摄像头版本运行后,摄像头打不开,报错“error: (-215:Assertion failed) cap.isOpened() in function 'cv::VideoCapture::operator>>'”
原因:摄像头被其他软件占用,或者电脑没有自带摄像头。
解决方法:1. 关闭微信、QQ、Zoom等可能占用摄像头的软件;2. 如果是台式机,需要连接外接摄像头,然后重新运行程序。
五、总结(小白必看)
到这里,两个版本的人脸微笑检测就都完成啦!总结一下重点,小白记好:
1. 前期准备一定要做足:Python、OpenCV、两个模型文件,缺一不可;
2. 代码不用改,直接复制粘贴,只需要注意“模型文件和代码同文件夹”“图片文件名正确”;
3. 摄像头版本按ESC退出,图片版本按任意键退出;
4. 遇到报错,对照“常见问题排查”,90%的问题都能解决。
这个小项目虽然简单,但能直观感受到Python图像识别的乐趣,小白们可以试着换不同的图片、不同的表情去测试,慢慢熟悉代码的逻辑~ 如果还有其他问题,评论区留言,我会一一回复哦!
最后,祝各位小白都能顺利跑通程序,解锁Python图像识别的新技能✨
更多推荐
所有评论(0)