想要使用opencv实现人脸识别,我们需要做这样几步:
这里我们使用的python的opencv-python库,在安装opencv-python库之前,我们需要安装numpy, matplotlib。
# 安装指令
# 安装 numpy
pip install numpy
# 安装 matplotlib
pip install matplotlib
# 安装 opencv
pip install opencv
Opencv能完成以下从加载图像到调整大小等基本操作:
# 引用 opencv
import cv2
# 加载图片,使用一个参数加载图片,这里注意了图片路径必须为英文
img = cv2.imread("图片路径")
加载图片还有第二个参数
# 引用 opencv
import cv2
# 加载彩色图片
img = cv2.imread("图片路径", 1)
# 引用 opencv
import cv2
# 加载黑白图片
img = cv2.imread("图片路径", 0)
# 引用 opencv
import cv2
# 加载图片,使用一个参数加载图片
img = cv2.imread("图片路径")
print(img.shape)
# 引用 opencv
import cv2
# 加载图片,使用一个参数加载图片
img = cv2.imread("图片路径")
# imshow的第一个参数是展示出来图片的标题,第二个参数就是我们加载的图片
cv2.imshow("image", img)
# waitKey使窗口保持静态直到用户按下一个键,传入的参数单位是毫秒
# 当设置的值为0的时候,则代表一直等待
cv2.waitKey(0)
# destroyAllWindows 函数:销毁所有展示的窗口
cv2.destroyAllWindows()
import cv2
# 加载图片,使用一个参数加载图片
img = cv2.imread("图片路径")
# 只调整图片尺寸,图片会压缩
resized_image = cv2.resize(img, (650, 500))
cv2.imshow("resized_image: ", resized_image)
cv2.waitKey(0)
cv2.destroyAllWindows()
github网站下载开源人脸特征数据 opencv-github地址
我们使用的是基于 Haar 特征的 cascade 分类器做人脸识别;
我们先通过人脸特征数据检测出图片中的人脸数据
我使用的图片是:
网上找到
# 引用 opencv
import cv2
# 加载图片,使用一个参数加载图片
img = cv2.imread("./img_3.png")
# 加载人脸特征数据文件
# CascadeClassifier是opencv下objdetect模块中用来做目标检测的级联分类器的一个类。传入人脸特征数据,返回识别出的人脸对象。
face_cascade = cv2.CascadeClassifier("./haarcascade_frontalface_default.xml")
# 使用detectMultiScale()接收返回检测出的人脸对象
faces = face_cascade.detectMultiScale(img)
# 打印检测出的人脸数据
print(faces)
cv2.imshow("image", img)
cv2.waitKey(0)
cv2.destroyAllWindows()
打印出的数据
[[292 79 41 41]
[438 81 41 41]
[609 103 36 36]
[749 96 38 38]
[232 204 42 42]
[392 72 58 58]
[465 190 50 50]
[404 298 49 49]
[ 84 291 41 41]
[757 308 41 41]
[315 168 39 39]
[568 302 41 41]
[103 176 43 43]
[370 377 53 53]
[684 395 50 50]
[234 373 49 49]
[105 425 54 54]
[537 383 51 51]
[537 412 57 57]
[264 474 49 49]
[464 449 51 51]
[662 468 46 46]
[ 13 442 60 60]
[603 585 36 36]
[356 762 50 50]]
在图片中把检测出来的人脸画出来
# 引用 opencv
import cv2
# 加载图片,使用一个参数加载图片
img = cv2.imread("./img_3.png")
# 加载人脸特征数据文件
# CascadeClassifier是opencv下objdetect模块中用来做目标检测的级联分类器的一个类。传入人脸特征数据,返回识别出的人脸对象。
face_cascade = cv2.CascadeClassifier("./haarcascade_frontalface_default.xml")
# 使用detectMultiScale()接收返回检测出的人脸对象
faces = face_cascade.detectMultiScale(img)
# print(faces)
# 通过 rectangle 画出检测出的人脸
for x, y, w, h in faces:
cv2.rectangle(img, pt1=(x, y), pt2=(x + w, y + h), color=(0, 255, 0))
cv2.imshow("image", img)
cv2.waitKey(0)
cv2.destroyAllWindows()
输出的结果如下:
这里我们会发现上面输出的结果有很多干扰项,我们可以通过设置精度进行调优,不过这中间没办法100%的命中每个人脸。
# 引用 opencv
import cv2
# 加载图片,使用一个参数加载图片
img = cv2.imread("./images/learn1/data/img_3.png")
# 加载人脸特征数据文件
# CascadeClassifier是opencv下objdetect模块中用来做目标检测的级联分类器的一个类。传入人脸特征数据,返回识别出的人脸对象。
face_cascade = cv2.CascadeClassifier("./haarcascades/haarcascade_frontalface_default.xml")
# 使用detectMultiScale()接收返回检测出的人脸对象
# 简单识别人脸
# faces = face_cascade.detectMultiScale(img)
# 提升精度识别人脸
# scaleFactor表示在前后两次相继的扫描中,搜索窗口的比例系数。默认为1.1即每次搜索窗口依次扩大10%,此处调整为1.3。
# minNeighbors表示构成检测目标的相邻矩形的最小个数(默认为3个)。该参数指定每一个候选矩形边界框需要有多少相邻的检测点,此处调整为5。
faces = face_cascade.detectMultiScale(img, scaleFactor=1.3, minNeighbors=5)
# print(faces)
# 通过 rectangle 画出检测出的人脸
for x, y, w, h in faces:
cv2.rectangle(img, pt1=(x, y), pt2=(x + w, y + h), color=(0, 255, 0))
cv2.imshow("image", img)
cv2.waitKey(0)
cv2.destroyAllWindows()
通过调整精度之后,虽然命中的都是人脸,但是有部分人脸没有识别到。
好吧,我暂时能做到的只有这种程度,如果再精确的命中人脸,我还需要努力。