零蚀
[🔗 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") # 1 源数据, 2 缩放系数 ,3最小检测次数(领域检测数据) 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) # 截取脸部图片ROI 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
- 将遍历的代码简化
# for i in range(h): # for j in range(w): # color = src2[i, j] # if color == 0: # # 将源数据非绿色区域全部设置为白色 # src[i, j] = 255 # 简化 上面内容,将src2中的内容如果为0,src对应的区块改为白色 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++ 图像算法