1.基本概念
HOG特征描述符: HOG是一个特征描述符,它基于梯度来计算直方图,能够为特征匹配和目标检测(或识别)提供重要信息。
支持向量机(SVM): SVM是一种算法,可用于对数据进行分类。该方法源于1995年Corinna Cortes和Vadimir Vapnik的论文,可从SVM论文地址链接下载。
行人检测: OpenCV提供了Hog和SVM的API,是已经训练好的分类器,不需要再进行训练。
2.代码示例
import cv2
# 判断两个矩形是否为包含关系,包含返回True,不包含返回False
def is_inside(o, i):
ox, oy, ow, oh = o
ix, iy, iw, ih = i
return ox < ix and oy < iy and ox+ow > ix+iw and oy+oh > iy+ih
# 在图片中检测到行人的位置画矩形
def draw_person(src, person_xy):
x, y, w, h = person_xy
cv2.rectangle(src, (x, y), (x+w, y+h), (0, 255, 255), 2)
img = cv2.imread('E:/PycharmProjects/openCV/pictures/ch7_persons.jpg')
cv2.imshow('img', img)
cv2.waitKey(0)
# 调用
hog = cv2.HOGDescriptor()
hog.setSVMDetector(cv2.HOGDescriptor_getDefaultPeopleDetector())
found, w = hog.detectMultiScale(img)
found_filtered = []
for ri, r in enumerate(found): # 同时列出数据下标和数据
for qi, q in enumerate(found):
if ri != qi and is_inside(r, q):
break
else:
found_filtered.append(r) # 把检测出的行人位置放在found_filtered中
for person in found_filtered:
draw_person(img, person)
cv2.imshow('detect result', img)
cv2.waitKey(0)
cv2.destroyAllWindows()
3.代码分析
# 判断两个矩形是否为包含关系,包含返回True,不包含返回False
def is_inside(o, i):
ox, oy, ow, oh = o
ix, iy, iw, ih = i
return ox < ix and oy < iy and ox+ow > ix+iw and oy+oh > iy+ih
is_inside(o,i)函数用于判断两个矩形是否为包含关系,
hog = cv2.HOGDescriptor() # 调用HOGDescriptor作为检测人的检测器
hog.setSVMDetector(cv2.HOGDescriptor_getDefaultPeopleDetector()) # 通过SVM方法实现
found, w = hog.detectMultiScale(img) # 不需要将图像转为灰度图像
HOG和SVM的API。
4.结果展示