本节有课程ppt,百度网盘

image.pngimage.png

知识点记录:

  • 人脸检测face detection 与 人脸识别 face recognization 不一致
  • 人脸识别的另一个应用:makeup化妆,不仅需要人脸检测还需要关键点检测
  • 其余典型的应用:手势识别,AI换脸,活体检测,等等。

image.pngimage.png

1. computer version的由来

image.pngimage.png
image.png
算法:越快越好,越准越好。
计算机视觉:自动化的完成图像的采集、处理、保存、显示过程,像视觉一样看到并决策。
灰度图,0/1(视觉上是全黑), 0-255(黑白图)
彩色图:RGB 3个channel
image.pngimage.png
opencv 以BGR读取矩阵,要将图片咋转换成RGB。 cv2.cvtColor(image, cv2.COLOR_BGR2RGB)

在矩阵中对图像进行操作

image.pngimage.png
image.png
如果第三列变成tx,ty。 就是缩放带平移。
image.pngimage.png

2.代码实战

2.1 添加水印

  1. from PIL import Image
  2. import os
  3. import sys
  4. #创建底图
  5. target = Image.new('RGBA', (300, 300), (0, 0, 0, 0))
  6. #打开头像
  7. #nike_image = Image.open("./image1.png")
  8. nike_image = Image.open("./0.png")
  9. nike_image = nike_image.resize((300, 300))
  10. #打开装饰
  11. #hnu_image = Image.open("./hnu.png")
  12. hnu_image = Image.open("./water1.png")
  13. hnu_image = hnu_image.resize((300, 300))
  14. # 分离透明通道
  15. #r,g,b,a = hnu_image.split()
  16. r,g,b = hnu_image.split()
  17. # 将头像贴到底图
  18. nike_image.convert("RGBA")
  19. target.paste(nike_image, (0,0))
  20. #将装饰贴到底图
  21. hnu_image.convert("RGBA")
  22. target.paste(hnu_image,(0,0), mask=r*0.1)
  23. # 保存图片
  24. target.save("f.png")

out: image.png

2.2 生成矩阵的形式生成图片

  1. import numpy as np
  2. import matplotlib.pyplot as plt
  3. %matplotlib inline
  4. img0 = np.array([[1,1,1],[0,1,0],[1,0,0]])
  5. # color map
  6. plt.imshow(img0,cmap = 'gray' )
  7. # color map # https://blog.csdn.net/zhang_cherry/article/details/88951259
  8. #plt.imshow(img0)

image.png

2.3 从摄像头采集图像

  1. cap = cv2.VideoCapture(0)
  2. print(cap.isOpened())
  3. return_value,frame=cap.read()
  4. print(frame.shape)
  5. print(return_value)
  6. #plt.imshow(frame)
  7. plt.imshow( cv2.cvtColor(frame,cv2.COLOR_BGR2RGB))
  8. # 等价于plt.imshow( cv2.cvtColor(frame,4)) 还有cv2.COLOR_RGB2BGR
  9. # 关闭capture, 成功输出图片后,电脑的摄像头会一直保持开启状态
  10. cap.release()

直接调用摄像头,输出图像。 需要连续调用时,可以在外层加个循环。

2.3 从文件读取图像数据

  1. img = cv2.imread("lena.jpg")
  2. #cv2.cvtColor()
  3. #cv2.COLOR_BGR2RGB
  4. img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
  5. plt.imshow(img)
  6. # 黑白图像
  7. img_gray=cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
  8. plt.imshow(img_gray,cmap='gray')
  9. # RGB2HSV img_hsv=cv2.cvtColor(img_BGR,cv2.COLOR_BGR2HSV)
  1. ## 二值化
  2. import cv2
  3. img = cv2.imread('lena.jpg')
  4. plt.imshow(cv2.threshold(img,128,200,cv2.THRESH_BINARY))
  5. ## 图像的放大与缩小
  6. img =cv2.resize(img,(1000,2000))
  7. ## 剪裁
  8. img_roi =img[100:300,0:200]
  9. ## 移动
  10. #M = np.float32([[2,-0.1,300],[0.2,1,400]]) 根据理论公式,进行旋转,平移,透视等任务
  11. theta = -30/180*3.14
  12. M = np.float32([[np.cos(theta),-np.sin(theta),100],[np.sin(theta),np.cos(theta),400]])
  13. plt.imshow(img)
  14. print(img.shape)
  15. img_1=cv2.warpAffine(img,M,(1300,2200))
  16. plt.imshow(img_1)
  17. #print(img_1[200+50,300])
  18. ## 图像的旋转变换与拉伸变换
  19. pts1 = np.float32([[50,50],[200,50],[50,200]])
  20. pts2 = np.float32([[10,50],[200,50],[100,250]])
  21. M = cv2.getAffineTransform(pts1,pts2)
  22. print(M)
  23. #180/3.14
  24. theta=-0.4
  25. #M = np.float32([[np.cos(theta),-np.sin(theta),0],[np.sin(theta),np.cos(theta),0]])
  26. #M = np.float32([[0.1,1,0],[0,0.1,0]])
  27. # 变换矩阵,平移,斜切,旋转
  28. # affine
  29. cols=800
  30. rows=800
  31. dst = cv2.warpAffine(img,M,(cols*2,rows*3))
  32. plt.imshow(dst)
  33. pts1 = np.float32([[56,65],[368,52],[28,387],[389,390]])
  34. pts2 = np.float32([[0,0],[100,-20],[0,30],[300,300]])
  35. M = cv2.getPerspectiveTransform(pts1,pts2)
  36. print(M)
  37. # 拉伸变换后者透视变换
  38. dst = cv2.warpPerspective(img,M,(300,300))
  39. plt.imshow(dst)

image.pngimage.pngimage.pngimage.pngimage.png

2.4 图像的模糊和锐化

  1. img = cv2.imread("lena.jpg")
  2. img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
  3. img_gb= cv2.GaussianBlur(img, (139, 139), 4, 0) # 高斯模糊
  4. plt.imshow(img_gb)
  5. # GaussianBlur(src,ksize,sigmaX [,dst [,sigmaY [,borderType]]]

image.pngimage.png
前为高斯模糊图,后为原图。

  1. img_cn=cv2.Canny(img,30,150)
  2. plt.imshow(img_cn)

image.pngimage.png