程序运行效果

yunxingjietu1
yunxingjietu2

前置准备

需要安装openCV库(如果用的是python的虚拟环境,numpy可能也要提前手动安装一下)

我这里是用清华的镜像安装的:

pip install -i https://pypi.tuna.tsinghua.edu.cn/simple opencv-python

贴一些国内源,阿里云也挺好。

阿里云:http://mirrors.aliyun.com/pypi/simple/

清华:https://pypi.tuna.tsinghua.edu.cn/simple/

中国科技大学 https://pypi.mirrors.ustc.edu.cn/simple/

华中理工大学:http://pypi.hustunique.com/

源码

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
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
import cv2 as cv
import numpy as np
import tkinter
import tkinter.filedialog
import tkinter.messagebox

root = tkinter.Tk()
root.title("人脸识别程序")
root.geometry("399x100")


def func():
file_path = tkinter.filedialog.askopenfilename(title=u'选择文件', initialdir=r'C:\Program Files')
# 指定图片的人脸识别然后存储
# img = cv.imread("test.jpg")
img = cv.imread(file_path)
face_color = (222,156,83)#莫兰蒂橘色

# 将图像转换为灰度图像
grey = cv.cvtColor(img, cv.COLOR_BGR2GRAY)
# 加载脸部识别的分类器
classfier = cv.CascadeClassifier(
cv.data.haarcascades + "haarcascade_frontalface_alt2.xml")
# classfier = cv.CascadeClassifier(
# cv.data.haarcascades + "haarcascade_profileface.xml")
# 探测图片中的人脸
faceRects = classfier.detectMultiScale(
grey, scaleFactor=1.2, minNeighbors=3, minSize=(32, 32))
if len(faceRects) > 0: # 大于0表示检测到人脸
for faceRect in faceRects: # 针对每个人脸单独框出来
x, y, w, h = faceRect
cv.rectangle(img, (x - 10, y - 10), (x + w + 10,
y + h + 10), face_color, 3) # 3,控制绿色框的粗细

# 写入图像
cv.imwrite('output1.jpg', img)
cv.imshow("Dettect Face", img)
cv.waitKey(0)
cv.destroyAllWindows()
print("识别完成!")#debug用 看看有没有执行完

def funcII():
file_path = tkinter.filedialog.askopenfilename(title=u'选择文件', initialdir=r'C:\Program Files')
# 指定图片的识别然后存储
# img = cv.imread("test.jpg")
img = cv.imread(file_path)
eye_color = (137,190,178)#莫兰蒂蓝色

# 将图像转换为灰度图像
grey = cv.cvtColor(img, cv.COLOR_BGR2GRAY)
# 加载眼部识别的分类器
classfier = cv.CascadeClassifier(
cv.data.haarcascades + "haarcascade_eye.xml")

# 探测图片中的人眼
faceRects = classfier.detectMultiScale(
grey, scaleFactor=1.2, minNeighbors=3, minSize=(32, 32))
if len(faceRects) > 0: # 大于0表示检测到眼睛
for faceRect in faceRects: # 针对每个眼睛单独框出来
x, y, w, h = faceRect
cv.ellipse(img,(int(x+0.5*w),int(y+0.5*h)),(16,9),0,0,360,eye_color,2,3)
# cv.rectangle(img, (x - 10, y - 10), (x + w + 10,
# y + h + 10), eye_color, 3) # 3,控制绿色框的粗细

# 写入图像
cv.imwrite('output1.jpg', img)
cv.imshow("Dettect Face", img)
cv.waitKey(0)
cv.destroyAllWindows()
print("识别完成!")#debug用 看看有没有执行完
#循环主体
click_button = tkinter.Button(root,text="检测人脸",command=func)
click_button.pack()
clickII_button = tkinter.Button(root,text="检测眼睛",command=funcII)
clickII_button.pack()
quit_button = tkinter.Button(root,text="退出程序",command=root.quit)
quit_button.pack()
root.mainloop()

注意事项:

  • 有些图片识别的准确率较低(眼部识别准确率最低)
  • 就算增加侧脸识别功能,有些图片的人脸依旧识别无能
  • 而且我的openCV支持不了中文路径,一旦选择的图片路径中有中文,会报错

原理部分

程序主要运行步骤:

  • 导入图像
  • 将图像转换为灰度图像(因为电子计算机,状态0和1;具体原因不赘述)
  • 加载相应分类器
  • 检测图片中的人脸,标注并显示

循环主体部分是添加的功能,可以让用户选择加入图片和选择识别什么。

openCV中文文档