hog特征提取python代码_opencv-python 入门实战:传统方法Hog+svm实现目标检测

写在前面

相信大家学过语言的朋友们都有这样经验:学习编程语言最快的方式就是直接看别人的源代码。别人代码看通了,基本上这门编程语言也就入门了。

文末将附上我自己写的代码,比较初级,适合入门学习。大佬看到这就可以不必接着看下去了

目标检测实战思路:

对于一张有待检测目标(人头)的图片,我们先用滑动窗口选取图片上的某一块区域,利用opencv提取该区域的hog特征,将特征向量输入svm中,利用svm进行分类,判别是否是待检测目标(人头)。

本文附的代码是人头检测代码,就以人头检测为例

1、Hog特征提取

方向梯度直方图(hog)也不是什么新的算法了,而且在opencv中,也有对应的函数可以直接调用。但是搞研究嘛,就简单了解一下什么是hog特征。

方向梯度直方图(Histogram of Oriented Gradient, HOG) 是一种局部区域描述子,常被用来进行目标检测。hog描述子适合应用在局部目标的表象和形状能够被梯度或边缘方向密度分布很好地描述的图像中。

获取HOG描述子的算法如下:

1、彩色图片灰度化(灰度化之后才有直方图等操作);

2、使用直方图均衡和伽马校正法对输入图像进行颜色空间归一化,调节图像的对比度,降低图像局部的阴影和光照变化所造成的影响,同时可以抑制噪音的干扰;

3、将图像按照一定的规则划分为多个块,称为block(如图2-2)。块之间允许包含相同的像素点,一般使用滑动窗口的方式获取图像中的块;

4、把每个块分成多个细胞单元,称为cells;

5、在每个细胞单元中计算其中每个像素点的梯度(包括大小和方向),统计细胞单元的梯度直方图;

6、把图像中所有细胞单元的特征直方图串联起来便得到图像的HOG描述子。

2、svm训练

1 数据集构造

首先要给数据打上标签。我用的方法是在有人头的图片上截取人头部分,然后构造人头正样本数据集和没有人头的负样本数据集(样本数量相当最好)。

2 设置svm参数

有了上面的数据集,我们根据第1 节的hog特征提取方法就获得了svm的训练对象,hog特征向量。下面就是设置一些基本参数,丢svm里面训练就是了。具体参数我代码里都给出来了,你可以自己调节一些参数,了解他们的特性。

下面这个链接的116-121页就是关于svm的使用例子,只要将里面的词袋特征提取改为hog即可(不知道为啥,知乎好物推荐搜不到这本书。。。。)。

第二本书就是经典的opencv学习工具书了,不多bb,平时时候图书馆都根本借不到。opencv3 计算机视觉:python语言实现​m.tb.cn

3、目标检测

上面已经训练好了svm,下面就是到了重头戏了——目标检测。

在开头我就说过,利用滑动窗口取区域,然后对取出的区域用svm去predict,为真就代表是人头,那么就在图片对应画方框标注出来就好了。若同一个人头有多个框,则利用非最大抑制取最好的框,详见代码。

向画方框和图片标注这些基本函数,opencv都内置了调用就好cv2.rectangle(img, (int(x),int(y)),(int(x2), int(y2)),(0, 255, 0), 1)

cv2.putText(img, "%f" % score, (int(x),int(y)), font, 1, (0, 255, 0)

4、完整项目链接和代码详解hunting777/hog-svm​github.com

代码详解请点击CSDN-专业IT技术社区-登录​blog.csdn.net

我在跑的时候是用的之前自己做的数据集,github上无法上传大批量图片,如果有需要就私信我吧。

码字不易,不喜勿喷!

  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
很好,下面我来为你介绍一下 OpenCV-Python 实现目标检测的过程。 OpenCV-Python 是一款基于 Python 的计算机视觉库,它可以帮助我们完成各种图像处理任务,包括图像的读取、处理、显示等。在使用它进行目标检测时,我们可以使用传统方法 HOG+SVM 实现HOG(Histogram of Oriented Gradient)特征是一种常用的图像特征,它可以描述图像中的边缘、角点等信息,其中梯度方向直方图是 HOG 特征的核心部分。在目标检测中,我们需要先提取出图像中的 HOG 特征,然后再使用 SVM(Support Vector Machine)进行分类,从而实现目标检测。 下面是一个简单的 OpenCV-Python 实现目标检测的示例代码: ```python import cv2 # 加载 SVM 分类器 svm = cv2.ml.SVM_load('svm.xml') # 加载测试图片 img = cv2.imread('test.jpg') # 创建 HOG 描述符 hog = cv2.HOGDescriptor() # 设置 SVM 分类器 hog.setSVMDetector(svm) # 检测目标并绘制矩形框 rects, weights = hog.detectMultiScale(img, winStride=(8, 8), padding=(32, 32), scale=1.05) for (x, y, w, h) in rects: cv2.rectangle(img, (x, y), (x + w, y + h), (0, 255, 0), 2) # 显示结果 cv2.imshow('result', img) cv2.waitKey(0) cv2.destroyAllWindows() ``` 在代码中,我们首先加载了训练好的 SVM 分类器,并加载了测试图片。然后创建了 HOG 描述符,并设置 SVM 分类器。最后使用 detectMultiScale 函数检测目标,并绘制矩形框,最终在窗口中显示检测结果。 当然,这仅仅是一个简单的示例,实际的目标检测过程还需要根据具体的应用场景进行调整和优化。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值