python6
人脸识别基本过程:
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
上一篇: python6流程控制
下一篇: Python-循环&分支