本专栏主要介绍如果通过OpenCv-Python进行图像处理,通过原理理解OpenCv-Python的函数处理原型,在具体情况中,针对不同的图像进行不同等级的、不同方法的处理,以达到对图像进行去噪、锐化等一系列的操作。同时,希望观看本专栏的小伙伴可以理解到OpenCv进行图像处理的强大哦,如有转载,请注明出处(原文链接和作者署名),感谢各位小伙伴啦!
前文参考:
《OpenCv视觉之眼》Python图像处理一 :Opencv-python的简介及Python环境搭建
《OpenCv视觉之眼》Python图像处理二 :Opencv图像读取、显示、保存基本函数原型及使用
《OpenCv视觉之眼》Python图像处理三 :Opencv图像属性、ROI区域获取及通道处理
《OpenCv视觉之眼》Python图像处理四 :Opencv图像灰度处理的四种方法及原理
《OpenCv视觉之眼》Python图像处理五 :Opencv图像去噪处理之均值滤波、方框滤波、中值滤波和高斯滤波
《OpenCv视觉之眼》Python图像处理六 :Opencv图像傅里叶变换和傅里叶逆变换原理及实现
《OpenCv视觉之眼》Python图像处理七 :Opencv图像处理之高通滤波和低通滤波原理及构造
《OpenCv视觉之眼》Python图像处理八 :Opencv图像处理之图像阈值化处理原理及函数
《OpenCv视觉之眼》Python图像处理九 :Opencv图像形态学处理之图像腐蚀与膨胀原理及方法
《OpenCv视觉之眼》Python图像处理十 :Opencv图像形态学处理之开运算、闭运算和梯度运算原理及方法
《OpenCv视觉之眼》Python图像处理十一 :Opencv图像形态学处理之顶帽运算与黑帽运算
《OpenCv视觉之眼》Python图像处理十二 :Opencv图像轮廓提取之基于一阶导数的Roberts算法、Prewitt算法及Sobel算法
《OpenCv视觉之眼》Python图像处理十三 :Opencv图像轮廓提取之基于二阶导数的Laplacian算法和LOG算法
《OpenCv视觉之眼》Python图像处理十四 :Opencv图像轮廓提取之Scharr算法和Canny算法
《OpenCv视觉之眼》Python图像处理十五 :Opencv图像处理之图像缩放、旋转和平移原理及实现
《OpenCv视觉之眼》Python图像处理十六:Opencv项目实战之图像中的硬币检测
《OpenCv视觉之眼》Python图像处理十七:Opencv图像处理实战二之图像中的物体识别并截取
上次博客我们介绍了OpenCV图像处理实战二,图像中的物体识别,也说了以上步骤的目的是为了给神经网络模型训练打基础,抠出物体中我们需要的人脸部分,当然,改步骤还可以通过OpenCV提供的人脸检测模型来进行检测人脸然后抠出;本次博客,林君学长主要带大家了解如何通过OpenCV自带的人脸检测训练模型来进行人脸检测并标注检测的位置,一起学习吧!
OpenCV图像处理实战三:基于OpenCV训练模型的AI人脸检测
下面讲解到的函数都是我们通过OpenCV实现人脸检测将要用到的函数,接下来将会对每个函数的作用及功能进行讲解,最终实现对图片人脸的检测!
1)、OpenCV人脸检测模型即haarcascade_frontalface_default.xml模型文件,该模型是OpenCV官方训练好的人脸正脸检测模型,是OpenCV正面人脸检测级联分类器训练结果,在通过OpenCV对图像中的人脸键检测时,我们必须要用到该模型,至于该模型的训练,本次博客将暂时不做讲解,后面会讲到该模型是如何通过OpenCV分类器进行训练的
2)、本次博客的图像人脸检测利用cv2.CascadeClassifier级联分类器的haarcascade_frontalface_default.xml进行正脸人脸预测,我们可以看到介绍,是专注于正脸检测,因此,该模型的缺点就是只能对人脸正脸进行检测,优点是人脸正脸检测速度快,准确率高
3)、haarcascade_frontalface_default.xml模型位置
haarcascade_frontalface_default.xml模型在下载opencv-python的时候,会自动下载该模型,我们只需要找到python的安装路径,在安装路径下找到pip下载的库存放的位置,就可以找到该模型,如下:
1)、函数原型:result=cv2.CascadeClassifier(‘haarcascade_frontalface_default.xml’)
2)、该函数是OpenCV中人脸检测的一个级联分类器,既可以使用Haar,也可以使用LBP特征。以Haar特征分类器为基础的对象检测技术是一种非常有效的技术。它是基于机器学习且使用大量的正负样本训练得到分类器。
1)、函数原型:result1=result.detectMultiScale(image,scaleFactor,minNeighbors,minSize,minSize)
detectMultiScale()是检测人脸算法,通过该函数实现OpenCV对图像中正人脸的检测
函数原型: cv2.rectangle(image, start_point, end_point, color, thickness)
通过该函数对检测出来的人脸进行标注,标注的方式为方框。下面将会讲到另一种标注方式(圆圈)这两种标注方式选择其中一种就OK,有关更多的OpenCV图像绘图函数,请参考如下博客连接:python-opencv绘图函数
函数原型:cv2.circle(img,center,radius,color,thickness)
该函数为圆圈标注函数,在图像中通过圆圈的方式在原图像上绘制出检测出来的人脸,同样的,按照自己的需求与方框绘制函数进行选择
在进行人脸检测的开始,我们需要注意的是,人脸检测与人脸识别是有区别的,人间检测只是将图像中的人检测出来,然后将人脸进行标注;而人脸识别除了需要将图像中的人脸检测出来,还需要识别出该图像中对应的人脸是谁,同时也标注出来,这是区别,本次博客主要讲解人脸检测,对于人脸识别将在后面博客章节进行讲解,记得关注订阅哦!
1)、导入OpenCV函数库并读取人脸图像
#导入函数库
import cv2
# 读取原始图像
img = cv2.imread('peng.jpg')
2)、构建联级分类器
#构建联级分类器
face_detect = cv2.CascadeClassifier('D:\python\python1\Lib\site-packages\cv2\data\haarcascade_frontalface_default.xml')
注意联级分类器中模型的在python路径中的位置
3)、通过联级分类器的结果进行人脸检测,设置至少检测5次才算检测人脸成功
# 检查人脸 按照1.1倍放到 周围最小像素为5
face = face_detect.detectMultiScale(img, scaleFactor=1.1, minNeighbors=5)
检测到的结果face包括检测到人脸的宽和高,人脸的起始位置,以图像左上角为起点,向右为x,向左为y
4)、将检测到的人脸绘制到原图,方框或者圆圈二选一
OpenCV的图像格式都是[B、G、R]格式的,也就是[蓝、绿、红],在进行矩形或者圆框设置的时候请注意
# 绘制矩形或者圆形检测人脸
for x, y, w, h in face:
# 绘制绿色矩形人脸区域 thickness表示线的粗细
cv2.rectangle(img, pt1=(x, y), pt2=(x+w, y+h),color=[0,255,0], thickness=2)
# 绘制红色圆形人脸区域 radius表示半径
#cv2.circle(img, center=(x+w//2, y+h//2), radius=w//2, color=[0,255,0], thickness=2)
5)、显示检测出来的人脸
# 显示图片
cv2.imshow("faceDetection", img)
# 等待显示 设置任意键退出程序
cv2.waitKey(0)
1)、OpenCV图像人脸检测完整代码
'''
OpenCV人脸检测
'''
#导入函数库
import cv2
# 读取原始图像
img = cv2.imread('peng.jpg')
#构建联级分类器
face_detect = cv2.CascadeClassifier('D:\python\python1\Lib\site-packages\cv2\data\haarcascade_frontalface_default.xml')
# 检查人脸 按照1.1倍放到 周围最小像素为5
face = face_detect.detectMultiScale(img, scaleFactor=1.1, minNeighbors=5)
for x, y, w, h in face:
# 绘制绿色矩形人脸区域 thickness表示线的粗细
cv2.rectangle(img, pt1=(x, y), pt2=(x+w, y+h),color=[0,255,0], thickness=2)
# 绘制红色圆形人脸区域 radius表示半径
#cv2.circle(img, center=(x+w//2, y+h//2), radius=w//2, color=[0,255,0], thickness=2)
# 显示图片
cv2.imshow("faceDetection", img)
# 等待显示 设置任意键退出程序
cv2.waitKey(0)
2)、检测结果
3)、在博客开始的时候说到,haarcascade_frontalface_default.xml模型针对的是正脸的检测,对侧脸或者是检测不出来的,这里我们测试一下,如下侧脸检测:
由上面我们可以得出结论,彭于晏的帅连算法都能get到,因此,彭于晏是帅的,我也是帅的,哈哈!彭于晏=帅=林君学长
正确结论:haarcascade_frontalface_default.xml人脸检测模型对正脸的识别率为95%以上,而对于侧脸的识别,与侧脸凸显的人脸面积大小和光线强度有关,也就是说,你的脸越大,用的美颜强度越强,你的侧脸对机器视觉来讲也就越帅,因为机器和算法检测到你哇!
1)、视频人脸检测完整代码
'''
OpenCV视频人脸检测
'''
#导入函数库
import cv2
import numpy as np
# 加载视频
cap = cv2.VideoCapture('zhang.mp4')
#构建联级分类器
face_detect = cv2.CascadeClassifier('D:\python\python1\Lib\site-packages\cv2\data\haarcascade_frontalface_default.xml')
while True:
# 按帧读取视频片段
#flag:返回值为True和False,True和图片一起返回,当读完视频后返回False
#frame:接受返回来的图片
flag, frame = cap.read()
#判断视频是否读取完
if flag == False:
break
# 对每一帧图像进行灰度处理
gray = cv2.cvtColor(frame, code=cv2.COLOR_BGR2GRAY)
# 检查人脸 按照1.1倍放到 周围最小像素为5
face = face_detect.detectMultiScale(gray, scaleFactor=1.1, minNeighbors=5)
# 绘制矩形和圆形检测人脸
for x, y, w, h in face:
# 绘制绿色矩形人脸区域 thickness表示线的粗细
cv2.rectangle(frame, pt1=(x, y), pt2=(x+w, y+h),color=[0,255,0], thickness=2)
# 绘制红色圆形人脸区域 radius表示半径
#cv2.circle(img, center=(x+w//2, y+h//2), radius=w//2, color=[0,255,0], thickness=2)
# 显示图片
cv2.imshow('video-faceDetection',frame)
# 设置q退出键和展示频率
if ord('q') == cv2.waitKey(2):
break
# 释放窗口和摄像头
cv2.destroyAllWindows()
cap.release()
2)、视频人脸检测结果
摄像头人脸检测和视频人脸检测的代码基本一致,唯一区别就是将读取的视频改为读取笔记本默认摄像头,如下
1)、摄像头人脸检测完整代码
'''
OpenCV摄像头人脸检测
'''
#导入函数库
import cv2
import numpy as np
# 参数0为加载默认摄像头
cap = cv2.VideoCapture(0)
#构建联级分类器
face_detect = cv2.CascadeClassifier('D:\python\python1\Lib\site-packages\cv2\data\haarcascade_frontalface_default.xml')
while True:
# 读取视频片段
flag, frame = cap.read()
#判断视频是否读取完
if flag == False:
break
# 对每一帧图像进行灰度处理
gray = cv2.cvtColor(frame, code=cv2.COLOR_BGR2GRAY)
# 检查人脸 按照1.1倍放到 周围最小像素为5
face = face_detect.detectMultiScale(gray, scaleFactor=1.1, minNeighbors=5)
# 绘制矩形和圆形检测人脸
for x, y, w, h in face:
# 绘制绿色矩形人脸区域 thickness表示线的粗细
cv2.rectangle(frame, pt1=(x, y), pt2=(x+w, y+h),color=[0,255,0], thickness=2)
# 绘制红色圆形人脸区域 radius表示半径
#cv2.circle(img, center=(x+w//2, y+h//2), radius=w//2, color=[0,255,0], thickness=2)
# 显示图片
cv2.imshow('video-faceDetection',frame)
# 设置q退出键和展示频率
if ord('q') == cv2.waitKey(2):
break
# 释放窗口和摄像头
cv2.destroyAllWindows()
cap.release()
都说了 彭于晏=帅=我,非要不相信,现在相信了吧!
以上就是本次博客的全部内容,遇到问题的小伙伴记得留言评论,学长看到会为大家进行解答的,这个学长不太冷!
不经历星期一上午的崩溃,就不知道星期五下午的可贵。
陈一月的又一天编程岁月^ _ ^