OpenCV的全称为Open Source Computer Vision Library
OpenCV是一个基于Apache2.0许可(开源)发行的跨平台计算机视觉和机器学习软件库,可以运行在Linux、Windows、Android和Mac OS操作系统上。 它轻量级而且高效——由一系列 C 函数和少量 C++ 类构成,同时提供了Python、Ruby、MATLAB等语言的接口,实现了图像处理和计算机视觉方面的很多通用算法。
OpenCV用C++语言编写,它具有C ++,Python,Java和MATLAB接口,并支持Windows,Linux,Android和Mac OS,OpenCV主要倾向于实时视觉应用,并
在可用时利用MMX和SSE指令, 如今也提供对于C#、Ch、Ruby,GO的支持
安装OpenCV
pip install opencv-python
基本使用
读取图片
image=cv2.imread(imagepath)
imshow有两个参数:显示图像的帧名称以及要显示图像本身,直接调用会随即消失,要保持一直在窗口显示,要通过waitKey()函数,waitKey()函数的参数为等待键盘触发的时间,单位为毫秒,其返回是-1(表示没有键被按下)
import cv2 as cv
img=cv.imread('1.png')#路径中不能有中文,否则加载失败
cv.imshow('read',img)
#等待键盘输入,单位毫秒
cv.waitKey(0)
#释放内存
cv.destroyAllWindows()
图片灰度转换
三种常用的色彩空间:灰度、BGR、以及HSV(Hue,saturation,Value)
- 灰度彩色空间是通过去除彩色信息来将其转化为灰阶,对中间处理特别有效
- BGR是RGB,只是颜色顺序不同
- HSV,H(Hue)是色调,S(saturation)是饱和度,V(value)黑暗程度
灰度转换的作用就是转换成灰度的图片的计算强度得以降低
import cv2 as cv
img=cv.imread('1.png')
cv.imshow('BGR',img)
#将图片灰度转换
gray_img=cv.cvtColor(img,cv.COLOR_BGR2GRAY)
cv.imshow('geay',gray_img)
#保存
cv.imwrite('grayss.jpg',gray_img)
cv.waitKey(0)
cv.destroyAllWindows()
修改图片的尺寸
import cv2 as cv
img=cv.imread('1.png')
#raise_img=cv.resize(img,dsize=(200,240))
raise_img=cv.resize(img,dsize=(400,400))
cv.imshow('resize_img',raise_img)
while True:
if ord('q')==cv.waitKey(0):
break
cv.destroyAllWindows()
画图
import cv2 as cv
img=cv.imread('1.png')
x,y,w,h=50,50,50,50
cv.rectangle(img,(x,y,x+w,y+h),color=(0,255,0),thickness=2)
x,y,r=50,50,30
cv.circle(img,center=(x,y),radius=r,color=(0,0,255),thickness=2)
cv.imshow('ran',img)
cv.waitKey(0)
cv.destroyAllWindows()
人脸检测
Haar级联的概念
在显微镜下,没有两片雪花看起来是一样的,但我们必须承认,雪花在整体上的相似之处更加明显。因此,抽象图像细节的一些方法有助于产生稳定的分类和跟踪结果。这些抽象称为特征,把一组特征表示为一个向量,可以根据图像的对应特征向量之间的距离来度量两幅图像之间的相似程度。
类 Haar 特征是应用于实时人脸检测的常用特征之一。每个类 Haar 特征描述了相邻图像区域之间的对比度模式。例如,边、顶点和细线都生成了一种特征。有些特征是独特的,因为这些特征通常出现在某一类对象(如人脸)上。而不会出现在其他对象上。可以把这些特征组织成一个层次结构,称为级联。其中最高层包含最显著特征,使分类器能够快速拒绝缺乏这些特征的主体。<br />[<br />](https://blog.csdn.net/qq_45832961/article/details/122740786)
对于任意给定的主体,特征可能会根据图像大小和正在评估对比度的领域大小而有所不同。正在评估对比度的领域大小称为窗口大小。为使 Haar 级联分类器尺度不变或者对尺度变化具有鲁棒性,窗口大小应保持不变。但是将图像重新缩放多次,在某种程度上,缩放时对象(如人脸)大小可能匹配窗口的大小。
原始图像和缩放图像一起称为图像金字塔。图像金字塔中的每个连续的层都是一幅更小的缩小图像。OpenCV提供了一个尺度不变的分类器,可以以一种特定的格式从 XML 文件加载级联分类器。这个分类器在内部将任意给定图像转化为图像金字塔。
opencv的下载与安装
使用OpenCV进行人脸检测
import cv2 as cv
def face_detect_demo():
gray=cv.cvtColor(img,cv.COLOR_BGR2GRAY)
fac_detector=cv.CascadeClassifier('D:/opencv/opencv/sources/data/haarcascades/haarcascade_frontalface_default.xml')
faces=fac_detector.detectMultiScale(gray)
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)
img=cv.imread('rn.png')
face_detect_demo()
cv.waitKey(0)
cv.destroyAllWindows()
import cv2 as cv
def face_detect_demo():
gray = cv.cvtColor(img, cv.COLOR_BGR2GRAY)
cv.cvtColor(img,cv.COLOR_BGR2GRAY)
fac_detector = cv.CascadeClassifier('D:/opencv/opencv/sources/data/haarcascades/haarcascade_frontalface_default.xml')
faces = fac_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)
img=cv.imread('face.png')
face_detect_demo()
cv.waitKey(0)
cv.destroyAllWindows()
import cv2 as cv
def face_detect_demo(img):
gray=cv.cvtColor(img,cv.COLOR_BGR2GRAY)
fac_detector = cv.CascadeClassifier('D:/opencv/opencv/sources/data/haarcascades/haarcascade_frontalface_default.xml')
faces = fac_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.imshow('result',img)
cap=cv.VideoCapture('video.mp4')
while True:
flag,frame=cap.read()
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
from PIL import Image
import numpy as np
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)
#print(os.path.split(imagePath))
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/'
faces,ids=getImageAndLabels(path)
recognizer=cv2.face.LBPHFaceRecognizer_create()
recognizer.train(faces,np.array(ids))
recognizer.write('trainer/trainer.yml')
基于LBPH的人脸识别
LBPH将检测到的人脸分为小单元,并将其余模型中的对应单元进行比较,每个区域的匹配值产生一个直方图。由于这种方法的灵活性,LBPH是唯一允许模型样本人脸和检测到人脸在形状、大小上可以不同的人脸识别算法
调整后的区域中调用predict()函数,该函数返回两个元素的数组:第一个元素是所识别个体的标签。第二个是置信度评分。所有算法都有一个置信度评分阀值,置信度评分用来衡量所识别人脸与原模型的差距。0表示完全匹配。LBPH一个好的识别参考值要低于50,任何高于80的参考值都会被认为是低的置信度评分
import cv2
import numpy as np
import os
recognizer=cv2.face.LBPHFaceRecognizer_create()
recognizer.read('trainer/trainer.yml')
img=cv2.imread('Paul_Wolfowitz_0010.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)
id,confidence=recognizer.predict(gray[y:y+h,x:x+w])
print('标签id',id,'置信度评分',confidence)
cv2.imshow('result',img)
cv2.waitKey(0)
cv2.destroyAllWindows()