openCV+Python 数字图像处理(19)——利用Hog特征和SVM分类器进行行人检测

利用Hog特征和SVM分类器进行行人检测

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.结果展示

在这里插入图片描述
在这里插入图片描述

### 基于HOG特征SVM分类器行人检测算法 #### 理论基础 方向梯度直方图(Histogram of Oriented Gradient, HOG)是一种常用的特征描述符,在计算机视觉领域被广泛应用于目标检测任务中。其核心思想是通过计算统计图像局部区域的方向梯度直方图来构建特征向量[^1]。这些特征能够很好地捕捉到边缘信息以及形状轮廓,因此非常适合用于区分背景其他对象。 支持向量机(Support Vector Machine, SVM)则是一种监督学习模型,擅长解决二分类问题。当结合HOG特征时,SVM可以高效地区分行人与其他非行人物体[^2]。 --- #### 实现流程 以下是基于HOG特征SVM分类器实现行人检测的主要过程: 1. **提取HOG特征** 使用OpenCV库中的`cv2.HOGDescriptor()`类创建一个HOG描述符实例,并设置默认的人体检测参数。 ```python import cv2 hog = cv2.HOGDescriptor() hog.setSVMDetector(cv2.HOGDescriptor_getDefaultPeopleDetector()) ``` 上述代码初始化了一个预训练好的HOG描述符,默认加载了针对人体检测优化过的SVM权重矩阵[^3]。 2. **应用多尺度滑动窗口检测** 利用`hog.detectMultiScale()`方法执行多尺度滑动窗口扫描,从而定位可能存在的行人位置及其大小。 ```python image = cv2.imread('path_to_image.jpg') gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY) rects, weights = hog.detectMultiScale(gray, winStride=(4, 4), padding=(8, 8), scale=1.05) ``` 参数解释如下: - `winStride`: 定义每次移动窗口的距离步长。 - `padding`: 设置边界填充像素数量。 - `scale`: 控制图像金字塔缩放比例因子。 3. **绘制检测框并过滤重叠区域** 需要对返回的结果进行进一步处理,比如去除冗余矩形框或者调整置信阈值筛选高质量候选区。 ```python for (x, y, w, h) in rects: cv2.rectangle(image, (x, y), (x + w, y + h), (0, 255, 0), 2) cv2.imshow("Detected Pedestrians", image) cv2.waitKey(0) cv2.destroyAllWindows() ``` --- #### 关键技术点解析 - **HOG特征的作用** HOG特征通过对输入图片分块操作后分别统计各子区域内梯度幅值分布情况形成高维矢量表示形式,这种表达方式对于保持空间结构不变性具有重要意义。 - **SVM分类器的功能** 经过训练后的线性核函数型别的SVM能有效判别测试样本属于哪一类标签类别,即是否为人形物体。 - **性能调优建议** 可尝试调节`detectMultiScale`里的各项超参数值组合寻找最佳平衡点达到精度速度兼顾效果;另外还可以引入级联滤波机制减少误报率提升整体鲁棒性表现。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值