零蚀 [🔗 opencv-python的官方文档]
简介
人脸识别的原理
这里用到的人脸识别的方式,也是通过级联分类器的方式,像安卓中我们用到的文件都是haar开头的,这个文件就是以haar特征为特征计算方式之一来进行计算的(一般还会用到Adaboost),它是用白色像素之和减去黑色像素的特征之和最后得出Haar特征值。
我们在用级联分类器的时候,我们会用到训练数据(.xml),我们这个训练数据(机器学习),在计算图像区域内是否有人脸,他会拿着一个数据模版,按照haar等特征计算方式,来计算是否是人脸,这个模版计算的方式类似卷积方式。(Haar白色区域减黑色区域的模版有以下3种)。
详情可见opencv的python官方文档🔜 🔗 opencv-python的官方文档 (人脸检测相关的在“物体检测”一栏中),关于如何制作数据,后面的机器学习单元时候会详细来说,如何通过机器学习来获得人脸训练数据。(官方文档可右键转中文)
实现人脸识别
他的具体的实现代码如下所示:(默认的xml训练数据文件在 [🔗 训练数据百度网盘]密码: ictr)
import cv2
as cv
src
= cv
.imread
("../source/jyz.jpeg")
classifier
= cv
.CascadeClassifier
("../source/haarcascade_frontalface_default.xml")
faces
= classifier
.detectMultiScale
(src
, 1.3, 5)
print("检测到人脸的数量:", len(faces
))
for face
in faces
:
x
= face
[0]
y
= face
[1]
width
= face
[2]
height
= face
[3]
cv
.rectangle
(src
, (x
, y
), (x
+ width
, y
+ height
), (255, 0, 0), 4)
cv
.putText
(src
, "JinYuZhen", (x
, y
-10), cv
.FONT_HERSHEY_COMPLEX
, 1, (255, 0, 200), 2)
cv
.imshow
("src", src
)
cv
.waitKey
()
眼睛识别和脸部识别的大体逻辑也是一样的,除了这种方式,我们也可以在识别的脸部进行脸部识别。
for face
in faces
:
x
= face
[0]
y
= face
[1]
width
= face
[2]
height
= face
[3]
cv
.rectangle
(src
, (x
, y
), (x
+ width
, y
+ height
), (255, 0, 0), 4)
cv
.putText
(src
, "JinYuZhen", (x
, y
- 10), cv
.FONT_HERSHEY_COMPLEX
, 1, (255, 0, 200), 2)
face_src
= src
[y
:y
+ height
, x
:x
+ width
]
eyes
= eyes_detect
.detectMultiScale
(face_src
, 1.1, 5)
for eye
in eyes
:
eye_x
= eye
[0]
eye_y
= eye
[1]
eye_w
= eye
[2]
eye_h
= eye
[3]
cv
.rectangle
(src
, (eye_x
+x
, eye_y
+y
), (eye_x
+ eye_w
+x
, eye_y
+ eye_h
+y
), (0, 255, 0), 4)
相机代码结合
camera
= cv
.VideoCapture
(0)
width
= camera
.get
(cv
.CAP_PROP_FRAME_WIDTH
)
height
= camera
.get
(cv
.CAP_PROP_FRAME_HEIGHT
)
fps
= camera
.get
(cv
.CAP_PROP_FPS
)
faces
= cv
.CascadeClassifier
("../source/haarcascade_frontalface_default.xml")
while True:
flag
, frame
= camera
.read
()
if flag
:
src
= cv
.flip
(frame
, 1)
face
= faces
.detectMultiScale
(src
, 1.1, 5)
for face_array
in face
:
f_x
= face_array
[0]
f_y
= face_array
[1]
f_w
= face_array
[2]
f_h
= face_array
[3]
cv
.rectangle
(src
, (f_x
, f_y
), (f_x
+ f_w
, f_y
+ f_h
), (0, 255, 0), 4)
cv
.imshow
("camera", src
)
key
= cv
.waitKey
(int(1000 / fps
))
过滤
HSV 颜色模型
HSV(Hua色调,Saturation饱和度,Value亮度),用角度来对应每一个RGB色值。他的用处比如计算整个图片的亮度值等等:
import cv2
as cv
import numpy
as np
src
= cv
.imread
("../source/hang.jpeg")
dst
= cv
.cvtColor
(src
, cv
.COLOR_BGR2HSV
)
average
= np
.sum(cv
.split
(dst
)[2]) / (src
.shape
[0] * src
.shape
[1])
print(average
)
以下案例是通过定义色调范围来取出图片的部分内容
按照上述的色调来设置过滤出自己需要的颜色,比如这里我获取图片中所有的绿色部分。
import cv2
as cv
src
= cv
.imread
("../source/android.png")
hsv
= cv
.cvtColor
(src
, cv
.COLOR_BGR2HSV
)
down_line
= (26, 43, 46)
up_line
= (77, 255, 255)
dst
= cv
.inRange
(hsv
, down_line
, up_line
)
cv
.imshow
("src", src
)
cv
.imshow
("dst", dst
)
cv
.waitKey
()
我们可以针对这种结果今年那行抠图(颜色命中区域为白色,未命中区域为黑色)。 h
= src
.shape
[0]
w
= src
.shape
[1]
for i
in range(h
):
for j
in range(w
):
color
= src2
[i
, j
]
if color
== 0:
src
[i
, j
] = 255
将遍历的代码简化
src
[src2
== 0] = (255, 255, 255)
🔗 前言 🔗 机器人视觉篇 🔗 NO.1 机器视觉 前言 🔗 NO.2 机器视觉 几何变化 & 特效处理 🔗 NO.3 机器视觉 直方图 & 帧提取 🔗 NO.5 机器人视觉 二值化 & 卷积 🔗 NO.6 机器人视觉 霍夫检测 & 边缘查找 🔗 NO.7 C++中使用Opencv 🔗 NO.8 C++ 直方图 & 卷积 🔗 NO.9 C++ 匹配 & 变化 🔗 NO.10 C++ 图像算法