我们先逐步进行学习。我将人脸检测的学习步骤分为如下几个方面。
(1—4是一些小步骤。5—7是具体实现的案例)
关于代码的相关意义我已经在程序中写上了备注(已经尽可能详细了!!)
1、加载图片:
源程序代码如下:
""" __author__="dazhi" 2021/3/20-15:00 """ #导入模块 import cv2 as cv #读取图片(注意路径不要有中文,否则会报错) img = cv.imread("C:\Users\26301\Desktop\2.jpg") #显示图片(这时的照片会一闪而过) cv.imshow('read_img',img) #设置等待键盘输入(保证上边显示的照片可以停留) #传入0表示无限等待,直到有东西输入(单位是毫秒) cv.waitKey(3000) #释放内存(由于底层是c++写的,所以将底层里面的空间进行释放) cv.destroyAllWindows()
运行结果如下:
2、图片灰度转换:
源程序代码如下:
""" __author__="dazhi" 2021/3/20-15:25 """ #导入模块 import cv2 as cv #读取图片(注意路径不要有中文,否则会报错) BGR_img = cv.imread("C:\Users\26301\Desktop\2.jpg") #显示图片(这时的照片会一闪而过) cv.imshow('BGR_img',BGR_img) #图片灰度转换 gray_img = cv.cvtColor(BGR_img,cv.COLOR_BGR2GRAY) cv.imshow('gray_img',gray_img) #保存图片 cv.imwrite('gray_img.jpg',gray_img) #设置等待键盘输入(保证上边显示的照片可以停留) #传入0表示无限等待,直到有东西输入(单位是毫秒) cv.waitKey(0) #释放内存(由于底层是c++写的,所以将底层里面的空间进行释放) cv.destroyAllWindows()
运行结果如下:
3、修改图片尺寸(在此次人脸检测案例中未用到):
源程序代码如下:
""" __author__="dazhi" 2021/3/20-15:30 """ # 导入模块 import cv2 as cv # 读取图片(注意路径不要有中文,否则会报错) img = cv.imread("C:\Users\26301\Desktop\2.jpg") # 显示图片(这时的照片会一闪而过) cv.imshow('img', img) print("原来图片的形状:",img.shape) # 修改图片尺寸(宽度,高度) resize_img = cv.resize(img, dsize=(200, 240)) print("修改后图片的形状:",resize_img.shape) # 显示图片(这时的照片会一闪而过) cv.imshow('resize_img', resize_img) # 设置等待键盘输入(保证上边显示的照片可以停留) # 传入0表示无限等待,直到有东西输入(单位是毫秒) #设置只有输入q的时候、退出 while True: #ord('q')表示q对应的ascall if ord('q') == cv.waitKey(0): break # 释放内存(由于底层是c++写的,所以将底层里面的空间进行释放) cv.destroyAllWindows()
运行结果如下:
4、绘制矩形-圆形(只是简单地在图片上随便画一个):
源程序代码如下:
""" __author__="dazhi" 2021/3/20-15:39 """ # 导入模块 import cv2 as cv # 读取图片(注意路径不要有中文,否则会报错) img = cv.imread("C:\Users\26301\Desktop\2.jpg") # 画矩形(x,y指的是矩形左上角的哪个点) x, y, w, h = 50, 50, 80, 80 # color变量里参数的顺序是BGR,thickness表示的是宽度 # (x,y,x+w,y+h)左上和右下两个点 cv.rectangle(img, (x, y, x + w, y + h), color=(0, 255, 0), thickness=2) #画圆center元组指的是原点的坐标 x,y,r = 200,200,100 cv.circle(img,center=(x,y),radius=r,color=(0,0,255),thickness=3) # 显示图片(这时的照片会一闪而过) cv.imshow('img', img) # 设置等待键盘输入(保证上边显示的照片可以停留) # 传入0表示无限等待,直到有东西输入(单位是毫秒) cv.waitKey(0) # 释放内存(由于底层是c++写的,所以将底层里面的空间进行释放) cv.destroyAllWindows()
运行结果如下:
5、图像单个人脸检测:
源程序代码如下:
""" __author__="dazhi" 2021/3/20-16:30 """ # 导入库 import cv2 as cv def face_detect_demo(): # 将图片转换为灰度图片 gray = cv.cvtColor(img, cv.COLOR_BGR2GRAY) # 加载特征数据 face_detector = cv.CascadeClassifier('D:/wen10/opencv/opencv/sources/data/haarcascades/haarcascade_frontalface_default.xml') #进行检测人脸操作 faces = face_detector.detectMultiScale(gray) #得到的daces可能是多组x,y,h,w print("faces 的数值:",faces) for x, y, w, h in faces: cv.rectangle(img, (x, y), (x + w, y + h), color=(0, 255, 0), thickness=2) # 显示图片(这时的照片会一闪而过) cv.imshow('result', img) if __name__ == '__main__': # 读取图片(注意路径不要有中文,否则会报错) img = cv.imread("C:\Users\26301\Desktop\1.jpg") face_detect_demo() # 设置等待键盘输入(保证上边显示的照片可以停留) # 传入0表示无限等待,直到有东西输入(单位是毫秒) cv.waitKey(0) # 释放内存(由于底层是c++写的,所以将底层里面的空间进行释放) cv.destroyAllWindows()
运行结果如下:
6、图像多个人脸检测:
源程序代码如下:
""" __author__="dazhi" 2021/3/20-16:49 """ # 导入库 import cv2 as cv def face_detect_demo(): # 将图片转换为灰度图片 gray = cv.cvtColor(img, cv.COLOR_BGR2GRAY) # 加载特征数据 face_detector = cv.CascadeClassifier('D:/wen10/opencv/opencv/sources/data/haarcascades/haarcascade_frontalface_default.xml') #进行检测人脸操作(参数也可以不写) faces = face_detector.detectMultiScale(gray,scaleFactor=1.01,minNeighbors=50) #得到的daces可能是多组x,y,h,w print("faces 的数值:",faces) for x, y, w, h in faces: #画矩形 cv.rectangle(img, (x, y), (x + w, y + h), color=(0, 255, 0), thickness=2) #画圆 cv.circle(img, center=(x + w // 2, y + h // 2),radius=w//2,color=(0,0,255),thickness=1) # 显示图片(这时的照片会一闪而过) cv.imshow('result', img) if __name__ == '__main__': # 读取图片(注意路径不要有中文,否则会报错) img = cv.imread("C:\Users\26301\Desktop\5.jpg") face_detect_demo() # 设置等待键盘输入(保证上边显示的照片可以停留) # 传入0表示无限等待,直到有东西输入(单位是毫秒) cv.waitKey(0) # 释放内存(由于底层是c++写的,所以将底层里面的空间进行释放) cv.destroyAllWindows()
运行结果如下:
7、视频中的人脸检测:
源程序代码如下:
""" __author__="dazhi" 2021/3/20-17:10 """ #导入依赖 import cv2 as cv def face_detect_demo(img): #将图片灰度 gray=cv.cvtColor(img,cv.COLOR_BGR2GRAY) #加载特征数据 face_detector = cv.CascadeClassifier('D:/wen10/opencv/opencv/sources/data/haarcascades/haarcascade_frontalface_default.xml') #进行检测人脸操作(参数也可以不写) faces = face_detector.detectMultiScale(gray) for x,y,w,h in faces: #画矩形 cv.rectangle(img,(x,y),(x+w,y+h),color=(0,0,255),thickness=2) #画圆 cv.circle(img,center=(x+w//2,y+h//2),radius=(w//2),color=(0,255,0),thickness=2) # 显示图片(这时的照片会一闪而过) cv.imshow('result',img) #读取视频 cap=cv.VideoCapture('video.mp4') #播放进行读取(一帧一帧的走) while True: #flag表示是否在播放(布尔类型) flag,frame=cap.read() #判断是否在播放 if not flag: break face_detect_demo(frame) #输入q的时候进行关闭 if ord('q') == cv.waitKey(10): break #释放内存 cv.destroyAllWindows() #释放视频的空间 cap.release()
运行结果如下:
(这个可以实现视频播放过程中识别,但是博主忘记怎么在csdn里放视频了,所以就在视频的播放过程中截了几张图。如下~~~~~)