pytorch

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:

上一篇 下一篇

猜你喜欢

热点阅读