opencv
2022-11-26 本文已影响0人
午字横
1:基础操作
import cv2
#创建窗口
titleName='window_testname'
cv2.namedWindow(titleName,cv2.WINDOW_NORMAL)
cv2.resizeWindow(titleName,width=300,height=400)
cv2.imshow(titleName,mat=0)
#怎么计算某个按键的ascii码
print(ord('q'))
#等待案按键
#waitKey会返回案件的ascii的值
#0表示任意按键如果给其它的整数,表示等待的时间,单位是毫秒
key= cv2.waitKey(delay=0)
print(key)
if key & 0xFF ==ord('q'): #& 0xFF key是int类型。最少是16位,但是ascii码是八位,目的是去除后八位跟 ord('q')做比较
cv2.destroyAllWindows()
2:加载图片
#读取图片
import cv2
import matplotlib
import matplotlib.pyplot as plt
matplotlib.use('TkAgg')#加上这行代码即可,agg是一个没有图形显示界面的终端,常用的有图形界面显示的终端有TkAgg等
titleName='t'
cv2.namedWindow(winname=titleName,flags=cv2.WINDOW_NORMAL)
cv2.resizeWindow(titleName,300,400)
img=cv2.imread(r'C:\Users\liu\Desktop\imgs\kitten.jpg')
print(img.shape)
#plt.imshow(img) #pycharm读不出来,就算读出来也是BGR通道的
# print('done')
# cv2.imshow(winname='img',mat=img)
# key= cv2.waitKey(0)
while True:
cv2.imshow(titleName,img)
key=cv2.waitKey(0)
if key==ord('q'):
break
elif key==ord('s'):
cv2.imwrite('./123.png',img)
else:
print(key)
cv2.destroyAllWindows()
3:读取视频、摄像头
#读取视频、摄像头
import cv2
titleName='t'
cv2.namedWindow(titleName,flags=cv2.WINDOW_NORMAL)
cv2.resizeWindow(titleName,640,480)
# 默认0为读取摄像头,视频路径为读取视频,视频播放完毕后自动关闭窗体
# cap=cv2.VideoCapture(0)
cap=cv2.VideoCapture('./video.mp4')
print('cap.isOpened()',cap.isOpened())
while cap.isOpened():
ret,frame=cap.read()
#if not ret:
if ret==False:
break
cv2.imshow(titleName,frame)
key=cv2.waitKey(1000//30) # 30帧率播放,//表示计算后取整数
if key==ord('q'):
break
cap.release()
cv2.destroyAllWindows()
4:视频录制
#视频录制
import cv2
cap=cv2.VideoCapture(0)
print(*'MP4V') #表示解包操作 =》 M P 4 V
fourcc=cv2.VideoWriter_fourcc(*'MP4V') #XVID代表avi格式
#创建videowriter
vw=cv2.VideoWriter('output.mp4',fourcc,30,(640,480))
while cap.isOpened():
ret,frame=cap.read()
if not ret:
break
#写入每一帧数据
vw.write(frame)
cv2.imshow('titleName',frame)
if cv2.waitKey(1)==ord('q'):
break
cap.release()
vw.release()
cv2.destroyAllWindows()
5:检测人脸
#opencv检测人脸
import cv2
import numpy as np
img=cv2.imread(r'C:\Users\liu\Desktop\imgs\imageData_01.png')
gray=cv2.cvtColor(img,code=cv2.COLOR_BGR2GRAY)
face_detector=cv2.CascadeClassifier('./haarcascade_frontalface_alt.xml')
#返回四位坐标,左上角(x,y)、宽度,高度
faces=face_detector.detectMultiScale2(gray,minNeighbors=1)
print(faces)
for x,y,w,h in faces[0]:
cv2.rectangle(img,(x,y),(x+w,y+h),[0,0,255],2)
cv2.imshow('face',img)
cv2.waitKey(0)
cv2.destroyAllWindows()
6:卷积操作-滤波器
import cv2
import numpy as np
img=cv2.imread(r'C:\Users\liu\Desktop\imgs\imageData.png')
#kernel必须是float
kernel=np.ones((5,5),np.float32)/25 #模糊
kernel_01=np.array([[-1,-1,-1],[-1,8,-1],[-1,-1,-1]])
#卷积操作
#dst=cv2.filter2D(img,-1,kernel)
dst=cv2.filter2D(img,-1,kernel_01)
cv2.imshow('titleName',np.hstack((img,dst)))
cv2.waitKey(0)
cv2.destroyAllWindows()
7:方盒滤波与均值滤波
参数a的作用:
normalize = true, a = 1/W * H 此时为均值滤波
normalize = false, a=1 此时不进行均值化,输出的结果为25个元素之和
当normalize = true时,方盒滤波 ==平均滤波,一般情况下都使用均值滤波,所以在使用时直接调用均值滤波API
方盒滤波API
boxFilter(src, ddepth, ksize, anchor, normalize, borderType)
参数含义:
ddepth 输出图像的位深
ksize 卷积核的大小
anchor 锚点,一般取卷积核的中心点,默认值即可
normalize 方盒滤波
均值滤波API
blur(src, ksize,anchor,borderType)
一般情况下方盒滤波和均值滤波相等,默认情况下normalize = true,一般使用blur()进行滤波
#方盒滤波与均值滤波
#卷积操作==》滤波器
import cv2
import numpy as np
img=cv2.imread(r'C:\Users\liu\Desktop\imgs\imageData.png')
#dst=cv2.boxFilter(img,-1,(5,5),normalize=True) #方盒滤波
dst=cv2.blur(img,(5,5)) #均值滤波
cv2.imshow('titleName',np.hstack((img,dst)))
cv2.waitKey(0)
cv2.destroyAllWindows()
8:人脸识别、物体识别同理
#人脸采集
import cv2
cap=cv2.VideoCapture(0)
face_detector=cv2.CascadeClassifier('./haarcascade_frontalface_alt.xml')
fileName=0
flog_write=False
while cap.isOpened():
falg,frame=cap.read()
if not falg:
break
gray=cv2.cvtColor(frame,code=cv2.COLOR_BGR2GRAY)
faces=face_detector.detectMultiScale(gray)
for x,y,w,h in faces:
if flog_write:
face=gray[y:y+h,x:x+w] #获取人脸保存
face=cv2.resize(face,dsize=(64,64)) #调整人脸,统一尺寸
cv2.imwrite('./person/IMG_02/{}.jpg'.format(fileName),face)
fileName+=1
cv2.rectangle(frame,pt1=(x,y),pt2=(x+w,y+h),color=[0,0,255],thickness=2)
pass
if(fileName>=30):
break
cv2.imshow('titleName', frame)
key=cv2.waitKey(1000//24)
if key==ord('q'):
break
if key==ord('w'):
flog_write=True
cap.release()
cv2.destroyAllWindows()
"""#切片操作的复习
L = ['Michael', 'Sarah', 'Tracy', 'Bob', 'Jack']
print(L[0:3])
print(L[:3])
print(L[1:3])
print(L[-2:])
"""
#静态人脸识别
import cv2
import os
import numpy as np
def load_data():
listdir = os.listdir('./person')
print(listdir)
names = [d for d in listdir if not d.startswith(',')]
print(names)
faces = []
target=[]
for index,dir in enumerate(names,0):
print(dir)
for i in range(0, 30):
gray = cv2.imread('./person/{}/{}.jpg'.format(dir, i)) # 此处获得是三个通道
# print(gray.shape)
gray_ = gray[:, :, 0] # 此处操作把三个通道的中第一个取出[全部取,全部取,只取第一个通道]
# print(gray.shape)
# print(gray_.shape)
gray_ = cv2.resize(gray_, dsize=(64, 64)) # 其中不符合尺寸要求的调整到符合
faces.append(gray_)
target.append(index)
faces = np.array(faces) # (60, 64, 64) 30张图片(30个灰色通道,宽64像素,高64像素)
target=np.array(target)
#print(faces.shape)
return faces,target,names
def split_data(faces,target):
index = np.arange(len(faces))
np.random.shuffle(index) # 打乱索引
faces = faces[index]
target = target[index]
size=len(target)//3*2 #取数据集的三分之二做训练数据,三分之一做测试数据
x_train, x_test = faces[:size], faces[size:]
y_train, y_test = target[:size], target[size:]
return x_train,x_test,y_train,y_test
if __name__ == '__main__':
# 加载数据
faces,target,names=load_data()
# 数据的拆分
x_train,x_test,y_train,y_test=split_data(faces,target)
print(x_train.shape,x_test.shape,y_train.shape,y_test.shape)
# 加载算法
face_recognizer= cv2.face.EigenFaceRecognizer_create()
# print(face_recognizer)
# 训练
face_recognizer.train(x_train,y_train)
# 使用算法进行预测
for face in x_test:
#返回的预测值是数字
#返回两个,第一个是类别,第二个是置信度(距离),越近越好
y_ ,confidence= face_recognizer.predict(face)
print(y_)
name=names[y_]
print('这个人是: ',name)
cv2.imshow('face',face)
key=cv2.waitKey(0)
if key==ord('q'):
break
cv2.destroyAllWindows()
9:一百行代码实现动态人脸识别
#动态识别人脸
#先屏蔽5,开启1;进行人脸的采集,采集成功后屏蔽1.开启5进行人脸的识别。
import cv2
import os
import numpy as np
# load——data是获取人脸数据并且灰度化得到模型的脸部关键点信息,标签,姓名
def load_data():
listdir = os.listdir('./faces_dynamic') # 此处为获取模型中的人脸数据
names = [d for d in listdir if not d.startswith('.')]
faces = [] # 保存人脸的关键点信息
target = [i for i in range(len(names))] * 10 # 保存标签
for dir in names:
for i in range(1, 11): # 加载图片
gray = cv2.imread('./faces_dynamic/%s/%d.jpg' % (dir, i)) # 三维图片;灰度化
gray_ = gray[:, :, 0] # 二维数组
gray_ = cv2.equalizeHist(gray_) # 图片的均衡化处理,颜色鲜明
faces.append(gray_) # 添加二维的人脸数据
faces = np.asarray(faces) # 转换成数字
target = np.asarray(target) # 转换成数字
target.sort() # 标签的打散
return faces, target, names # 返回人脸数据,标签,姓名
def take_phone(path): # 获取摄像头数据,调用分类器进行人脸的分类和采集
cap = cv2.VideoCapture(0)
face_detector = cv2.CascadeClassifier('./haarcascade_frontalface_alt.xml')
filename = 1
flag_write = False
while True:
flag, frame = cap.read()
if not flag:
break
gray = cv2.cvtColor(frame, code=cv2.COLOR_BGR2GRAY)
faces = face_detector.detectMultiScale(gray, minNeighbors=10)
for x, y, w, h in faces:
if flag_write:
face = gray[y:y + h, x:x + w]
face = cv2.resize(face, dsize=(64, 64))
cv2.imwrite('./faces_dynamic/%s/%d.jpg' % (path, filename), face)
filename += 1
cv2.rectangle(frame, pt1=(x, y), pt2=(x + w, y + h), color=[0, 255, 0], thickness=2)
if filename > 10:
break
cv2.imshow('face', frame)
key = cv2.waitKey(1000 // 24)
if key == ord('q'):
break
if key == ord('w'):
flag_write = True
cv2.destroyAllWindows()
cap.release()
def take_faces(): # 创建采集人脸数据的文件夹,调用上面写的采集函数可称为是采集函数
while True:
key = input('请输入文件夹的名字(拼音的缩写,如果输入Q,程序退出!:)')
if key == 'Q':
break
# 在faces_dynamic下面创建子文件夹
os.makedirs('./faces_dynamic/%s' % (key), exist_ok=True)
take_phone(key)
def dynamic_recognizer_face(face_recognizer, names): # 人脸识别函数
cap = cv2.VideoCapture(0)
# 人脸检测
face_detector = cv2.CascadeClassifier('./haarcascade_frontalface_alt.xml')
while True:
flag, frame = cap.read()
if not flag:
break
gray = cv2.cvtColor(frame, code=cv2.COLOR_BGR2GRAY)
faces = face_detector.detectMultiScale(gray, minNeighbors=10)
for x, y, w, h in faces:
face = gray[y:y + h, x:x + w]
face = cv2.resize(face, dsize=(64, 64))
face = cv2.equalizeHist(face) # 动态采集的数据进行均衡化处理
y_, confidence = face_recognizer.predict(face) # 人脸辨识
label = names[y_]
print('这个人是:%s;置信度为:%0.1f' % (label, confidence))
cv2.rectangle(frame, pt1=(x, y), pt2=(x + w, y + h), color=[0, 255, 0], thickness=2)
cv2.putText(frame, text=label, org=(x, y - 10),
fontFace=cv2.FONT_HERSHEY_SCRIPT_COMPLEX,
fontScale=1.5,
color=[0, 0, 255], thickness=2)
cv2.imshow('face', frame)
key = cv2.waitKey(1000 // 24)
if key == ord('q'):
break
cv2.destroyAllWindows()
cap.release()
if __name__ == '__main__':
# 1.动态的采集人脸
# take_faces()
# 2.加载数据,返回目标值
faces, target, names = load_data()
# 3.加载算法
# face_recognizer=cv2.face.EigenFaceRecognizer_create()#置信度很大,准确率较低
# face_recognizer = cv2.face.FisherFaceRecognizer_create()#置信度较低,准确率还行
face_recognizer = cv2.face.LBPHFaceRecognizer_create() # 置信度很低,准确率最高可选用
# 4.进行算法训练,找到数据和目标之间的规律
face_recognizer.train(faces, target)
# 5.动态加载数据
dynamic_recognizer_face(face_recognizer, names)
10: