订阅
纠错
加入自媒体

使用Python+OpenCV进行图像处理(三)

2019-05-05 14:49
磐创AI
关注

我们的英雄在哪?

接下来让我们使用上述级联分类器实现漫威英雄面部检测--惊奇队长面部检测。

001 (15)

我们只须使用图像中的一部分即头部部分。首先,获取惊奇队长脸部周围感兴趣区域;然后把图像转换成灰度图。之所以只使用一个通道,是因为我们只对特征的像素值强度变化感兴趣。

cap_mavl = cv2.imread('images/captin_marvel.jpg')

# Find the region of interest

roi = cap_mavl[50:350, 200:550]

roi = cv2.cvtColor(roi, cv2.COLOR_BGR2GRAY)

plt.imshow(roi, cmap = 'gray')

通过下方代码使用Haar级联分类器。

# Load Cascade filter 

face_cascade = cv2.CascadeClassifier('haarcascades/haarcascade_frontalface_default.xml')

接下来,我们将创建一个函数来检测人脸并在目标区域周围绘制一个矩形。为了检测人脸,我们可以使用上面加载的分类器face_cascade的. detectmulitscale()方法。它返回指定区域的四个点所以我们在那个位置画一个矩形。scaleFactor是一个参数,表示在每个图像尺度上图像大小减少了多少,minNeighbors表示每个候选矩形应该训练多少个邻居。现在我们把这个函数应用到图像上,看看结果。

# Create the face detecting function 

def detect_face(img):

img_2 = img.copy()

face_rects = face_cascade.detectMultiScale(img_copy,
                                              scaleFactor = 1.1,
                                              minNeighbors = 3)

for (x, y, w, h) in face_rects:

cv2.rectangle(img_2, (x, y), (x+w, y+h), (255, 255, 255), 3)

return img_2

# Detect the face

roi_detected = detect_face(roi)

plt.imshow(roi_detected, cmap = 'gray')

plt.axis('off')

正如看到的那样,haar级联分类器取得了不错的人脸检测效果。接下来,让我们尝试检测含有多张人脸的图片。

# Load the image file and convert the color mode

avengers = cv2.imread('images/avengers.jpg')

avengers = cv2.cvtColor(avengers, cv2.COLOR_BGR2GRAY)

# Detect the face and plot the result

detected_avengers = detect_face(avengers)

display(detected_avengers, cmap = 'gray')

很明显检测结果不完全准确。出现了错误捕捉“非人脸”目标以及丢失了部分“真实人脸”。有趣的是,它成功地探测到了蜘蛛侠,却把美国队长和黑寡妇的手误当成了眼睛。通常在人脸图像凸显出更加清晰的五官时,可以得到更好的人脸检测结果。

尝试检测自己的脸

接下来介绍使用网络摄像头检测人脸的实现方法。类似上方的实现方式。代码如下方所示。可以通过ESC按键终止退出检测。

import cv2

import numpy as np

# Step 1. Define detect function

face_cascade = cv2.CascadeClassifier('haarcascades/haarcascade_frontalface_default.xml')

def detect_face(img):

img_copy = img.copy()

face_rects = face_cascade.detectMultiScale(img_copy)

for (x, y, w, h) in face_rects:

cv2.rectangle(img_copy, (x, y), (x+w, y+h), (255, 255, 255), 3)

return img_copy

# Step 2. Call the cam

cap = cv2.VideoCapture(0) 

while True: 

ret, frame = cap.read(0) 

frame = detect_face(frame)

cv2.imshow('Video Face Detection', frame) 

c = cv2.waitKey(1) 

if c == 27:
       break 

cap.release() 

cv2.destroyAllWindows()

总结

本篇介绍了传统的边缘检测、角点检测以及人脸检测方法。下篇将介绍轮廓检测技术等。敬请期待。

<上一页  1  2  3  
声明: 本文由入驻维科号的作者撰写,观点仅代表作者本人,不代表OFweek立场。如有侵权或其他问题,请联系举报。

发表评论

0条评论,0人参与

请输入评论内容...

请输入评论/评论长度6~500个字

您提交的评论过于频繁,请输入验证码继续

暂无评论

暂无评论

人工智能 猎头职位 更多
扫码关注公众号
OFweek人工智能网
获取更多精彩内容
文章纠错
x
*文字标题:
*纠错内容:
联系邮箱:
*验 证 码:

粤公网安备 44030502002758号