导包、加载image
import cv2
print(cv2.__version__)
img = cv2.imread('jj.jpg')
调用人脸识别模块
自带的,需要调用安装的site-packages\cv2\data 下的 haarcascades文件夹里的这些东西,还不是很懂
face_detector = cv2.CascadeClassifier("haarcascades/haarcascade_frontalface_alt.xml")
eye_detector = cv2.CascadeClassifier("haarcascades/haarcascade_eye.xml")
face = face_detector.detectMultiScale(img, minNeighbors=6)#识别力度
eye = eye_detector.detectMultiScale(img, minNeighbors=3)
print(face,'\n\n',eye)
结果:返回的是x,y,w,h,即左下角左边和宽、高
框定人脸与眼睛
利用刚刚返回的坐标信息,利用rectangle画出识别框
for x,y,w,h in face:
cv2.rectangle(img,pt1=(x,y), pt2=(x+w,y+h),color=[0,0,255],thickness=1)
for x,y,w,h in eye:
cv2.rectangle(img,pt1=(x,y), pt2=(x+w,y+h),color=[255,255,255],thickness=1)
cv2.imshow('img',img)
cv2.waitKey(0)#图片保持刷新的时间,按任意键触发(关闭),若为0则只能手动触发
cv2.destroyAllWindows()#释放内存
结果:调整脸、眼的minNeighbor参数分别为6、3时的结果,会发现识别了很多“类似眼睛”的物品:
而调整到 分别为 6,35才刚好识别:
调用摄像头动态识别、并用其他图覆盖人脸
涉及知识点很多
- 图片本身打开是x, y, color形式的3维数组(第3维表示RGB有3个值),维度问题用 坐标轴想象就行,第三个维度是3颜色
- 上面的调用opencv人脸识别模块,cv2.CascadeClassifier
- 图片保存 cv2.imwrite
- 将新图片覆盖到检测的区域,需要注意的是选择第一个维度时,用y(纵向的坐标及范围)。看下图红色部分,图片虽然是3维,但是前两维就是此图,x是选“行”所以对一个指定的y坐标,遍历x的过程就变成一整列了!这样想就不会错啦
- cv2.rectangle画框、cv2.imshow显示图片
import cv2
video = cv2.VideoCapture(0)
face_detector = cv2.CascadeClassifier("haarcascades/haarcascade_frontalface_alt.xml")
def save_pic(name, pic):
cv2.imwrite('pics/%d.png'%name, pic)
for i in range(1000):
flag, face_pic = video.read();#是否检测的人像;截取一帧的图片像素
# print(flag, face_pic)
face = face_detector.detectMultiScale(face_pic, minNeighbors=20)#得到左下坐标和长宽
pic_cover = cv2.imread('hj0.jpg')
for x,y,w,h in face:#解包?
pic_cover = cv2.resize(pic_cover, dsize=(w,h))
save_pic(i, face_pic[y:y+h, x:x+w])#主要是纵向是y
face_pic[y:y+h, x:x+w] = pic_cover
cv2.rectangle(face_pic, pt1=(x, y), pt2=(x + w, y + h), color=[255,255,255], thickness=1);
cv2.imshow("camera", face_pic)
if ord('a') == cv2.waitKey(65):# a的ascii码
break
cv2.destroyAllWindows()
video.release()# 关闭录像
结果: