OpenCV For Python Ep.2 HelloWorld

Python OpenCV Ep.2 初步应用(基于内置模型)

查看上一期

在配置好Python环境下的OpenCV之后,我们可以了解到OpenCV已经内置了不少很完善的计算机视觉算法和例程,而在OpenCV的GitHub上也有很多可用的模型。在本文中,我们将把其中的一些算法与基本例程投入到使用当中,完成一个比较基础的计算机视觉程序——人脸与人脸关键点检测。

1.前置知识

①cvtColor(色彩空间转换)

②Drawing Function(OpenCV绘制函数)

③Cascade Classifier(级联分类器)

④Haar Features & LBF Features(Haar特征与LBF特征)

etc…

这些知识将逐步在之后(也许是很久之后)的其他博客中补充。

2.准备工作

① 读入一个视频、摄像头或是单张的图像自然是我们程序中的第一步。这一部分内容已经在上一期中做了十分详尽的介绍,在本文中就不再重复了。

② 之后,我们需要提前准备好两个在本次的程序中需要用到的模型,分别是:

  • haarcascade_frontalface_alt2
  • lbfmodel

第一个模型可以在OpenCV的Github上找到。

第二个模型可以在Facemark API for OpenCV中找到。

3.程序代码

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
31
32
33
34
35
36
37
38
39
40
41
42
43
import numpy as py
import cv2 as cv

cap = cv.VideoCapture(0)

# load models
cascade = cv.CascadeClassifier("haarcascade_frontalface_alt2.xml")
# use this one if you are cat
# cascade = cv.CascadeClassifier("haarcascade_frontalcatface_extended.xml")
facemark = cv.face.createFacemarkLBF()
facemark.loadModel("lbfmodel.yaml")

if not cap.isOpened():
print("Cannot open camera")
exit()
while True:
# Capture frame-by-frame
ret, frame = cap.read()
# if frame is read correctly ret is True
if not ret:
print("Can't receive frame (stream end?). Exiting ...")
break
# flip the frame
frame = cv.flip(frame,1,dst = None)
gray = cv.cvtColor( frame , cv.COLOR_BGR2GRAY )

# run landmark
faces = cascade.detectMultiScale( gray , minSize = (30,30) )
if len(faces)!=0:
ok , landmarks = facemark.fit( gray , faces )
if ok:
# show result in points
for i in range(len(landmarks[0][0])):
cv.circle( frame , tuple(landmarks[0][0][i]) , 2 , (255,0,0) , -1 )
for j in range(len(faces)):
cv.rectangle( frame , (faces[j][0],faces[j][1]) , (faces[j][0]+faces[j][2],faces[j][1]+faces[j][3]) , (255,255,255) , 3 )
# Interrupt on key
cv.imshow( "Display" , frame )
if cv.waitKey(1) == ord('q'):
break
# When everything done, release the capture
cap.release()
cv.destroyAllWindows()

在本程序中我们使用的是摄像头捕捉来完成实时的人脸识别与关键点标记,因此我们首先建立一个VideoCapture()

之后,就是使用CV2库的CascadeClassifier来载入我们所下载的Haar特征分类器模型。

同样地,我们建立新的LBF Facemark,并使用face.loadModel()来载入LBF特征模型。

在初始化工作完成后,就可以开始逐帧显示摄像头捕获图像,并使用模型对图像进行识别。为了处理图像,我们必须使用cvtColor()将图像的颜色空间从默认的BGR空间转换到GRAY灰度空间。先运行建立好的CascadeClassifier,从返回的数据中分别可以提取出人脸识别矩形的信息。然后,我们在这个矩形的范围内运行建立的Facemark,在人脸框内找出关键点。

为了用圆形绘制函数画出关键点,我们必须用一个tuple变量作为圆心的坐标点,而这一坐标点的信息实际是在返回数据landmarks[0][0][i]内的,因此我们利用循环来遍历landmarks[0][0]

对于人脸框的绘制,CascadeClassifier识别后返回的矩形数据是以左上角坐标(x,y)和宽度高度(w,h)四个数据的形式存储的。而矩形绘制函数要求提供的是左上角和右下角的坐标点位置,只需要做个加法转换一下就行了。

运行之后的效果如下:

layout.jpg

layout2.jpg

模型很成功地识别了田所浩二先辈证明了野兽先辈人类说

layout4.jpg

对于纸片人没有做出反映,说明其准确度还是很可观的。

layout3.jpg

但是!却把露露的头饰误认成为了人脸,毕竟是比较老旧的模型,误识别的情况还是会存在的。

我也尝试过按照关键点的设计手绘人脸,确实也被识别了。

不过作为OpenCV的初步运用,确实只需要比较低的学习成本,上手非常容易。

参考

OpenCV: Object Detection (objdetect module)

OpenCV实战:人脸关键点检测(FaceMark)—— Amusi

  • Copyright: Copyright is owned by the author. For commercial reprints, please contact the author for authorization. For non-commercial reprints, please indicate the source.
  • Copyrights © 2020-2024 Jzjerry Jiang
  • Visitors: | Views:

请我喝杯咖啡吧~