目录
-
识别人脸
# 读取图像
import cv2
image = cv2.imread('../faceDetect/FGNET/images/001A02.JPG',1) # 1 为彩色图像 ; 0为灰色图像
print("image=",image)
# 显示图像
cv2.namedWindow("orignal")
cv2.imshow("orignal",image)
# print(image.shape) # (324, 450, 3)
# print(type(image.shape))
# print(image.shape[2]) # 3
cv2.waitKey(0) # 程序等待,否则会一闪而过
# 识别人脸
cascPath = '../../../../Anaconda3/anaconda3/lib/site-packages/cv2/data/haarcascade_frontalface_default.xml'
face_patterns = cv2.CascadeClassifier(cascPath)
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
faces = face_patterns.detectMultiScale(gray, scaleFactor=1.2, minNeighbors=5, minSize=(100, 100)) # 检测有多少张人脸
# 该函数返回四个值:矩形的 x 和 y 坐标,以及它的高和宽。
for (x, y, w, h) in faces: # 把每张脸都用一个框框出来
# print(x,y,w,h) # 64 110 200 200
cv2.rectangle(image, (x, y), (x + w, y + h), (0, 255, 0), 2)
cv2.imshow('after', image)
cv2.waitKey(0) # 程序等待,否则会一闪而过
cv2.destroyAllWindows()
cv2.rectangle()
方法用于在任何图像上绘制矩形。
用法: cv2.rectangle(image, start_point, end_point, color, thickness) 参数: image:它是要在其上绘制矩形的图像。 start_point:它是矩形的起始坐标。坐标表示为两个值的元组,即(X坐标值,Y坐标值)。 end_point:它是矩形的结束坐标。坐标表示为两个值的元组,即(X坐标值ÿ坐标值)。 color:它是要绘制的矩形的边界线的颜色。opencv中,颜色通道按顺序为BGR,对于BGR,我们通过一个元组。例如:(255,0,0)为蓝色。 thickness:它是矩形边框线的粗细像素。厚度-1像素将以指定的颜色填充矩形形状。 返回值:它返回一个图像。
另外,重新说一下,cv2.rectangle 的 start_point和end_point参数分别代表矩形的左上角和右下角两个点,而且 x 坐标轴是水平方向的,y 坐标轴是垂直方向的。
-
读取.pts文件
在FGNET中,已经给出了每张人脸的关键点坐标,在做练习时,可以直接使用这些关键点进行练习,但是我觉得这些数据直接使用有些不方便,需要做一下处理。
# 读取图片
import cv2
import matplotlib.pyplot as plt
import numpy as np
image = cv2.imread('../faceDetect/FGNET/images/015A03.JPG', 1) # 1 彩色,0 灰色
# 读取对应的pts文件
with open('../faceDetect/FGNET/points/015a03.pts') as file_obj:
contents = file_obj.readlines();
i = 0
landmarks = []
for line in contents:
TT = line.strip("\n") # strip() 方法用于移除字符串头尾指定的字符(默认为空格或换行符)或字符序列。
if i > 2 and i < 71:
# print TT
TT_temp = TT.split(" ")
x = float(TT_temp[0])
y = float(TT_temp[1].strip("\r")) # \r :回车
landmarks.append((x, y))
i += 1
print(landmarks)
# print(landmarks[1]) # (83.8168, 220.22)
# # 测试读出的点有多少个
# c=0
# for b in landmarks:
# c+=1;
# print(c) #68
# 将关键点标在图片上
'''
cv2.circle(image, center_coordinates, radius, color, thickness)
'''
m = 0 # 标号初始为0
for point in landmarks:
# print(point[0],point[1])
cv2.circle(image, (int(point[0]), int(point[1])), 2, (0, 255, 0), -1) # 颜色顺序:BGR (0, 255, 0)绿色,-1 实心圆
m += 1
cv2.putText(image, str(m), (int(point[0]), int(point[1])), cv2.FONT_HERSHEY_SIMPLEX, 0.25, (0, 0, 255),
1) # 每个关键点上标号
# plt.scatter(np.transpose(point)[0], np.transpose(point)[1]) # 散点图
# plt.show()
cv2.imshow("pointImg", image)
cv2.waitKey()
(1)读取图片关键点坐标
(2)将关键点标在图片上(这种方法有误差,因为坐标点必须是整数)