手把手教你opencv做人脸识别(附源码+文档)

手把手教你opencv做人脸识别(附源码+文档)文章目录一、环境二、使用Haar级联进行人脸检测三、Haar级联结合摄像头四、使用SSD的人脸检测五、SSD结合摄像头人脸检测六、结语一、环境pipinstallopencv-pythonpython3.9pycharm2020人狠话不多,直接上代码,注释在代码里面,不说废话。二、使用Haar级联进行人脸检测测试案例:代码:(记得自己到下载地址下载对应的xml)#coding=gbk”””作者:川川@时间:2021/9/516:38https://github.

大家好,又见面了,我是你们的朋友全栈君。

一、环境

pip install opencv-python

python3.9
pycharm2020
人狠话不多,直接上代码,注释在代码里面,不说废话。

二、使用Haar级联进行人脸检测

测试案例:
在这里插入图片描述

代码:(记得自己到下载地址下载对应的xml)

# coding=gbk
"""
作者:川川
@时间  : 2021/9/5 16:38
https://github.com/opencv/opencv/tree/master/data/haarcascades
"""
import cv2

# 待检测的图片路径
imagepath="2.jpg"

image = cv2.imread(imagepath)#读取图片
gray = cv2.cvtColor(image,cv2.COLOR_BGR2GRAY)#图像转换为灰度图:

face_cascade = cv2.CascadeClassifier(r'./haarcascade_frontalface_default.xml')#加载使用人脸识别器

faces = face_cascade.detectMultiScale(gray)#检测图像中的所有面孔

#为每个人脸绘制一个蓝色矩形
for x, y, width, height in faces:
	# 这里的color是 蓝 黄 红,与rgb相反,thickness设置宽度
    cv2.rectangle(image, (x, y), (x + width, y + height), color=(255, 0, 0), thickness=2)

# 最后,让我们保存新图像
cv2.imwrite("beauty_detected.jpg", image)

效果:
在这里插入图片描述
效果可以看出这个效果并不是很好。

三、Haar级联结合摄像头

代码:(还是用的前面得xml)

# coding=gbk
"""
摄像头人脸识别
作者:川川
@时间  : 2021/9/5 17:15
Haar级联结合摄像头
"""
import cv2

#创建新的cam对象
cap = cv2.VideoCapture(0,cv2.CAP_DSHOW)
#初始化人脸识别器(默认的人脸haar级联)
face_cascade = cv2.CascadeClassifier(r'./haarcascade_frontalface_default.xml')

while True:
    # 从摄像头读取图像
    _, image = cap.read()
    # 转换为灰度
    image_gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
    # 检测图像中的所有人脸
    faces = face_cascade.detectMultiScale(image_gray, 1.3, 5)
    # 为每个人脸绘制一个蓝色矩形
    for x, y, width, height in faces:
        cv2.rectangle(image, (x, y), (x + width, y + height), color=(255, 0, 0), thickness=2)
    cv2.imshow("image", image)
    if cv2.waitKey(1) == ord("q"):
        break

cap.release()
cv2.destroyAllWindows()

效果:
在这里插入图片描述

四、使用SSD的人脸检测

代码:

# coding=gbk
"""
图片人脸识别
作者:川川
@时间  : 2021/9/5 17:22
"""
import cv2
import numpy as np
# 下载链接:https://raw.githubusercontent.com/opencv/opencv/master/samples/dnn/face_detector/deploy.prototxt
prototxt_path = r"./deploy.prototxt.txt"
# 下载链接:https://raw.githubusercontent.com/opencv/opencv_3rdparty/dnn_samples_face_detector_20180205_fp16/res10_300x300_ssd_iter_140000_fp16.caffemodel
model_path =r"./res10_300x300_ssd_iter_140000_fp16.caffemodel"
model = cv2.dnn.readNetFromCaffe(prototxt_path, model_path)
image = cv2.imread("2.jpg")
h, w = image.shape[:2]
blob = cv2.dnn.blobFromImage(image, 1.0, (300, 300),(104.0, 177.0, 123.0))
model.setInput(blob)
output = np.squeeze(model.forward())
font_scale = 1.0
for i in range(0, output.shape[0]):
    confidence = output[i, 2]
    if confidence > 0.5:
        box = output[i, 3:7] * np.array([w, h, w, h])
        start_x, start_y, end_x, end_y = box.astype(np.int)
        cv2.rectangle(image, (start_x, start_y), (end_x, end_y), color=(255, 0, 0), thickness=2)
        cv2.putText(image, f"{confidence*100:.2f}%", (start_x, start_y-5), cv2.FONT_HERSHEY_SIMPLEX, font_scale, (255, 0, 0), 2)
cv2.imshow("image", image)
cv2.waitKey(0)
cv2.imwrite("beauty_detected.jpg", image)

效果:
在这里插入图片描述
我们可以看到现在的识别效果非常好了。

五、 SSD结合摄像头人脸检测

代码:

# coding=gbk
"""
作者:川川
@时间  : 2021/9/5 17:26
SSD结合摄像头的人脸检测
"""
import cv2
import numpy as np
prototxt_path = "deploy.prototxt.txt"
model_path = "res10_300x300_ssd_iter_140000_fp16.caffemodel"
model = cv2.dnn.readNetFromCaffe(prototxt_path, model_path)
cap = cv2.VideoCapture(0)
while True:
    _, image = cap.read()
    h, w = image.shape[:2]
    blob = cv2.dnn.blobFromImage(image, 1.0, (300, 300), (104.0, 177.0, 123.0))
    model.setInput(blob)
    output = np.squeeze(model.forward())
    font_scale = 1.0
    for i in range(0, output.shape[0]):
        confidence = output[i, 2]
        if confidence > 0.5:
            box = output[i, 3:7] * np.array([w, h, w, h])
            start_x, start_y, end_x, end_y = box.astype(np.int)
            cv2.rectangle(image, (start_x, start_y), (end_x, end_y), color=(255, 0, 0), thickness=2)
            cv2.putText(image, f"{confidence*100:.2f}%", (start_x, start_y-5), cv2.FONT_HERSHEY_SIMPLEX, font_scale, (255, 0, 0), 2)
    cv2.imshow("image", image)
    if cv2.waitKey(1) == ord("q"):
        break
cv2.destroyAllWindows()
cap.release()

效果:
在这里插入图片描述
可以发现SSD效果特别好!

六、结语

如果你想更深了解这些原理,去读一下opencv文档吧,中文官方文档如下:

https://woshicver.com/

在很多人调用xm会遇到一些坑,我在这里说一下,读取xml的时候用相对路径./这种,参考我的,建议不要路径中出现中文,其它没啥了。如果对你有帮助,三连支持一下,谢谢。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/133694.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(2)


相关推荐

  • HTML详细笔记

    HTML详细笔记

  • notifyone和notifyall区别_notify被动形式

    notifyone和notifyall区别_notify被动形式Notify与notifyall的区别notifyAll使所有原来在该对象上等待被notify的线程统统退出wait的状态,变成等待该对象上的锁,一旦该对象被解锁,他们就会去竞争。 notify则文明得多他只是选择一个wait状态线程进行通知,并使它获得该对象上的锁,但不惊动其他同样在等待被该对象notify的线程们,当第一个线程运行完毕以后释放对象上的锁此时如果该对象没有再次使用notify语句…

  • yui3:widget

    yui3:widgetWidget类包含什么?widget类的结构和职能widget类基本的属性渲染方法渐进增强标签结构class名和CSS默认UI事件类的结构和职责  Widget类的结构和职责 Widget类是一个用于创建widgets的基础类。Widget类可以实例化,但是一般都是用它作为基础类,扩展创建widgets,这些通过扩展创…

  • getproperty方法_setter什么意思

    getproperty方法_setter什么意思PropertyDescriptor获取属性的getter/setter方法

  • R语言做文本挖掘 Part4文本分类

    R语言做文本挖掘 Part4文本分类

  • J2EE是什么意思_main()函数是java程序的执行入口

    J2EE是什么意思_main()函数是java程序的执行入口j2ee   J2EE简介  J2EEJava2平台企业版(Java2Platform,EnterpriseEdition)   J2EE是一套全然不同于传统应用开发的技术架构,包含许多组件,主要可简化且规范应用系统的开发与部署,进而提高可移植性、安全与再用价值。   J2EE核心是一组技术规范与指南,其中所包含的各类组件、服务架构及技术层次,均有共通的标准及规格,让各种依

    2022年10月11日

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号