本节有课程ppt,百度网盘
知识点记录:
- 人脸检测face detection 与 人脸识别 face recognization 不一致
- 人脸识别的另一个应用:makeup化妆,不仅需要人脸检测还需要关键点检测
- 其余典型的应用:手势识别,AI换脸,活体检测,等等。
1. computer version的由来
算法:越快越好,越准越好。
计算机视觉:自动化的完成图像的采集、处理、保存、显示过程,像视觉一样看到并决策。
灰度图,0/1(视觉上是全黑), 0-255(黑白图)
彩色图:RGB 3个channel
opencv 以BGR读取矩阵,要将图片咋转换成RGB。 cv2.cvtColor(image, cv2.COLOR_BGR2RGB)
在矩阵中对图像进行操作
如果第三列变成tx,ty。 就是缩放带平移。
2.代码实战
2.1 添加水印
from PIL import Image
import os
import sys
#创建底图
target = Image.new('RGBA', (300, 300), (0, 0, 0, 0))
#打开头像
#nike_image = Image.open("./image1.png")
nike_image = Image.open("./0.png")
nike_image = nike_image.resize((300, 300))
#打开装饰
#hnu_image = Image.open("./hnu.png")
hnu_image = Image.open("./water1.png")
hnu_image = hnu_image.resize((300, 300))
# 分离透明通道
#r,g,b,a = hnu_image.split()
r,g,b = hnu_image.split()
# 将头像贴到底图
nike_image.convert("RGBA")
target.paste(nike_image, (0,0))
#将装饰贴到底图
hnu_image.convert("RGBA")
target.paste(hnu_image,(0,0), mask=r*0.1)
# 保存图片
target.save("f.png")
2.2 生成矩阵的形式生成图片
import numpy as np
import matplotlib.pyplot as plt
%matplotlib inline
img0 = np.array([[1,1,1],[0,1,0],[1,0,0]])
# color map
plt.imshow(img0,cmap = 'gray' )
# color map # https://blog.csdn.net/zhang_cherry/article/details/88951259
#plt.imshow(img0)
2.3 从摄像头采集图像
cap = cv2.VideoCapture(0)
print(cap.isOpened())
return_value,frame=cap.read()
print(frame.shape)
print(return_value)
#plt.imshow(frame)
plt.imshow( cv2.cvtColor(frame,cv2.COLOR_BGR2RGB))
# 等价于plt.imshow( cv2.cvtColor(frame,4)) 还有cv2.COLOR_RGB2BGR
# 关闭capture, 成功输出图片后,电脑的摄像头会一直保持开启状态
cap.release()
直接调用摄像头,输出图像。 需要连续调用时,可以在外层加个循环。
2.3 从文件读取图像数据
img = cv2.imread("lena.jpg")
#cv2.cvtColor()
#cv2.COLOR_BGR2RGB
img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
plt.imshow(img)
# 黑白图像
img_gray=cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
plt.imshow(img_gray,cmap='gray')
# RGB2HSV img_hsv=cv2.cvtColor(img_BGR,cv2.COLOR_BGR2HSV)
## 二值化
import cv2
img = cv2.imread('lena.jpg')
plt.imshow(cv2.threshold(img,128,200,cv2.THRESH_BINARY))
## 图像的放大与缩小
img =cv2.resize(img,(1000,2000))
## 剪裁
img_roi =img[100:300,0:200]
## 移动
#M = np.float32([[2,-0.1,300],[0.2,1,400]]) 根据理论公式,进行旋转,平移,透视等任务
theta = -30/180*3.14
M = np.float32([[np.cos(theta),-np.sin(theta),100],[np.sin(theta),np.cos(theta),400]])
plt.imshow(img)
print(img.shape)
img_1=cv2.warpAffine(img,M,(1300,2200))
plt.imshow(img_1)
#print(img_1[200+50,300])
## 图像的旋转变换与拉伸变换
pts1 = np.float32([[50,50],[200,50],[50,200]])
pts2 = np.float32([[10,50],[200,50],[100,250]])
M = cv2.getAffineTransform(pts1,pts2)
print(M)
#180/3.14
theta=-0.4
#M = np.float32([[np.cos(theta),-np.sin(theta),0],[np.sin(theta),np.cos(theta),0]])
#M = np.float32([[0.1,1,0],[0,0.1,0]])
# 变换矩阵,平移,斜切,旋转
# affine
cols=800
rows=800
dst = cv2.warpAffine(img,M,(cols*2,rows*3))
plt.imshow(dst)
pts1 = np.float32([[56,65],[368,52],[28,387],[389,390]])
pts2 = np.float32([[0,0],[100,-20],[0,30],[300,300]])
M = cv2.getPerspectiveTransform(pts1,pts2)
print(M)
# 拉伸变换后者透视变换
dst = cv2.warpPerspective(img,M,(300,300))
plt.imshow(dst)
2.4 图像的模糊和锐化
img = cv2.imread("lena.jpg")
img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
img_gb= cv2.GaussianBlur(img, (139, 139), 4, 0) # 高斯模糊
plt.imshow(img_gb)
# GaussianBlur(src,ksize,sigmaX [,dst [,sigmaY [,borderType]]]
前为高斯模糊图,后为原图。
img_cn=cv2.Canny(img,30,150)
plt.imshow(img_cn)