欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

python6

程序员文章站 2022-03-02 12:13:30
...

人脸识别基本过程:

1.人脸录入

2.训练识别器

3.人脸对比,识别人脸(框出人脸,并打标签)

4.实现人脸特征值入库(MySQL)

GUI特性

cv.imread()

cv2.imshow()

cv2.imwrite()

cv2.waitKey()

cv2.destroyAllWindows()

import numpy as np        
#导入模块numpy并以np作为别名    numpy是python中用于科学计算的一个库
import  cv2
img = cv2.imread('./ym.jpg', cv2.IMREAD_GRAYSCALE)
cv2.imshow('result', img)

k = cv2.waitKey(0)
if k == ord("q"):
    cv2.destroyAllWindows()
elif k == ord("s"):
    cv2.imwrite("save_demo.jpg", img)
    cv2.destroyAllWindows()
    print(img, type(img))  

打开图片后 在英文输入法下 点击“q” 退出 点击“s” 保存图片到当前文件夹

[[191 191 191 … 196 196 195]
[191 191 191 … 196 196 195]
[191 191 191 … 196 196 195]

[195 195 194 … 204 204 204]
[195 195 194 … 204 204 204]
[195 195 194 … 204 204 204]] <class ‘numpy.ndarray’>

import numpy as np
import cv2
import matplotlib.pyplot as plt
#将matplotlib.pyplot导入为plt  绘制图的时候用
img = cv2.imread('./ym.jpg', 0)
plt.imshow(img, cmap='gray', interpolation="bicubic")
plt.axis("off")       #去掉坐标标尺
plt.show()            #Plot打开图片

视频

读取

显示

保存

从摄像头获取并显示视频

cv2.VideoCapture():帮助文件 视频获取函数

cv2.VideoWriter()

用摄像头捕捉视频

OpenCV为摄像头捕捉实时图像提供了一个十分简单的接口。

尝试捕捉一段视频,并将其转换为灰度视频并显示出来。

通过help()命令查看其使用:

help(cv2.VideoCapture)

为获取视频,需要创建一个VideoCapture对象。其参数可以使设备的索引号,或者是一个视频文件。设备索引号就是指定要使用的摄像头。之后,你就可以一帧一帧地捕获视频了,但是最后,别忘了停止捕获视频。

Demo:

import numpy as np
import cv2

cap = cv2.VideoCapture(0)       #对应第几个 笔记本一般就一个
if not cap.isOpened():
    print("Can't open camera")
    exit()
while True:
    #一帧一帧地捕获视频
    ret, frame = cap.read()
    if not ret:
        print("Can't receive frame(stream end?).Exiting...")
        break
    #对帧视频进行操作
    gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
    #显示结果
    cv2.imshow('frame',gray)
    if cv2.waitKey(1) & 0xff == ord('q'):
        break
print(ret, frame, type(ret), type(frame))
#释放捕获
cap.release()
cv2.destroyAllWindows()

True [[[0 0 0]
[0 0 0]
[0 0 0]

[0 0 0]
[0 0 0]
[0 0 0]]

[[0 0 0]
[0 0 0]
[0 0 0]


[0 0 0]
[0 0 0]
[0 0 0]]

[[0 0 0]
[0 0 0]
[0 0 0]

[0 0 0]
[0 0 0]
[0 0 0]]] <class ‘bool’> <class ‘numpy.ndarray’>

cap.read():返回一个布尔值

​ 如果帧读取正确,则返回True,否则,返回False。

​ 可以通过检查其返回值来查看文件是否到了结尾。

视频保存

import numpy as np
import cv2

cap = cv2.VideoCapture(0)

fourcc = cv2.VideoWriter_fourcc(*'XVID')
out = cv2.VideoWriter('output.avi', fourcc, 20.0, (640, 480))                #如果没设路径 就保存在当前路径

while(cap.isOpened()):
    ret, frame =cap.read()
    if ret == True:
        frame = cv2.flip(frame, 1)     #翻转 去掉就正常显示
# 1:水平翻转    0:垂直翻转    -1:水平垂直翻转
        out.write(frame)      #写入

        cv2.imshow('frame', frame)
        if cv2.waitKey(1) & 0xff == ord('q'):
            break


cap.release()
out.release()
cv2.destroyAllWindows()

文件中播放视频

import cv2
help(cv2.flip)

与从摄像头中捕获相同,我们只需要把设备索引号改成视频文件的名字,在播放每一帧,使用cv2.waitKey()设置适当的持续时间。如果太低,视频会播放很快。如果设置太大,视频就会播放的很慢(可用来控制视频的播放速度,通常25ms左右)

import numpy as np
import cv2

cap = cv2.VideoCapture('output.avi')

while cap.isOpened():
    ret, frame =cap.read()

    if not ret:
        print("Can't receive frame (stream end?).Exiting...")
        break
    gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
    # 显示结果
    cv2.imshow('frame', gray)
    if cv2.waitKey(1) & 0xff == ord('q'):
        break
# 释放捕获
cap.release()
cv2.destroyAllWindows()

OpenCV中的绘图函数

目标:

学会用OpenCV绘制不同宝贵的几何形状

函数:

cv2.line()

cv2.circle()

cv2.rectangle()

cv2.ellipse()

cv2.putText()

import numpy as np
import cv2

img = np.zeros((512, 512, 3), np.uint8)
cv2.line(img, (0, 0), (511, 511), (0, 255, 0), 5) #RGB
cv2.imshow('result', img)
cv2.waitKey(0)
cv2.destroyAllWindows() 

一条斜线

import numpy as np
import cv2
import matplotlib.pyplot as plt

img = np.zeros((512, 512, 3), np.uint8)
cv2.line(img, (0, 0), (511, 511), (0, 255, 0), 5)
plt.imshow(img, 'gray')
plt.show()

各种图形的参数

import numpy as np
import cv2
import matplotlib.pyplot as plt

img = np.zeros((512, 512, 3), np.uint8)
cv2.line(img, (0, 0), (511, 511), (0, 255, 0), 5)
    #线        起始位置  结束位置      颜色       线条粗细
cv2.rectangle(img, (200, 200), (511, 511), (0, 255, 0), 5)
    #矩形           起始位置      结束位置      颜色      线条粗细
cv2.circle(img, (200, 200), 60, (0, 255, 0), 5)
    #圆          圆心位置     半径  颜色        线条粗细
cv2.ellipse(img, (200, 200), (100, 50), 0, 0, 360, (0, 255, 0), 5)#椭圆       圆心位置     长轴 短轴     弧度       颜色
#   线条粗细
plt.imshow(img, 'gray')
plt.show()

不规则图形的构建

import numpy as np
import cv2
import matplotlib.pyplot as plt

img = np.zeros((512, 512, 3), np.uint8)
cv2.line(img, (0, 0), (511, 511), (0, 255, 0), 5)
cv2.rectangle(img, (200, 200), (511, 511), (0, 255, 0), 5)
cv2.circle(img, (200, 200), 60, (0, 255, 0), 5)
cv2.ellipse(img, (200, 200), (100, 50), 0, 0, 180, (0, 255, 0), -1)
pts = np.array([[50, 25],
                [100, 150],
                [210, 100],
                [250, 50]], np.int32)
pts = pts.reshape((-1, 1, 2))
cv2.polylines(img, [pts], True, (255, 255, 255))
plt.imshow(img, 'gray')
plt.show()

在图像里填加文字

import numpy as np
import cv2
import matplotlib.pyplot as plt

img = np.zeros((512, 512, 3), np.uint8)

font = cv2.FONT_HERSHEY_SIMPLEX
cv2.putText(img, 'Hello, OpenCV', (10, 500), font, 2, (255, 255, 255), 2, cv2.LINE_4)
cv2.imshow('result', img)
cv2.waitKey(0)
cv2.destroyAllWindows()
plt.imshow(img, 'gray')
plt.show()

获取并修改像素值

加载一副彩色图像

import numpy as np
import cv2
img = cv2.imread('./test/ym.jpg')

可以通过像素值的行和列坐标来访问像素值。对于BGR图像,他返回蓝色,绿色,红色值的数组。[x, y]

px = img[100, 100]
px
Out[6]: array([195, 195, 195], dtype=uint8)

[x, y, 0] [x, y, 1] [x, y, 2] 分别返回的是B、G、R对应的强度

img = cv2.imread('./test/hhh.jpg')
px = img[100, 100]
px
Out[9]: array([197, 195, 194], dtype=uint8)   #BGR的值
cl = img[100, 100, 0]       #0->B   返回Blue的像素值
cl
Out[11]: 197
type(cl)
Out[12]: numpy.uint8
cl = img[100, 100, 1]       #1->G   返回Green的像素值
cl
Out[14]: 195
cl = img[100, 100, 2]       #2->R   返回Red的像素值
cl
Out[16]: 194

修改像素

img[100,100] = [255,255,255]
img[100,100]
Out[18]: array([255, 255, 255], dtype=uint8)
    
img[100:200, 100:200] = [255, 255, 255]  #区间范围变白
cv2.imwrite("r.jpg",img)
Out[20]: True

获取图像属性

img.shape
Out[21]: (1200, 1920, 3)    #行数、列数、通道数
img.size
Out[22]: 6912000            #图片像素总数
img.dtype
Out[23]: dtype('uint8')

图像的感兴趣区域

拆分和合并图像通道

b,g,r=cv2.split(img)
img = cv2.merge((b,g,r))
b = img[:, :, 0]
b
Out[29]: 
array([[191, 191, 191, ..., 196, 196, 195],
       [191, 191, 191, ..., 196, 196, 195],
       [191, 191, 191, ..., 196, 196, 195],
       ...,
       [199, 199, 198, ..., 202, 202, 202],
       [199, 199, 198, ..., 202, 202, 202],
       [199, 199, 198, ..., 202, 202, 202]], dtype=uint8)
img[:,:,2] = 0               #把红色去掉
cv2.imwrite("r2.jpg",img)    
Out[36]: True
img[:,:,0]=0                 #把蓝色去掉
cv2.imwrite("r2.jpg",img)
Out[38]: True
img[:,:,1]=0                 #把绿色去掉
cv2.imwrite("r2.jpg",img)
Out[40]: True

github官网

pip install cmake

dlib 官网

face_recognition