计算机视觉-图像处理入门(二):初试人脸检测和Face图像处理

本文涉及的产品
视觉智能开放平台,视频资源包5000点
视觉智能开放平台,图像资源包5000点
视觉智能开放平台,分割抠图1万点
简介: 计算机视觉-图像处理入门(二):初试人脸检测和Face图像处理

上一篇:图像处理入门(一):linux(ubuntu)配置Openface+测试

一、需要了解的基础知识:

   (1)使用Opencv对图片进行读写和显示操作:

              1、使用cv2.cv的LoadImage、ShowImage和SaveImage函数:

1.         import cv2.cv as cv
2. 
3.         # 读图片
4.         image=cv.LoadImage('img/image.png', cv.CV_LOAD_IMAGE_COLOR)#Load the image
5.         #Or just: image=cv.LoadImage('img/image.png')
6. 
7.         cv.NamedWindow('a_window', cv.CV_WINDOW_AUTOSIZE) #Facultative
8.         cv.ShowImage('a_window', image) #Show the image
9. 
10.         # 写图片
11.         cv.SaveImage("thumb.png", thumb)
12.         cv.WaitKey(0) #Wait for user input and quit

             2、也可以直接使用cv2的imread、imwrite和imshow函数

1.         import numpy as np
2.         import cv2
3. 
4.         img = cv2.imread('messi5.jpg',0)
5.         cv2.imshow('image',img)
6.         k = cv2.waitKey(0)
7.         if k == 27:         # wait for ESC key to exit
8.             cv2.destroyAllWindows()
9.         elif k == ord('s'): # wait for 's' key to save and exit
10.             cv2.imwrite('messigray.png',img)
11.             cv2.destroyAllWindows()
12.         imread函数还可以定义加载的mode,默认是以RGB模式处理图片:
13. 
14.         import cv2
15.         grayImage = cv2.imread('MyPic.png', cv2.CV_LOAD_IMAGE_GRAYSCALE)
16.         # 可选参数CV_LOAD_IMAGE_COLOR (BGR), CV_LOAD_IMAGE_GRAYSCALE (grayscale), CV_LOAD_IMAGE_UNCHANGED(neither)
17.         cv2.imwrite('MyPicGray.png', grayImage)

   (2)图像仿射:(引用:https://blog.csdn.net/on2way/article/details/46801063)

图像的旋转加上拉升就是图像仿射变换,仿射变化也是需要一个M矩阵就可以,但是由于仿射变换比较复杂,一般直接找很难找到这个矩阵,opencv提供了根据变换前后三个点的对应关系来自动求解M。这个函数是

M=cv2.getAffineTransform(pos1,pos2),其中两个位置就是变换前后的对应位置关系。输 出的就是仿射矩阵M。然后在使用函数cv2.warpAffine()。形象化的图如下(引用参考的)

                   f82929049f78a880ab19976af7ed330d_20150708111543898.jpg

一个例子比如:

1.     import cv2
2.     import numpy as np
3.     import matplotlib.pyplot as plt
4.     img = cv2.imread('flower.jpg')
5.     pts1 = np.float32([[50,50],[200,50],[50,200]])
6.     rows,cols = img.shape[:2]
7.     M = cv2.getAffineTransform(pts1,pts2)
8.     pts2 = np.float32([[10,100],[200,50],[100,250]])
9.     #第三个参数:变换后的图像大小
10.     plt.subplot(122)
11.     res = cv2.warpAffine(img,M,(rows,cols))
12.     plt.subplot(121)    plt.imshow(img)
13.     plt.imshow(res)

31eff9143c8b5c5a520bb39f2934d16e_20150708111625273.png

二、人脸检测和处理:

       (一)、识别最大的人脸边界框:

       (1)、使用人脸检测器:dlib自带的frontal_face_detector特征提取器:

                   使用方法:

1.              detector=dlib.get_frontal_face_detector()
2.              faces = detector(Img, 1) 
3.              或者:
4.              dets = dlib.get_frontal_face_detector(img)

             具体的原理:

【dlib代码解读】人脸检测器的训练【转】

       (二)、人脸对齐:

        (1)、利用dlib的特征预测器(和dlib的shape_predictor_68_face_landmarks.dat(68点特征预测器)),进行人脸  68点特征提取:

       dlib人脸关键点检测器训练

       使用方法:

1.     predictor = dlib.shape_predictor("../models/dlib/shape_predictor_68_face_landmarks.dat")#此处填的是路径
2.     shape = predictor(img, dets[0])

三、代码和效果:

1. import dlib
2. 
3. import cv2
4. 
5. 
6. def GetFace(imgpath='1.jpg'):
7.     #读取图片
8.     Img=cv2.imread(imgpath)
9.     if Img is None:
10.         raise Exception("Unable to load image: {}".format(imgpath))
11.     # cv2.imshow('face image',Img);
12.     # cv2.waitKey()
13.     detector = dlib.get_frontal_face_detector()
14.     facebox = detector(Img, 1)
15.     face=facebox[0]#注意facebox是一个array
16.     predictor = dlib.shape_predictor("/home/angelo/openface/demos/../models/dlib/shape_predictor_68_face_landmarks.dat")  # 此处填的是路径
17.     shape = predictor(Img, face)
18.     # 生成dlib的图像窗口
19.     win = dlib.image_window()
20.     win.clear_overlay()
21.     win.set_image(Img)
22.     # 绘制面部轮廓
23.     win.add_overlay(shape)
24.     # 绘制矩阵轮廓
25.     win.add_overlay(facebox)
26.     # 保持图像
27.     dlib.hit_enter_to_continue()
28. 
29. if __name__=="__main__":
30.     GetFace('1.jpg')

944d824139b02e6221616ff77ca740e1_70.png

图像的仿射:

1. def GetFace(imgpath='1.jpg'):
2.     #读取图片
3.     Img=cv2.imread(imgpath)
4.     if Img is None:
5.         raise Exception("Unable to load image: {}".format(imgpath))
6.     # cv2.imshow('face image',Img);
7.     # cv2.waitKey()
8.     detector = dlib.get_frontal_face_detector()
9.     facebox = detector(Img, 1)
10.     face=facebox[0]#注意facebox是一个array
11.     predictor = dlib.shape_predictor("/home/angelo/openface/demos/../models/dlib/shape_predictor_68_face_landmarks.dat")  # 此处填的是路径
12.     shape = predictor(Img, face)
13.     # 生成dlib的图像窗口
14.     win = dlib.image_window()
15.     win.clear_overlay()
16.     win.set_image(Img)
17.     # 绘制面部轮廓
18.     win.add_overlay(shape)
19.     # 绘制矩阵轮廓
20.     win.add_overlay(facebox)
21.     # 保持图像
22.     # dlib.hit_enter_to_continue()
23. 
24.     #图像仿射
25.     landmarkIndices = [39, 42, 57]
26.     npLandmarks = np.float32(list(map(lambda p: (p.x, p.y), shape.parts())))
27.     npLandmarkIndices = np.array(landmarkIndices)
28. 
29.     TEMPLATE = np.float32([
30.         (0.0792396913815, 0.339223741112), (0.0829219487236, 0.456955367943),
31.         (0.0967927109165, 0.575648016728), (0.122141515615, 0.691921601066),
32.         (0.168687863544, 0.800341263616), (0.239789390707, 0.895732504778),
33.         (0.325662452515, 0.977068762493), (0.422318282013, 1.04329000149),
34.         (0.531777802068, 1.06080371126), (0.641296298053, 1.03981924107),
35.         (0.738105872266, 0.972268833998), (0.824444363295, 0.889624082279),
36.         (0.894792677532, 0.792494155836), (0.939395486253, 0.681546643421),
37.         (0.96111933829, 0.562238253072), (0.970579841181, 0.441758925744),
38.         (0.971193274221, 0.322118743967), (0.163846223133, 0.249151738053),
39.         (0.21780354657, 0.204255863861), (0.291299351124, 0.192367318323),
40.         (0.367460241458, 0.203582210627), (0.4392945113, 0.233135599851),
41.         (0.586445962425, 0.228141644834), (0.660152671635, 0.195923841854),
42.         (0.737466449096, 0.182360984545), (0.813236546239, 0.192828009114),
43.         (0.8707571886, 0.235293377042), (0.51534533827, 0.31863546193),
44.         (0.516221448289, 0.396200446263), (0.517118861835, 0.473797687758),
45.         (0.51816430343, 0.553157797772), (0.433701156035, 0.604054457668),
46.         (0.475501237769, 0.62076344024), (0.520712933176, 0.634268222208),
47.         (0.565874114041, 0.618796581487), (0.607054002672, 0.60157671656),
48.         (0.252418718401, 0.331052263829), (0.298663015648, 0.302646354002),
49.         (0.355749724218, 0.303020650651), (0.403718978315, 0.33867711083),
50.         (0.352507175597, 0.349987615384), (0.296791759886, 0.350478978225),
51.         (0.631326076346, 0.334136672344), (0.679073381078, 0.29645404267),
52.         (0.73597236153, 0.294721285802), (0.782865376271, 0.321305281656),
53.         (0.740312274764, 0.341849376713), (0.68499850091, 0.343734332172),
54.         (0.353167761422, 0.746189164237), (0.414587777921, 0.719053835073),
55.         (0.477677654595, 0.706835892494), (0.522732900812, 0.717092275768),
56.         (0.569832064287, 0.705414478982), (0.635195811927, 0.71565572516),
57.         (0.69951672331, 0.739419187253), (0.639447159575, 0.805236879972),
58.         (0.576410514055, 0.835436670169), (0.525398405766, 0.841706377792),
59.         (0.47641545769, 0.837505914975), (0.41379548902, 0.810045601727),
60.         (0.380084785646, 0.749979603086), (0.477955996282, 0.74513234612),
61.         (0.523389793327, 0.748924302636), (0.571057789237, 0.74332894691),
62.         (0.672409137852, 0.744177032192), (0.572539621444, 0.776609286626),
63.         (0.5240106503, 0.783370783245), (0.477561227414, 0.778476346951)])
64. 
65.     TPL_MIN, TPL_MAX = np.min(TEMPLATE, axis=0), np.max(TEMPLATE, axis=0)
66.     MINMAX_TEMPLATE = (TEMPLATE - TPL_MIN) / (TPL_MAX - TPL_MIN)
67.     H = cv2.getAffineTransform(npLandmarks[npLandmarkIndices],
68.                                96 * MINMAX_TEMPLATE[npLandmarkIndices])  # 其中两个位置就是变换前后的对应位置关系。输 出的就是仿射矩阵M
69.     thumbnail = cv2.warpAffine(Img, H, (96, 96))  # 仿射函数cv2.warpAffine()接受三个参数,需要变换的原始图像,移动矩阵M
70.     # 以及变换的图像大小(这个大小如果不和原始图像大小相同,那么函数会自 动通过插值来调整像素间的关系)
71. 
72.     cv2.imshow('image', thumbnail);
73.     cv2.waitKey();

效果:96x96:

891e36f9d1e415809a1b9f05053a250f_70.png


下一篇:图像处理(三):在Windows系统里配置dlib环境并做图像批量处理


AIEarth是一个由众多领域内专家博主共同打造的学术平台,旨在建设一个拥抱智慧未来的学术殿堂!【平台地址:https://devpress.csdn.net/aiearth】 很高兴认识你!加入我们共同进步!

目录
相关文章
|
9月前
|
机器学习/深度学习 人工智能 算法
图像处理与分析:Python中的计算机视觉应用
【4月更文挑战第12天】Python在计算机视觉领域广泛应用,得益于其丰富的库(如OpenCV、Pillow、Scikit-image)和跨平台特性。图像处理基本流程包括获取、预处理、特征提取、分类识别及重建生成。示例代码展示了面部和物体检测,以及使用GAN进行图像生成。
139 2
|
5月前
|
JSON 人工智能 数据格式
AI计算机视觉笔记二十六:YOLOV8自训练关键点检测
本文档详细记录了使用YOLOv8训练关键点检测模型的过程。首先通过清华源安装YOLOv8,并验证安装。接着通过示例权重文件与测试图片`bus.jpg`演示预测流程。为准备训练数据,文档介绍了如何使用`labelme`标注工具进行关键点标注,并提供了一个Python脚本`labelme2yolo.py`将标注结果从JSON格式转换为YOLO所需的TXT格式。随后,通过Jupyter Notebook可视化标注结果确保准确性。最后,文档展示了如何组织数据集目录结构,并提供了训练与测试代码示例,包括配置文件`smoke.yaml`及训练脚本`train.py`,帮助读者完成自定义模型的训练与评估。
|
30天前
|
机器学习/深度学习 算法 数据可视化
Python的计算机视觉与图像处理
本文介绍了Python在计算机视觉和图像处理领域的应用,涵盖核心概念、算法原理、最佳实践及应用场景。重点讲解了OpenCV、NumPy、Pillow和Matplotlib等工具的使用,并通过代码实例展示了图像读写、处理和可视化的方法。实际应用包括自动驾驶、人脸识别、物体检测等。未来趋势涉及深度学习、边缘计算和量子计算,同时也讨论了数据不足、模型解释性和计算资源等挑战。
|
3月前
|
机器学习/深度学习 传感器 算法
行人闯红灯检测:基于计算机视觉与深度学习的智能交通解决方案
随着智能交通系统的发展,传统的人工交通违法判断已难以满足需求。本文介绍了一种基于计算机视觉与深度学习的行人闯红灯自动检测系统,涵盖信号灯状态检测、行人检测与跟踪、行为分析及违规判定与报警四大模块,旨在提升交通管理效率与安全性。
|
9月前
|
机器学习/深度学习 算法 计算机视觉
计算机视觉实战项目3(图像分类+目标检测+目标跟踪+姿态识别+车道线识别+车牌识别+无人机检测+A*路径规划+单目测距与测速+行人车辆计数等)
计算机视觉实战项目3(图像分类+目标检测+目标跟踪+姿态识别+车道线识别+车牌识别+无人机检测+A*路径规划+单目测距与测速+行人车辆计数等)
|
5月前
|
人工智能 计算机视觉
AI计算机视觉笔记十五:编写检测的yolov5测试代码
该文为原创文章,如需转载,请注明出处。本文作者在成功运行 `detect.py` 后,因代码难以理解而编写了一个简易测试程序,用于加载YOLOv5模型并检测图像中的对象,特别是“人”类目标。代码实现了从摄像头或图片读取帧、进行颜色转换,并利用YOLOv5进行推理,最后将检测框和置信度绘制在输出图像上,并保存为 `result.jpg`。如果缺少某些模块,可使用 `pip install` 安装。如涉及版权问题或需获取完整代码,请联系作者。
|
6月前
|
机器学习/深度学习 并行计算 算法
Ebsynth:利用图像处理和计算机视觉的视频风格转换技术工具
EbSynth 是一款基于视频风格转换技术的工具,专注于将静态艺术风格应用到视频中的每一帧,使视频具有独特的艺术效果。它利用图像处理和计算机视觉技术,将用户提供的参考图像或绘画风格转换为视频效果。
185 2
|
6月前
|
机器学习/深度学习 算法 大数据
【2023年MathorCup高校数学建模挑战赛-大数据竞赛】赛道A:基于计算机视觉的坑洼道路检测和识别 python 代码解析
本文提供了2023年MathorCup高校数学建模挑战赛大数据竞赛赛道A的解决方案,涉及基于计算机视觉的坑洼道路检测和识别任务,包括数据预处理、特征提取、模型建立、训练与评估等步骤的Python代码解析。
99 0
【2023年MathorCup高校数学建模挑战赛-大数据竞赛】赛道A:基于计算机视觉的坑洼道路检测和识别 python 代码解析
|
6月前
|
机器学习/深度学习 人工智能 数据处理
AI计算机视觉笔记一:YOLOV5疲劳驾驶行为检测
如何使用云服务器AutoDL进行深度学习模型的训练,特别是针对YOLOV5疲劳驾驶行为训练检测
|
7月前
|
存储 机器学习/深度学习 编解码
计算机视觉的基础概念与入门
之前学习了一下 Python 环境下计算机视觉方面的一些应用(主要是 OpenCV),但是对于计算机视觉方面的种种概念都是一笔带过,计算机视觉是一个很大的领域,在深入它之前 ,有必要对其中的一些基础概念有一个宏观的理解。

热门文章

最新文章