文章目錄
- 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 tqdm
import 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.23513855040073395
ymin: 0.3091171085834503
width: 0.5619093179702759
height: 0.5618590116500854
}
以上是輸出結果,,證明只有一個人臉框的相對資訊,的確圖片中也只有一個人像
'''
# 可視化人臉檢測結果
mp_drawing=mp.solutions.drawing_utils
keypoint_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_utils
keypoint_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()
#計算每秒處理影像的幀數FPS
FPS=1/(end_time-start_time)
scaler=1
img=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')
# break
frame=process_frame(frame)
#展示處理后的三通道影像
cv.imshow('my_window',frame)
if cv.waitKey(1) &0xff==ord('q'):
break
cap.release()
cv.destroyAllWindows()


轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/389017.html
標籤:其他
