读取图片
impor cv2 as cv
img = cv.imread('图片所在位置')
cv.imshow('input image',img)
cv.waitKey(0) #等待键盘的输入 单位是毫秒 传入0 无限等待
cv.destroyAllWindows() #使用完内存进行释放
将图片灰度
import cv2 as cv
img = cv.imread('图片所在位置')
gray_img = cv.cvtColor(img,code = cv.COLOR_BGR2GRAY)
cv.imshow('gray_image',gray_img)
cv.waitKey(0) #键盘随便输入,图片会关掉
cv.destroyAllWindows()
修改图片尺寸
import cv2 as cv
img = cv.imread('图片所在位置')
resize_img = cv.resize(img,dsize = (200,300))
cv.imshow('resize_img',resize_img)
#只有输入q的时候,退出
while True:
if ord('q') == cv.waitKey(0):
break
cv.destroyAllWindows()
画矩形
import cv2 as cv
img = cv.imread('图片所在位置')
#绘制矩形
x,y,w,h = 50,50,80,80
cv.rectangle(resize_img,(x,y,x+w,y+h),color=(0,255,0),thickness=2) #color=BGR,x,y,x+w,y+h为矩形的四个角的坐标,color为颜色,thickness为线条粗细
#绘制圆center元组指圆点的坐标,radius为半径
cv.circle(resize_img,center=(x+w//2,y+h//2),radius=w//2,color=(0,0,255),thickness=2)
cv.imshow('result image',resize_img)
cv.waitKey(0)
cv.destroyAllWindows()
人脸检测
(1)特征
提取出图像的细节对产生稳定分类结果和跟踪很有用的结果称为特征。专业的表述为:从图像特征中提取特征。
(2)静态图像人脸检测(单个人)
#静态图像人脸检测
import cv2 as cv
def face_detect_demo():
#将图片转换为灰度图片
gray = cv.cvtColor(src, cv.COLOR_BGR2GRAY)
#加载特征数据,特征数据在官方下载的opencv文件夹下
face_detector = cv.CascadeClassifier('D:/OpenCV/opencv/sources/data/haarcascades/haarcascade_frontalface_default.xml')
faces = face_detector.detectMultiScale(gray)
for x,y,w,h in faces:
cv.rectangle(src,(x,y),(x+w,y+h),color = (0,255,0),thickness=2)
cv.imshow('result',src)
#加载图片
src = cv.imread('3.jpg')
face_detect_demo()
cv.waitKey(0)
cv.destroyAllWindows()
cv.imwrite('result.jpg',src)
静态图像人脸检测(多个人)
#静态图像人脸检测
import cv2 as cv
def face_detect_demo():
#将图片进行灰度处理
gray = cv.cvtColor(img,cv.COLOR_BGR2GRAY)
#加载特征数据
face_detector = cv.CascadeClassifier(
'D:/OpenCV/opencv/sources/data/haarcascades/haarcascade_frontalface_default.xml')
faces = face_detector.detectMultiScale(gray,scaleFactor=1.01,minNeighbors=3,maxSize=(33,33))
#画矩形
for x,y,w,h in faces:
print(x,y,w,h)
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)
#加载图片
img = cv.imread('3.jpg')
#调用人脸检测方法
face_detect_demo()
cv.waitKey(0)
cv.destroyAllWindows()```
### 视频人脸检测
```python
import cv2 as cv
def face_detect_demo(img):
# 将图片灰度
gray = cv.cvtColor(img,cv.COLOR_BGR2GRAY)
# 加载特征数据
face_detector = cv.CascadeClassifier('D:/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('1.mp4')
while True:
flag,frame = cap.read()
print('flag:',flag,'frame.shape:',frame.shape)
if not flag:
break
face_detect_demo(frame)
if ord('q') == cv.waitKey(10):
break
cv.destroyAllWindows()
cap.release()
训练数据
import os
import cv2
import sys
import numpy as np
from PIL import Image
def getImageAndLabels(path):
facesSamples = []
ids = []
imagePaths = [os.path.join(path,f) for f in os.listdir(path)]
#检测人脸识别
face_detector = cv2.CascadeClassifier(
'D:/OpenCV/opencv/sources/data/haarcascades/haarcascade_frontalface_default.xml')
#遍历列表中的图片
for imagePath in imagePaths:
#打开图片
PIL_img = Image.open(imagePath).convert('L')
#将图像转换为数组
img_numpy = np.array(PIL_img,'uint8')
faces = face_detector.detectMultiScale(img_numpy)
#获取每张图片的id
id = int(os.path.split(imagePath)[1].split('.')[0])
for x,y,w,h in faces:
facesSamples.append(img_numpy[y:y+h,x:x+w])
ids.append(id)
return facesSamples,ids
if __name__ == '__main__':
#图片路径
path = './data/jm/'
#获取图像数组和id标签数组
faces,ids = getImageAndLabels(path)
#获取循环对象
recognizer = cv2.face.LBPHFaceRecognizer_create()
recognizer.train(faces,np.array(ids))
#保存文件
recognizer.write('trainer/train.yml')
得到一个yml文件。
基于LBPH的人脸识别
LBPH(Local Binary Pattern Histogram)将检测到的人脸分为小单元,并将其与模型中的对应单元做比较,对每个区域的匹配值产生一个直方图。由于这种方法的灵活性,LBPH是唯一允许模型样本人脸和检测到的人脸在形状、大小上可以不同的人脸识别算法。
调整或的区域中调用predict()函数,该函数返回两个元素的数组:第一个元素是所识别个体的标签,第二个是置信度评分。所有的算法都有一个置信度评分阈值,置信度评分用来衡量所识别人脸与原模型的差距,0表示完全匹配。可能有时不想保留所有的识别结果,则需要进一步处理,因此可用自己的算法来估算识别的置信度评分。LBPH一个好的识别参考值要低于50,任何高于80的参考值都会被认为是低的置信度评分。
#使用训练的文件进行人脸识别
import cv2
import numpy as np
import os
#加载(读取)训练集文件
recognizer = cv2.face.LBPHFaceRecognizer_create()
recognizer.read('C:/Users/yuwenya/Desktop/opencv/trainer/trainer.yml')
#准备识别的图片
img = cv2.imread('C:/Users/yuwenya/Desktop/opencv/1.jpg')
gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
#加载特征数据
face_detector = cv2.CascadeClassifier('D:/OpenCV/opencv/sources/data/haarcascades/haarcascade_frontalface_default.xml')
faces = face_detector.detectMultiScale(gray)
for x,y,w,h in faces:
cv2.rectangle(img,(x,y),(x+w,y+h),(0,255,0),2)
cv2.imshow('result',img)
cv2.waitKey(0)
cv2.destroyAllWindows()