文章目录
- ORB算法
- 视频读写
- 图像人脸识别
- 摄像头实时人脸检测
ORB算法
orb算法结合了Fast和Brief算法,提出了构造金字塔,为Fast特征点添加了方向,从而使得关键点具有了尺度不变性和旋转不变性。
# orb算法结合了Fast和Brief算法,提出了构造金字塔,为Fast特征点添加了方向,从而使得关键点具有了尺度不变性和旋转不变性。import numpy as np
import cv2 as cv
import matplotlib.pyplot as plt;
img=cv.imread('opencv_4.png')orb=cv.ORB_create(nfeatures=5000)kp,des=orb.detectAndCompute(img,None)img2=cv.drawKeypoints(img,kp,None,color=(0,0,255),flags=0)plt.figure(figsize=(10,8),dpi=100)
plt.imshow(img2[:,:,::-1])
plt.xticks([]),plt.yticks([])
plt.show()
视频读写
import numpy as np
import cv2 as cv
cap=cv.VideoCapture('opencv_5.wmv')
while(cap.isOpened()):ret,frame=cap.read()if ret ==True:cv.imshow('frame',frame)if cv.waitKey(25)&0xFF==ord('q'):break
cap.release()
cv.destroyWindow()
图像人脸识别
第一个写的,但是debug还是没有调试出来
import cv2 as cv
import matplotlib.pyplot as plt
img=cv.imread('img.png')
gray=cv.cvtColor(img,cv.COLOR_RGB2GRAY)# 实例化Openncv人脸和眼睛识别的分类器
face_cas=cv.CascadeClassifier("D:/anaconda3/anaconda3/envs/MachineLearning/Library/etc/haarcascades/haarcascade_frontalface_default.xml")
face_cas.load('haarcascade_frontalface_default.xml')eye_cas=cv.CascadeClassifier("D:/anaconda3/anaconda3/envs/MachineLearning/Library/etc/haarcascades/haarcascade_eye.xml")
eye_cas.load("haarcascade_eye.xml")# 调用识别人脸
face_rects=face_cas.detectMultiScale(gray,scaleFactor=1.2,minNeighbors=3,minSize=(50,50))
for faceRects in face_rects:x,y,w,h =faceRects
#框出人脸
cv.rectangle(img,(x,y),(x+h,y+w),(0,255,0),3)
# 在识别出的人脸中进行眼睛的检测
roi_color=img[y:y+h,x:x+w]
roi_gray=gray[y:y+h,x:x+w]
eyes=eye_cas.detectMultiScale(roi_gray)
for(ex,ey,ew,eh) in eyes:cv.rectangle(roi_color,(ex,ey),(ex+ew,ey+eh),(0,255,0),2)# 检测结果绘制
plt.figure(figsize=(8,6),dpi=100)
cv.imshow(img,"img")
cv.waitKey(0)
第二个:
import cv2 as cv
import mediapipe as mp
# 进度条库
import tqdmimport matplotlib.pyplot as plt# 定义可视化函数
def look_img(img):img_RGB=cv.cvtColor(img,cv.COLOR_BGR2RGB)plt.imshow(img_RGB)plt.show()# 导入BlazeFace人脸检测模型
mp_face_detection=mp.solutions.face_detection# help(mp_face_detection.FaceDetection)model=mp_face_detection.FaceDetection(min_detection_confidence=0.5,#置信度阈值,过滤掉小于置信度 的预测框model_selection=0,#选择模型,0适用于人脸距离镜头近(2m以内),1适用于距离远(5m以内)
)img=cv.imread('img.png')
look_img(img)# 将图像输入模型,获取预测结果
img_RGB=cv.cvtColor(img,cv.COLOR_BGR2RGB)result=model.process(img_RGB)print(result.detections)
# 上面可以看到所有人脸检测效果坐标
'''relative_bounding_box {xmin: 0.23513855040073395ymin: 0.3091171085834503width: 0.5619093179702759height: 0.5618590116500854}以上是输出结果,,证明只有一个人脸框的相对信息,的确图片中也只有一个人像
'''# 可视化人脸检测结果
mp_drawing=mp.solutions.drawing_utilskeypoint_style=mp_drawing.DrawingSpec(thickness=5,circle_radius=5,color=(0,255,0))# 人脸检测框样式
box_style=mp_drawing.DrawingSpec(thickness=5,circle_radius=5,color=(255,0,0))# 可视化人脸关键点和人脸框
annotated_image=img.copy()
for detection in result.detections:mp_drawing.draw_detection(annotated_image,detection,keypoint_drawing_spec=keypoint_style,bbox_drawing_spec=box_style)look_img(annotated_image)
cv.imwrite('TestA',annotated_image)
摄像头实时人脸检测
主要运用了mediapipe包,可以调用摄像头并且显示多个人脸的时候都可以进行识别,测试时还可以识别出图片和动物的头像
import mediapipe as mp
import cv2 as cv
from tqdm import tqdm
import time# 导入模型
mp_face_detection=mp.solutions.face_detection
model=mp_face_detection.FaceDetection(min_detection_confidence=0.5,model_selection=0,
)# 导入可视化样式
# 可视化人脸检测结果
mp_drawing=mp.solutions.drawing_utilskeypoint_style=mp_drawing.DrawingSpec(thickness=5,circle_radius=5,color=(0,255,0))# 人脸检测框样式
box_style=mp_drawing.DrawingSpec(thickness=5,circle_radius=5,color=(255,0,0))# 处理单帧的函数
def process_frame(img):#记录该帧处理的开始时间start_time=time.time()img_RGB=cv.cvtColor(img,cv.COLOR_BGR2RGB)result=model.process(img_RGB)if result.detections:for detection in result.detections:mp_drawing.draw_detection(img,detection,keypoint_drawing_spec=keypoint_style,bbox_drawing_spec=box_style)#记录该帧处理完毕的时间end_time=time.time()#计算每秒处理图像的帧数FPSFPS=1/(end_time-start_time)scaler=1img=cv.putText(img,'FPS'+str(int(FPS)),(25*scaler,50*scaler),cv.FONT_HERSHEY_SIMPLEX,1.25*scaler,(255,0,0),1,8)return img#调用摄像获取每帧
cap=cv.VideoCapture(0)cap.open(0)
# 无限循环,直到break被触发
while cap.isOpened():success,frame=cap.read()# if not success:# print('ERROR')# breakframe=process_frame(frame)#展示处理后的三通道图像cv.imshow('my_window',frame)if cv.waitKey(1) &0xff==ord('q'):breakcap.release()
cv.destroyAllWindows()