opencv的HOG描述子与sift、surf、orb描述子一样,都是属于同一类型的描述符,这种描述符可以作为SVM、ANN的模型输入数据。
如何更科学的使用HOG描述符,主要取决于HOG的参数是如何转为维度数目的。
下面是python代码对一个图像为40x40大小生成HOG描述子的过程。

import cv2
import numpy as npgray=np.ones(shape=(40,40),dtype=np.uint8)'''
比如上面这副图像的大小为40*40
定义hog描述子的第一个值是滑动窗口的大小
滑动窗口大小为16*16
每一个块大小设为8*8
块的步长为4*4 这样块移动一次会重叠
单元的大小为4*4 代表每个单元会有9个方向的梯度值
'''#定义hog描述子对象
winSize = (16,16)
blockSize = (8,8)
blockStride = (4,4)
cellSize = (4,4)
nbins =9
hog=cv2.HOGDescriptor(winSize,blockSize,blockStride,cellSize,nbins)#然后进行描述子检测
'''
然后需要定义滑动窗口的步长 以及滑动窗口如果移动到边缘不够是否需要进行填充
最好也让滑动窗口有重叠
'''
winStride = (8,8)
padding = (0,0)hog_ret=hog.compute(gray,winStride,padding)
#结果为(5184, 1)
print(hog_ret.shape)

运行这个代码,可以看到hog描述子的数目为5184,接下来将说明5184这个数目是如何得到的。
为了简化计算,将滑动窗口简写为win、块简写为b、块的步长简写为bs、单元简写为c、单元中直方图数目简写为nb。
将图像简写为img、滑动窗口步长简写为ws、填充简写为p。
各个区域的宽为w、高为h。
HOG描述子就是各个方向的颜色梯度值。
第一步讲解每个滑动窗口的HOG描述子数目。
下图中绿色区域为每一个滑动窗口,像素大小为16x16

对于每个大小为16x16的滑动窗口,我们定义的块的大小为8x8,如下图蓝色区域

因为每个单元cell的大小为4x4,这里注意块的大小必须是单元大小的整数倍。因此一个块中可以存放4个单元,计算公式为(b_w/c_w)x(b_h/c_h)=(8/4)(8/4)=2x2=4

每个单元中有9个直方图,这里说明下9个直方图代表什么意思,将每个单元四周一圈360度等分为9个角度,每个角度计算一个颜色梯度,这样就得到了单元的九个颜色梯度直方图。
因此每个块的直方图数目为:单元的数目4x9=36
一个块中有36个直方图描述子。

接下来计算一个窗口中有多少个块。
块在窗口中的移动过程如下,因为块的步长为4x4



从上面块的移动过程可以看出,这个滑动窗口中有9个块,横向有3种,纵向有3中,因此3x3=9
计算公式为((win_w-b_w)/bs_w+1)x((win_h-b_n)/bs_h+1)=
((16-8)/4+1)x((16-8)/4+1)=3x3=9

因此可以得到一个滑动窗口中的描述子的总数。
一个块中有4个单元,每个单元有9个描述子,从而得到一个块中有4x9=36个描述子。
每个滑动窗口中有9个块,因此每个滑动窗口中的描述子数目为9x36=324个。

计算了每个滑动窗口中描述子的数目,接着就需要计算一个图像中有多少个滑动窗口。
滑动窗口的步长为8x8




如图所示为滑动窗口在图像中的移动方式,由此可见从左到右有4中排列方式,从上到下有4种排列方式,一共有16种。
计算公式为((img_w-win_w)/ws_w+1)x((img_h-win_h)/ws_h+1)=
((40-16)/8+1)((40-16)/8+1)=4x4=16

由此可知,一个图像中可以存在16个滑动窗口。
由此HOG的描述子数目为16x324=5184。这个数目正好与python代码上计算的一致。

以上的参数设置是滑动窗口没有进行填充,如果把填充设置为8x8

padding = (8,8)

那么python运行计算的描述子数目为11664。
因为填充相当于把图像的四个方向左右上下均追加8个像素,因此图像的宽变为40+82=56,图像的高度也是40+8x2=56。
计算公式为((img_w+p_w
2-win_w)/ws_w+1)((img_h+p_h2-win_h)/ws_h+1)=
((40+82-16)/8+1)((40+8x2-16)/8+1)=6x6=36
填充了像素为8x8,图像就有36个滑动窗口。
36x324=11664

以上就是opencvHOG描述子维度数目计算的详细过程。

详解opencv的HOG描述子维度数目的计算原理相关推荐

  1. OpenCV-Python实战(10)——详解 OpenCV 轮廓检测

    OpenCV-Python实战(10)--详解 OpenCV 轮廓检测 0. 前言 1. 轮廓介绍 2. 轮廓检测 3. 轮廓压缩 4. 图像矩 4. 1 一些基于矩的对象特征 4.2 Hu 不变矩 ...

  2. 详解OpenCV中的Lucas Kanade稀疏光流单应追踪器

    详解OpenCV中的Lucas Kanade稀疏光流单应追踪器 1. 效果图 2. 源码 参考 这篇博客将详细介绍OpenCV中的Lucas Kanade稀疏光流单应追踪器. 光流是由物体或相机的运动 ...

  3. 详解OpenCV的椭圆曲线点坐标近似计算函数ellipse2Poly()

    详解OpenCV的椭圆曲线点坐标近似计算函数ellipse2Poly() 函数ellipse2Poly()可用于近似计算椭圆曲线的像素坐标. 而前面介绍过的函数ellipse()则是直接在图像中绘制椭 ...

  4. 详解 OpenCV 透视变换原理 及 实例

    OpenCV提供了两种图片变换的方式:仿射变换和透视变换,两者的区别很容易区分, 前者是将矩形的图片变成平行四边形 后者是将图片变成梯形 这两种变换虽然都有各自的应用场景,但在实际的图片变换中由于透视 ...

  5. NVIDIA Jetson TK1学习与开发(七):图文详解OpenCV在Jetson TK1上的安装和使用

    图文详解OpenCV在Jetson TK1上的安装和使用 本文介绍如何在Jetson TK1上安装并且使用OpenCV,并给出了示例,供大家参考学习. 1.Jetson TK1平台的OpenCV优化包 ...

  6. 详解OpenCV的函数imread()和函数imshow(),并利用它们实现对图像的读取和显示

    详解OpenCV的函数imread()和函数imshow(),并利用它们实现对图像的读取和显示 目录 01-详解函数imread():读取图像文件 02-详解函数imshow():显示图像 03-使用 ...

  7. 三维空间刚体运动5:详解SLAM中显示机器人运动轨迹及相机位姿(原理流程)

    三维空间刚体运动5:详解SLAM中显示机器人运动轨迹及相机位姿(原理流程) 一.显示运动轨迹原理讲解 二.前期准备 三.git管理子模块及克隆源代码 1.学习使用Git Submodule 2.克隆源 ...

  8. 25.消除不相关的细节/裂缝桥接(形态学 --膨胀与腐蚀详解 )--- OpenCV从零开始到图像(人脸 + 物体)识别系列

    本文作者:小嗷 微信公众号:aoxiaoji 吹比QQ群:736854977 简书链接:https://www.jianshu.com/u/45da1fbce7d0 本文你会找到以下问题的答案: 形态 ...

  9. opencv python BRIEF描述子

    BRIEF (Binary Robust Independent Elementary Features) 理论 我们知道SIFT使用128-dim向量作为描述符,由于它使用浮点数,因此基本上需要51 ...

  10. mysql explain详解_数据库mysql(1)——B+TREE索引原理

    一.B+Tree索引详解 1.什么是索引? 索引:加速查询的数据结构. 2.索引常见数据结构: #1.顺序查找: 最基本的查询算法-复杂度O(n),大数据量此算法效率糟糕. #2.二叉树查找(bina ...

最新文章

  1. python 遍历字典
  2. 面相对象的topSort和递推【ural1022/ural1017】
  3. html没有css还有用吗,如果css足够强大了,你还会用编程的方式实现去实现css已有的功能吗?_html/css_WEB-ITnose...
  4. c语言如何给阻塞函数加超时,在代码中写一个延时而不阻塞的函数方法,给大家的参考 - 单片机 - 电子工程世界-论坛 - 手机版...
  5. SoapUI简介和入门实例解析
  6. bilateral filter双边滤波器的通俗理解
  7. .NET Core amp; ASP.NET Core 1.0在Redhat峰会上正式发布
  8. 番石榴的EventBus –简单的发布者/订阅者
  9. MySQL 排序、分页查询、聚合查询
  10. httpd的一些知识点
  11. jQuery Mobile中尾部栏footer的data-*选项
  12. 机器学习(六)——PCA降维处理
  13. php基础--变量及作用域
  14. Windows jmeter安装
  15. 经济应用数学基础二 线性代数 (第四版) 赵树嫄 编| 中国人大版 课后习题答案
  16. 软件测试电脑功率,姗姗来迟的测试——功率计实测电脑耗电情况之三【i3 2100 + H61 配置篇】...
  17. 生信漫谈如何绘制蛋白序列的二级结构可视化图
  18. 达摩院高清人像美肤模型ABPN CVPR论文深入解读
  19. C# 模拟 HTTP POST请求
  20. 全网唯一:surfacepro系列用户重启或解锁后蓝牙失灵终极解决方法【绝对有效】

热门文章

  1. 1156:求π的值(函数题)
  2. 第13周 《C语言及程序设计》实践参考——定期存款利息计算器
  3. java---集合类---ArrayList类
  4. linux系统halt,Linux命令之halt - 停止系统运行但不关闭电源
  5. GoLang之浅析unsafe.Pointer与uintptr
  6. 学Linux高性能Web集群,看这本书就够了
  7. Android遥控器开发
  8. GROMOS拓扑(、坐标、轨迹、能量)相关文件解读手册第5章阅读笔记II
  9. SAP DELETE ADJACENT DUPLICATES FROM语句的深入研究及应用
  10. 带你了解电机驱动板的四大分类