04绘制矩形
在图像上绘制矩形和圆形还是比较简单的,直接调用opencv中的rectangle和circle函数,并给出适合的参数即可。
# 导入opencv库
import cv2
# 读取图片文件dehua.jpg(文件名不能有中文),存入img
img = cv2.imread("./images/dehua.jpg")
# 坐标,(x,y)矩形左上角坐标,(w,h)矩形的宽和高
x,y,w,h=100,100,100,100
# 在图像img上绘制矩形,左上角坐标(x,y),矩形的宽和高w,h,红色外框(BGR),粗细为2
cv2.rectangle(img,(x,y,w,h),color=(0,0,255),thickness=2)
# 在图像img上绘制圆形,圆心为坐标(x+int(w/2),y+int(h/2)),半径为50,蓝色外框(BGR),粗细为2
cv2.circle(img,center=(x+int(w/2),y+int(h/2)),radius=50,color=(255,0,0),thickness=2)
#显示图像img
cv2.imshow("img",img)
while True: # 如果按下小写字母键"q",则结束循环,执行最候一句语句cv2.destroyAllWindows()
if cv2.waitKey() == ord("q"): # 否则一直循环,即等待
break
cv2.destroyAllWindows() # 释放内存
对应高中生来说,比较难理解的还是
while True: # 如果按下小写字母键"q",则结束循环,执行最候一句语句cv2.destroyAllWindows()
if cv2.waitKey() == ord("q"): # 否则一直循环,即等待
break
cv2.destroyAllWindows() # 释放内存
下面我用流程图来解释,需要对同学们理解有所帮助。
05人脸检测
用opencv进行人脸检测,一般的过程如下:
其中“将图像转换为灰度图像”、“调用人脸模型”、“获取人脸ROI”、“根据ROI进行标记”、“输出标记后的图像”这些步骤写到了函数def face_detect_demo(img)中,参数img就是读入的图像文件。
具体的代码如下:
import cv2
#自定义函数,人脸检测,参数img
def face_detect_demo(img):
# 转换成灰度图像
gray=cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
# 设置人脸分类器(即用opencv内置的人脸检测模型)
face_detect=cv2.CascadeClassifier("./venv/Lib/site-packages/cv2/data/haarcascade_frontalface_default.xml")
# 调用人脸检测函数(参数详解见最后),得到的人脸数据存放于faces中(faces是numpy.ndarray)
faces=face_detect.detectMultiScale(gray,1.1,5,0,(20,20),(100,100))
# 在每一张人脸上画框
for x,y,w,h in faces:
cv2.rectangle(img,(x,y),(x+w,y+h),color=(0,0,255),thickness=2)
# 显示画框后的图像
cv2.imshow("result",img)
img = cv2.imread("./images/DSC04753.jpg")
face_detect_demo(img) # 调用自定义人脸检测函数,参数是读取的图像img
while True: # 如果按下小写字母键"q",则结束循环,执行最候一句语句cv2.destroyAllWindows()
if cv2.waitKey() == ord("q"): # 否则一直循环,即等待
break
cv2.destroyAllWindows() # 释放内存
说明1:haarcascade_frontalface_default.xml是opencv中内置的人脸检测模型文件(即,opencv已经将人脸的特征交于计算机进行了学习,生成了一个通用性很强的人脸检测模型文件,无特殊要求的情况下可直接使用)。此文件一般位于cv2安装的目录下,大家可以自行寻找一下。
说明2:face_detect.detectMultiScale(gray,1.1,5,0,(20,20),(100,100))人脸检测函数参数说明。
detectMultiScale(image,scaleFactor,minNeighbors,flags,minSize,maxSize)
参数 | 说明 |
---|---|
image | 用opencv读取的图片(必须为灰度图像) |
scaleFactor | 每一个图像尺度中的尺度参数,默认值为1.1 |
minNeighbors | 构成检测目标(人脸)的相邻矩形的最小个数,默认值3个 |
flags | 略,默认值取0,(一般用不到,有兴趣可以自行查阅相关资料) |
minSize | 最小人脸尺寸 |
maxSize | 最大人脸尺寸 |
说明3:faces=face_detect.detectMultiScale(gray,1.1,5,0,(20,20),(100,100))返回图像中检测得到多人人脸信息,存于faces,其数据类型为numpy.ndarray(numpy中的多维数组)。
返回的多维数组faces中x,y,w,h为其中的四个一维数组(可能这样描述不准确),存储每张人脸的左上角坐标、宽度和高度,因此可以使用for语句+rectangle函数来画框标记,代码如下:
for x,y,w,h in faces:
cv2.rectangle(img,(x,y),(x+w,y+h),color=(0,0,255),thickness=2)
rectangle函数的参数比较简单,这里就不用详细的介绍了。