python_计算机视觉_opencv

opencv

start

import cv2
  • opencv 是c++ 语言写的, 给Python提供了一个接口,方法放到出cv2 中,所以,导入的包是cv2,
jin = cv2.imread('jin.jpg')
  • 读取目录下的jin.jpg图片
    在这里插入图片描述
    人脸识别
    • 弹出一个窗口,显示图片
cv2.resize(jin,dsize=(1080,607))
# 使用cv2的Cascade分类器获取训练数据,进行训练
face_detector = cv2.CascadeClassifier('haarcascade_frontalface_alt.xml')

# 使用Cascade分类器进行预测,会返回识别区域的左上角坐标与宽高
# 利用返回值绘制矩形
# scaleFactor 缩放比例 人脸识别的精细度 
# minNeighbors 邻居数量
face_zone = face_detector.detectMultiScale(jin,scaleFactor=1.1,minNeighbors=3)

# x,y 是识别到的人脸区域的左上角坐标x 是高,y 是宽
# w,h 是识别到的人脸区域的高与宽
for x,y,w,h in face_zone:
	# cv2的rectangle函数可以绘制矩形
	# pt1:矩形左上角坐标,pt2:矩形右下角坐标
    cv2.rectangle(jin,pt1=(x,y),pt2=(x+w,y+h),color=[0,0,255],thickness=2)  

cv2.imshow('jinzhengen',jin)
# cv2的imshow会调用自带的图片视频查看器进行显示
# 使用waitKey(0) 则等待点击键盘上的任意键来关闭图像
cv2.waitKey(0)
# 将生成的对象销毁掉,释放内存
# 此步骤是必须的,否则会出现崩溃
cv2.destroyAllWindows() 

同样,也可以进行其他的识别,如眼,嘴在这里插入图片描述

yong = cv2.imread('yong.jpg')

eye_detector = cv2.CascadeClassifier('haarcascade_eye.xml')
eye_zone = eye_detector.detectMultiScale(yong,scaleFactor = 1.3,minNeighbors=5)
for x,y,w,h in eye_zone:
    cv2.rectangle(yong,pt1 = (x,y),pt2=(x+w,y+h),color=[0,255,0],thickness=2)
    
mouth_detector = cv2.CascadeClassifier('haarcascade_mcs_mouth.xml')
mouth_zone = mouth_detector.detectMultiScale(yong,scaleFactor = 1.3,minNeighbors=15)
for x,y,w,h in mouth_zone:
    cv2.rectangle(yong,pt1 = (x,y),pt2=(x+w,y+h),color=[0,255,255],thickness=2)
    
cv2.imshow('yong',yong)
while True:
   # waitKey可以识别键盘的输入
    if ord('q')==cv2.waitKey(3000):     
        break
    else:
        print('请输入q')
cv2.destroyAllWindows()

还可以识别视频
把视频文件的每一帧图片进行处理,然后放映出来

import numpy as np

视频的读取与写入

# 使用VideoCapture 获取视频,获取后,cv2中会存有视频的各种数据
cap = cv2.VideoCapture('law.mp4')
# 四个字符表示压缩帧的编码  此为MPEG-4.2,为保存的文件设置
fourcc = cv2.VideoWriter_fourcc("M","P",'4','2')
# 通过get获取cv2中保存的视频的各项数据
fps = cap.get(cv2.CAP_PROP_FPS)    # 每秒帧率 24
w = int(cap.get(cv2.CAP_PROP_FRAME_WIDTH))
h = int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT))
# cv2的写入
video_write = cv2.VideoWriter(filename='law.avi',fourcc=fourcc,fps=fps,frameSize=(w,h))
zhen_sum = cap.get(cv2.CAP_PROP_FRAME_COUNT)   # 总帧数   3397  

视频时长 = 总帧数 / 每秒帧率
3397/24 ~= 141.5

显示视频,存储视频

# 读帧 返回只有两个,第二个为图片,第一个参数记录函数是否成功返回,cap中存储了此帧图片的某些相关信息,如下一帧
flag,frame = cap.read()

face_detector = cv2.CascadeClassifier('haarcascade_frontalface_default.xml')

num=0
while flag:
    face_zone = face_detector.detectMultiScale(frame,scaleFactor=1.1,minNeighbors=3)

    for x,y,w,h in face_zone:
        cv2.rectangle(frame,pt1=(x,y),pt2=(x+w,y+h),color=[0,0,255],thickness=2)  
        
     # 对前三秒和最后一秒进行灰度化操作   
    if num < 3*24:
    	# cvtColor改变图片的颜色,通过code属性
        frame = cv2.cvtColor(frame,code=cv2.COLOR_BGR2GRAY)
        # 上述方法后是三通道组合后的灰度,通过reshape变成单通道灰度
        frame = frame.reshape(frame.shape[0],frame.shape[1],1)
         # 上述方法后是单通道组合后的灰度,通过concatenate变成三通道灰度
        frame = np.concatenate([frame,frame,frame],axis=-1)
    elif num > 140*24:
        frame = cv2.cvtColor(frame,code=cv2.COLOR_BGR2GRAY)   # 2维度的
        frame = frame.reshape(frame.shape[0],frame.shape[1],1)
        frame = np.concatenate([frame,frame,frame],axis=-1)
    
    # 展示图片
    cv2.imshow('law',frame)
    # 写入一帧图片
    video_write.write(frame)
    # read() 会自动获取cap中的信息调用下一帧
    flag,frame = cap.read()
    if cv2.waitKey(1) == ord('q'):
        break
    num +=1
cv2.destroyAllWindows()
cap.release()
video_write.release()

打开摄像头进行头像识别

face_detector = cv2.CascadeClassifier('haarcascade_frontalface_default.xml')

导入一张图片,进行处理,在之后进行人脸识别后,用以替换
在这里插入图片描述

import matplotlib.pyplot as plt
head = cv2.imread('cat8.jpg')
head = head[100:500,450:850]
# head = cv2.resize(head,dsize=(1800,1500))
plt.imshow(head)
# 当VideoCapture的参数为0时,会从摄像头获取图像
cap = cv2.VideoCapture(0)
flag,frame = cap.read()

while flag:
    face_core = face_detector.detectMultiScale(frame,scaleFactor = 1.1,minNeighbors = 3)
    
    for x,y,w,h in face_core:
    # cv2 的resize() 方法可以更改图片的大小
    # 将其大小与识别的人脸区域相匹配
        he = cv2.resize(head,dsize=(w,h))
        for i in range(h):
            for j in range(w):
                if (i - h/2)**2 + (j-w/2)**2 <= (w/2)**2:
                    frame[y+i,x+j] = he[i,j]
    
    cv2.imshow('capture',frame)
    if cv2.waitKey(1) == ord('q'):
        break
    flag,frame = cap.read()
    
cv2.destroyAllWindows()
cap.release()
import cv2
import cv2
import cv2
import cv2

猜你喜欢

转载自blog.csdn.net/sinat_39045958/article/details/86506173