【OpenCV学习笔记01】- 初步使用OpenCV实现人脸识别

想要使用opencv实现人脸识别,我们需要做这样几步:

1.opencv-python的安装

这里我们使用的python的opencv-python库,在安装opencv-python库之前,我们需要安装numpy, matplotlib。

# 安装指令
# 安装 numpy
pip install numpy
# 安装 matplotlib
pip install matplotlib
# 安装 opencv
pip install opencv

2.opencv的简单使用

Opencv能完成以下从加载图像到调整大小等基本操作:

  • 使用OpenCV加载图片
  • 查看图片形状/分辨率
  • 显示图片
  • 调整图像大小

2.1 使用OpenCV加载图片

# 引用 opencv
import cv2
# 加载图片,使用一个参数加载图片,这里注意了图片路径必须为英文
img = cv2.imread("图片路径")

加载图片还有第二个参数

# 引用 opencv
import cv2 
# 加载彩色图片
img = cv2.imread("图片路径", 1)
# 引用 opencv
import cv2 
# 加载黑白图片
img = cv2.imread("图片路径", 0)

2.2 查看图片形状/分辨率

# 引用 opencv
import cv2
# 加载图片,使用一个参数加载图片
img = cv2.imread("图片路径")
print(img.shape)

2.3 显示图片

# 引用 opencv
import cv2
# 加载图片,使用一个参数加载图片
img = cv2.imread("图片路径")
# imshow的第一个参数是展示出来图片的标题,第二个参数就是我们加载的图片
cv2.imshow("image", img)
# waitKey使窗口保持静态直到用户按下一个键,传入的参数单位是毫秒
# 当设置的值为0的时候,则代表一直等待
cv2.waitKey(0)
# destroyAllWindows 函数:销毁所有展示的窗口
cv2.destroyAllWindows()

2.4 调整图像大小

import cv2
# 加载图片,使用一个参数加载图片
img = cv2.imread("图片路径")
# 只调整图片尺寸,图片会压缩
resized_image = cv2.resize(img, (650, 500))
cv2.imshow("resized_image: ", resized_image)
cv2.waitKey(0)
cv2.destroyAllWindows()

3.人脸识别特征文件准备

github网站下载开源人脸特征数据 opencv-github地址
我们使用的是基于 Haar 特征的 cascade 分类器做人脸识别;

3.1 找到图片中的人脸数据

我们先通过人脸特征数据检测出图片中的人脸数据
我使用的图片是:

网上找到

# 引用 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]]

3.2 在原图画出检测出的人脸

在图片中把检测出来的人脸画出来

# 引用 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()

输出的结果如下:

3.3 在原图画出检测出的人脸,精度识别

这里我们会发现上面输出的结果有很多干扰项,我们可以通过设置精度进行调优,不过这中间没办法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()

通过调整精度之后,虽然命中的都是人脸,但是有部分人脸没有识别到。

好吧,我暂时能做到的只有这种程度,如果再精确的命中人脸,我还需要努力。

你可能感兴趣的:(Python,OpenCV,opencv,学习,python,计算机视觉,机器学习)