import cv2 #步骤1:载入图像 img = cv2.imread(r'C:\Users\yu\Desktop\1.jpg') img = cv2.resize(img,(int(img.shape[1]/2),int(img.shape[0]/2))) cv2.imshow("test",img) cv2.waitKey(0) gray = cv2.cvtColor(img , cv2.COLOR_BGR2GRAY) #将图像转换成灰度模式 opencv载入图像的方式是BGR cv2.imshow("test",gray) cv2.waitKey(0) #为什么不直接在载入图像的时候指定灰度图像?而是要转化 #因为在 标记的时候要显示到原图中去,而不是在灰度图中显示 #步骤1:创建级联分类器 xml文件是大数据训练好的人脸特征数据(需要下载) face_cascade = cv2.CascadeClassifier(r'C:\Users\yu\Desktop\haarcascade_frontalface_default.xml') #步骤2:将Numpy数组中的数据与级联分类器中的特征数据进行匹配,找到人脸。(已经记录坐标) faces = face_cascade.detectMultiScale(gray,scaleFactor = 1.05,minNeighbors=5) #参数1:传入需要检测人脸的图像 参数2:每次图像缩小的比例(脸有大有小,所以要不断缩小尺寸) 参数3:每一个目标至少要检测多少次才判定为最终的目标 #步骤3:框出人脸(提取上一步的坐标) 上一个方法detectMultiScale已经得到了脸部的坐标,只需要提取出来即可 for x,y,w,h in faces: img = cv2.rectangle(img,(x,y),(x+w,y+h),(0,255,0),3) #线条宽度是3 cv2.imshow("test",img) cv2.waitKey(0)
作业:
import cv2 #步骤1:加载图片 img = cv2.imread(r'C:\Users\yu\Desktop\l.jpg') #读取图像 gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY) #转化成灰度模式 BGR #步骤2:创建级联分类器,加载xml所有图片 face_cascade = cv2.CascadeClassifier(r'C:\Users\yu\Desktop\haarcascade_frontalface_default.xml') #步骤3:将Numpy数组中的数据与级联分类器中的特征数据进行匹配,找到人脸。(已经记录坐标) faces = face_cascade.detectMultiScale(gray , scaleFactor = 1.25 , minNeighbors = 5 ) #步骤4:读取坐标并显示矩形 for x,y,w,h in faces: img = cv2.rectangle(img , (x,y) , (x+w,y+h), (0,255,0) , 3) resized = cv2.resize(img,(int(img.shape[1]/2.5),int(img.shape[0]/2.5))) font = cv2.FONT_HERSHEY_SIMPLEX cv2.imshow("love",resized) cv2.waitKey(0)