对象检测是计算机视觉领域的一个重要任务,它涉及到从图像或视频中识别出特定的对象。本文将介绍一种经典的对象检测方法——Haar Cascade算法,探讨其背后的原理、实现步骤以及在现实世界中的应用。从面部识别到车辆检测,Haar Cascade和OpenCV在计算机视觉领域的革命性作用不容小觑。无论是初学者还是专家,本文都将为提供在项目中利用对象检测潜力所需的技能。
对象检测,即在图像中识别自定义对象的过程,可以通过多种技术实现,本文将使用Haar Cascade这一最简便的方法。Haar Cascade算法能够检测图像中的物体,无论其在图像中的大小和位置如何。该算法并不复杂,且能够实时运行。可以训练Haar-cascade检测器来检测各种对象,如汽车、自行车、建筑、水果等。
Haar Cascade是一种能够在图像中检测物体的算法,它使用级联窗口,并尝试在每个窗口中计算特征并分类判断是否为物体。对于其工作原理的更多细节,可以参考。Haar特征样本在窗口大小的图像中遍历以计算和匹配特征。Haar Cascade作为一个分类器,它将正样本(检测到的物体的一部分)和负样本(不包含物体的部分)进行分类。Haar Cascade快速且能够很好地在实时环境中工作,但它不如现代对象检测技术准确,且可能会预测出许多假阳性。尽管如此,它简单易实现,且所需的计算能力较低。
OpenCV库管理着一个包含所有流行Haar Cascade的,可以用于以下对象的检测:
Haar Cascade是XML文件,可以在OpenCV中用于检测指定的对象。
如果在OpenCV提供的预训练库中找到了目标对象的Haar-cascade,需要下载预训练的XML文件。使用pip安装器可以轻松安装OpenCV。
!pip install opencv-python
或者
!pip install opencv-contrib-python
使用cv2.CascadeClassifier函数加载任何Haar-cascade XML文件。
face_detector=cv2.CascadeClassifier('haarcascade_frontalface_default.xml')
一旦在OpenCV中加载了级联,就可以调用检测器函数。
results = face_detector.detectMultiScale(gray_img, scaleFactor=1.05, minNeighbors=5, minSize=(30, 30), flags=cv2.CASCADE_SCALE_IMAGE)
结果列出了检测到的物体周围的边界框坐标(x, y, w, h)。运行代码以查看输出。
Haar Cascade可以在单个帧中以层次方式检测多个对象。假设需要检测人的面部和眼睛,需要按照以下步骤进行:
以下是实现这一过程的代码示例:
import numpy as np
import cv2
face_detector=cv2.CascadeClassifier('haarcascade_frontalface_default.xml')
eye_detector = cv2.CascadeClassifier('haarcascade_eye.xml')
img = cv2.imread('.jpg')
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
faces = face_detector.detectMultiScale(gray, 1.3, 5)
for (x,y,w,h) in faces:
img = cv2.rectangle(img,(x,y),(x+w,y+h),(255,0,0),2)
roi_gray = gray[y:y+h, x:x+w]
roi_color = img[y:y+h, x:x+w]
eyes = eye_detector.detectMultiScale(roi_gray)
for (ex,ey,ew,eh) in eyes:
cv2.rectangle(roi_color,(ex,ey),(ex+ew,ey+eh),(0,255,0),2)
cv2.imshow('img',img)
cv2.waitKey(0)
cv2.destroyAllWindows()
到目前为止,已经处理了单个图像。Haar-cascade算法轻量级,并且可以与完美的帧速率在实时环境中工作。将使用OpenCV视频摄像头输入来实时获取图像(视频)。
import cv2
face_detector = cv2.CascadeClassifier('haarcascade_frontalface_default.xml')
eye_dectector = cv2.CascadeClassifier('haarcascade_eye.xml')
cap = cv2.VideoCapture(0)
while cap.isOpened():
_, frame = cap.read()
gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
faces = face_detector.detectMultiScale(gray,1.1, 4 )
for (x,y, w, h) in faces:
cv2.rectangle(frame, pt1 = (x,y),pt2 = (x+w, y+h), color = (255,0,0),thickness = 3)
roi_gray = gray[y:y+h,x:x+w]
roi_color = frame[y:y+h, x:x+w]
eyes = eye_dectector.detectMultiScale(roi_gray)
for (ex,ey, ew, eh) in eyes:
cv2.rectangle(roi_color, (ex,ey), (ex+ew, ey+eh), (0,255,0), 5)
cv2.imshow("window", frame)
if cv2.waitKey(1) & 0xFF == ord('q'):
break
frame.release()