opencv_day26(附带人脸识别,王珞丹还是白百何)

import matplotlib.pyplot as plt
#用于训练的数据
#rand1数据位于(0,30)
rand1=np.random.randint(0,30,(20,2)).astype(np.float32)
# print('rand1:',rand1)
#rand2数据位于(70,100)
rand2=np.random.randint(70,100,(20,2)).astype(np.float32)
# print('rand2:',rand2)
#将rand1和rand2拼接为训练数据
trainData=np.vstack((rand1,rand2))
# print('traibData',trainData)
#数据标签,共两类:0和1
#r1Label对应着rand1的标签,为类型0
r1Label=np.zeros((20,1)).astype(np.float32)
# print('r1Label',r1Label)
#r2Label对应着rand2的标签,为类型1
r2Label=np.ones((20,1)).astype(np.float32)
# print('r2Label',r2Label)
tdLabel=np.vstack((r1Label,r2Label))
# print('tdLabel',tdLabel)
#使用绿色标注类型0
g=trainData[tdLabel.ravel()==0]
print('g',g)
plt.scatter(g[:,0],g[:,1],80,'g','o')
#使用蓝色标注类型1
b=trainData[tdLabel.ravel()==1]
plt.scatter(b[:,0],b[:,1],80,'b','s')
#plt.show()
#test为用于测试的随机数,该数在0到100之间
test=np.random.randint(0,100,(1,2)).astype(np.float32)
plt.scatter(test[:,0],test[:,1],80,'r','*')
#使用OpenCV内的K近邻模块,并进行训练
knn=cv2.ml.KNearest_create()
knn.train(trainData,cv2.ml.ROW_SAMPLE,tdLabel)
#使用K近邻算法分类
ret,results,neighbours,dist=knn.findNearest(test,5)
#显示处理结果
print('当前随机数可以判定为类型:',results)
print('距离当前点最近的5个邻居是:',neighbours)
print('5个最近邻居的距离:',dist)
#可以观察一下显示,对比上述输出
plt.show()

输出:
在这里插入图片描述
当前随机数可以判定为类型: [[0.]]
距离当前点最近的5个邻居是: [[0. 0. 0. 0. 0.]]
5个最近邻居的距离: [[325. 340. 377. 481. 484.]]

# 支持向量机(SVM)
#例子:已知老员工的笔试成绩、面试成绩及对应的等级表现,根据新入职员工的
#笔试成绩、面试成绩预测其可能额表现
import cv2
import numpy as np
import matplotlib.pyplot as plt
#第1步 准备数据
#表现为A级的员工的笔试、面试成绩
a=np.random.randint(95,100,(20,2)).astype(np.float32)
#表现为B级的员工的笔试、面试成绩
b=np.random.randint(90,95,(20,2)).astype(np.float32)
#合并数据
data=np.vstack((a,b))
data=np.array(data,dtype='float32')
#第2步 建立分组标签,0代表A级,1代表B级
#aLabel 对应着a的标签,为类型0-等级A
aLabel=np.zeros((20,1))
#bLabel对应着b的标签,为类型1-等级B
bLabel=np.ones((20,1))
#合并标签
label=np.vstack((aLabel,bLabel))
#print(label)
label=np.array(label,dtype='int32')
#第3步 训练
#用ml机器学习模块SVM_create()创建svm
svm=cv2.ml.SVM_create()
#属性设置,直接采用默认值即可
#svm.setType(cv2.ml.SVM_C_SVC) #svm type
#svm.setKernel(cv2.ml.SVM_LINEAR) #line
#svm.setC(0.01)
#训练
result=svm.train(data,cv2.ml.ROW_SAMPLE,label)
#第4步 预测
#生成两个随机的笔试成绩和面试成绩数据对
test=np.vstack([[98,90],[90,99]])
test=np.array(test,dtype='float32')
#预测
(p1,p2)=svm.predict(test)
#第5步 观察结果
#可视化
plt.scatter(a[:,0],a[:,1],80,'g','o')
plt.scatter(b[:,0],b[:,1],80,'b','s')
plt.scatter(test[:,0],test[:,1],80,'r','*')
plt.show()
#打印原始测试数据test,预测结果
print(test)
print(p2)

输出:
[[98. 90.]
[90. 99.]]
[[1.]
[1.]]
在这里插入图片描述

#随机生成一组数据,使用函数cv2.kmeans()对其进行分类
import numpy as np
import cv2
from matplotlib import pyplot as plt
#随机生成两组数组
#生成60个值在[0,50]内的xiaoMI直径数据
xiaoMI=np.random.randint(0,50,60)
#生成60个值在[200,250]内的daMI直径数据
daMI=np.random.randint(200,250,60)
#将xiaoMI和daMI组合为MI
MI=np.hstack((xiaoMI,daMI))
#使用reshape函数将其转换为(120,1)
MI=MI.reshape((120,1))
#将MI转换为float32类型
MI=np.float32(MI)
#设置参数criteria的值
criteria=(cv2.TERM_CRITERIA_EPS+cv2.TERM_CRITERIA_MAX_ITER,10,1.0)
#设置参数flags的值
flags=cv2.KMEANS_RANDOM_CENTERS
#调用函数kmeans
retval,bestLabels,centers=cv2.kmeans(MI,2,None,criteria,10,flags)
'''
#打印返回值
print(retval)
print(bestLabels)
print(centers)
'''
#获取分类结果
XM=MI[bestLabels==0]
DM=MI[bestLabels==1]
#绘制分类结果
#绘制原始数据
plt.plot(XM,'ro')
plt.plot(DM,'bo')
#绘制中心点
plt.plot(centers[0],'rx')
plt.plot(centers[1],'bx')
plt.show()

输出:
在这里插入图片描述

#有一堆米粒按照长度,宽度对它们分类
#假设有两种米粒,其中一种是XM,另外一种是DM
import numpy as np
import cv2
from matplotlib import pyplot as plt
#随机生成两组数值
#xiaomi组,长和宽都在[0,20]内
xiaomi=np.random.randint(0,20,(30,2))
#print(xiaomi)
#dami组,长和宽都在[40,60]
dami=np.random.randint(40,60,(30,2))
#print(dami)
#组合数据
MI=np.vstack((xiaomi,dami))
#转换为float32类型
MI=np.float32(MI)
print(MI)
#print(MI)
#调用kmeans模块
#设置参数criteria值
criteria=(cv2.TERM_CRITERIA_EPS+cv2.TERM_CRITERIA_MAX_ITER,10,1.0)
#调用kmeans函数,注意输入的待处理数据得是np.float32类型的
ret,label,center=cv2.kmeans(MI,2,None,criteria,10,cv2.KMEANS_RANDOM_CENTERS)
'''
#打印返回值
print(ret)
print(label)
print(center)
'''
#根据kmeans的处理结果,将数据分为两类,分为XM和DM两大类
XM=MI[label.ravel()==0]
DM=MI[label.ravel()==1]

#绘制分类结果数据及中心点
plt.scatter(XM[:,0],XM[:,1],c='g',marker='s')
plt.scatter(DM[:,0],DM[:,1],c='r',marker='o')
plt.scatter(center[0,0],center[0,1],s=200,c='b',marker='o')
plt.scatter(center[1,0],center[1,1],s=200,c='b',marker='s')
plt.xlabel('Height'),plt.ylabel('Width')
plt.show()

输出:
在这里插入图片描述

#使用函数cv2.kmeans()将灰度图像处理为只有两个灰度级的二值图像
#显示变换前后的图像,分别显示原始图像和二值化图像
import numpy as np
import  cv2
import matplotlib.pyplot as plt
#读取待处理图像
img=cv2.imread('./img/01.jpg')
#使用reshape将一个像素点的RGB值作为一个单元处理
data=img.reshape((-1,3))
#转换为kmeans可以处理的类型
data=np.float32(data)
#调用kmeans模块
criteria=(cv2.TERM_CRITERIA_EPS+cv2.TERM_CRITERIA_MAX_ITER,10,1.0)
K=2
ret,label,center=cv2.kmeans(data,K,None,criteria,10,cv2.KMEANS_RANDOM_CENTERS)
#转换为uint8数据类型,将每个像素点都赋值为当前分类的中心点像素值
#将center的值转换为uint8
center=np.uint8(center)
#使用center内的值替换原像素点的值
res1=center[label.flatten()]
#使用reshape调整替换后的图像
res2=res1.reshape((img.shape))
#显示处理结果
plt.subplot(121)
#plt显示的是RGB,而cv2读取的是BGR
img=cv2.cvtColor(img,cv2.COLOR_RGB2BGR)
plt.imshow(img)
plt.axis('off')
plt.subplot(122)
plt.imshow(res2)
plt.axis('off')
plt.show()

输出:
在这里插入图片描述

#注意:使用pip命令安装的opencv是没有级联分类器的
#需要自行安装
#使用函数cv2.CascadeClassifier.detectMultiScale()检测一副图像内的人脸
import cv2
#读取待检测的图像
image=cv2.imread('./img/basha.jpg')
#获取XML文件,加载人脸检测器
faceCascae=cv2.CascadeClassifier('./classifier/haarcascade_frontalface_default.xml')
#色彩转换,转换为灰度图像
gray=cv2.cvtColor(image,cv2.COLOR_BGR2GRAY)
#调用函数detectMultiScale
faces=faceCascae.detectMultiScale(gray,scaleFactor=1.15,minNeighbors=5,minSize=(5,5))
print(faces)
#打印输出的测试结果
print("发现{0}个人脸!".format(len(faces)))
#逐个标注人脸
#xy为左上角坐标,wh为矩形的宽高
for (x,y,w,h) in faces:
    #cv2.rectangle(image,(x,y),(x+w,y+w),(0,255,0),2)#矩形标注
    cv2.circle(image,(int((x+x+w)/2),int((y+y+h)/2)),int(w/2),(0,255,0),2)
#显示结果
cv2.imshow('dect',image)
#保存检测结果
cv2.imwrite('./img/re.jpg',image)
cv2.waitKey(0)
cv2.destroyAllWindows()

输出:
[[313 455 67 67]
[485 454 71 71]
[648 451 69 69]
[249 88 74 74]
[622 175 62 62]
[323 214 59 59]
[178 209 62 62]
[354 145 63 63]
[ 69 155 55 55]
[509 126 59 59]
[103 232 78 78]
[462 169 68 68]
[788 206 65 65]
[ 36 211 65 65]]
发现14个人脸!
在这里插入图片描述

#本例使用opencv的LBPH模块实现一个简单的人脸识别示例
import cv2
import numpy as np
images=[]
images.append(cv2.imread('./img/a1.jpg',cv2.IMREAD_GRAYSCALE))
images.append(cv2.imread('./img/a2.png',cv2.IMREAD_GRAYSCALE))
images.append(cv2.imread('./img/b1.png',cv2.IMREAD_GRAYSCALE))
images.append(cv2.imread('./img/b2.jpg',cv2.IMREAD_GRAYSCALE))
#0是王珞丹,1是白百何
labels=[0,0,1,1]
#生成LBPH识别器实例模型
recognizer=cv2.face.LBPHFaceRecognizer_create()
#进行训练,src:训练图像,labels:标签,人脸图像所对应的标签
recognizer.train(images,np.array(labels))
predict_image=cv2.imread('./img/test.jpeg',cv2.IMREAD_GRAYSCALE)
label,confidence=recognizer.predict(predict_image)
print('label=',label)
print('confidence=',confidence)

输出:
厉害啊,能识别王珞丹还是白百何
label= 1
confidence= 38.098748444117255
在这里插入图片描述
在这里插入图片描述

#使用OpenCV的EigenFaces模块实现一个简单的人脸识别示例
import cv2
import numpy as np
images=[]
images.append(cv2.imread('./img/e01.jpg',cv2.IMREAD_GRAYSCALE))
images.append(cv2.imread('./img/e02.jpg',cv2.IMREAD_GRAYSCALE))
images.append(cv2.imread('./img/e10.jpg',cv2.IMREAD_GRAYSCALE))
images.append(cv2.imread('./img/e11.jpg',cv2.IMREAD_GRAYSCALE))
#0是王珞丹,1是白百何
labels=[0,0,1,1]
#生成EigenFaces识别器实例模型
recognizer=cv2.face.EigenFaceRecognizer_create()
#进行训练,src:训练图像,labels:标签,人脸图像所对应的标签
recognizer.train(images,np.array(labels))
predict_image=cv2.imread('./img/test.jpg',cv2.IMREAD_GRAYSCALE)
label,confidence=recognizer.predict(predict_image)
print('label=',label)
print('confidence=',confidence)

输出:
注意使用EigenFaces模块时输入图片的尺寸要是一样的。
在这里插入图片描述

#使用OpenCV的FisherFaces模块实现一个简单的人脸识别示例
import cv2
import numpy as np
images=[]
images.append(cv2.imread('./img/e01.jpg',cv2.IMREAD_GRAYSCALE))
images.append(cv2.imread('./img/e02.jpg',cv2.IMREAD_GRAYSCALE))
images.append(cv2.imread('./img/e10.jpg',cv2.IMREAD_GRAYSCALE))
images.append(cv2.imread('./img/e11.jpg',cv2.IMREAD_GRAYSCALE))
#0是王珞丹,1是白百何
labels=[0,0,1,1]
#生成FisherFaces识别器实例模型
recognizer=cv2.face.FisherFaceRecognizer_create()
#进行训练,src:训练图像,labels:标签,人脸图像所对应的标签
recognizer.train(images,np.array(labels))
predict_image=cv2.imread('./img/test.jpg',cv2.IMREAD_GRAYSCALE)
label,confidence=recognizer.predict(predict_image)
print('label=',label)
print('confidence=',confidence)

输出:
在这里插入图片描述
这里置信度(识别结果与原有模型之间的距离)低于5000才算可靠,超标了。范围0-20000之间。同EigenFaces方法,LBPH小于50可靠,大于80 不可靠。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值