笔者曾经做过一个项目,后期是把matlab转化为opencv,在此过程中,遇到的比较大的问题是HOG特征的提取问题,由于两个不用语言写的函数其输入参数的格式和编程思想有较多不同,在调试过程中花费了较多时间,在此作对比,并详细讲述转化方法。

基本情况:Matlab所用的函数名是hogcalculator.m。opencv所用的函数为HOGDescriptor。

目标:调整各自输入参数,使相同的输入在各自的程序中具有相同的特征向量。

1.matlab中:

先看matlab:

函数如下:

function F = hogcalculator(img, cellpw, cellph, nblockw, nblockh,nthet, overlap, isglobalinterpolate, issigned, normmethod)

给输入参数编号:

(1)img, (2)cellpw, (3)cellph, (4)nblockw, (5)nblockh, (6)nthet, (7)overlap, (8)isglobalinterpolate, (9)issigned, (10)normmethod

按顺序解释输入参数:

(1)输入图像,必须是灰度图

(2-3)cell的水平和垂直方向的像素

(4-5)滑动块的水平和垂直方向的个数。(这里是个数,注意与像素区别,如果看英文会发现作者叙述这两个参数不准确,译为中文很容易让人误解)

(6)bin的数量

(7)重叠比例。(对应HOGDescriptor中的滑块步进值)

(8)全局插值or局部插值

(9)0~180度 or 0~360度

(10)归一化模式选择。共有'none','l1','l2','l1sqrt','l2hys'五种模式

后三个参数不影响特征向量的计算结果,可以不看。

2.opencv中:

hog的函数声明如下:
CV_WRAP HOGDescriptor(Size _winSize, Size _blockSize, Size _blockStride, Size _cellSize, int _nbins, int _derivAperture=1, double _winSigma=-1,  int _histogramNormType=HOGDescriptor::L2Hys,  double _L2HysThreshold=0.2, bool _gammaCorrection=false, int _nlevels=HOGDescriptor::DEFAULT_NLEVELS)

这样看有点杂乱,举个具体的例子:

HOGDescriptor*hog=new HOG Descriptor(cvSize(16,48),cvSize(8,24),cvSize(8,8),cvSize(4,4),8);

按顺序,参数说明:

(1)窗口宽高

(2)滑动块的宽和高

(3)步进的宽高(与overlap相区分)

(4)cell的宽高

(5)bin数量

第三步:计算特征向量是否相等

当计算所得特征向量数量相当时,即意味着参数正确了,可以得到相同的结果。举例说明计算方法,带参Matlab代码如下:

imputimg = imresize(imputimg, [48 16]);%48高,16宽,别思维定势认为宽一定在前面,这里是反的imputimg = rgb2gray(imputimg);test_data=hogcalculator(imputimg,4,4,2,2,8,0,'localinterpolate','unsigned','l2hys');

按步骤详解:

(1)计算滑块的宽、高:

img的宽*高/nblockw*nblockh,即16*48/2*2=8*24

(2)计算在图像上可能存在的滑块数:

重叠率:这里的重叠率为0,意思为滑块步进值正好的滑块的宽和高。故可能的不同位置的滑块个数为16*48/8*24=2*2=4个

(若重叠率为0.5,易得步进是滑块的宽和高的一半,即为4*12,易得滑块在水平方向上有0~8、4~12、8~16共三种情况,同理的滑块在竖直方向也有三种情况。故可能的不同位置的滑块个数为9个。重叠率与滑块的水平与竖直方向的个数为既不充分也不必要条件。)

(3)计算单个滑块可含有的cell数:

每个滑块的宽高8*24/每个cell的宽高4*4=12个

(4)计算特征向量:将这些数据相乘,再乘以bins。

4*12*8=384个

举例说明计算方法,带参opencv代码如下:

resize(Img_temp,Img, Size(16,48));HOGDescriptor*hog=new HOG Descriptor(cvSize(16,48),cvSize(8,24),cvSize(8,24),cvSize(4,4),8);

多数是一样的,但是有一些地方要做区别,尽管参数具体作用相似,但是用起来却差之毫厘谬以千里:

(1)计算有多少个windows:

这里把windows的窗口直接设置为图像的宽和高,就相当于hogcalculator.m输入一张图片。1个window。(这是个hogcalculator.m里没有的功能,opencv里除了设置滑块的步进,还可以设置windows的步进)

(2)计算滑块数量。

滑块的尺寸与步进的尺寸相同,意为overlap=0。16*48/8*24=2*2=4个滑块

(步进size_stride:这里不同于overlap,overlap意味着比例,此处意为滑动块的尺寸。滑动块尺寸size_block:nblockw, nblockh意为水平方向上的个数,这意为尺寸。)

(3)计算单个滑动块包含的cell数量。8*24/4*4=2*6=12个

(4)将这些数据相乘,再乘以bins。1*4*12*8=384个

最后,调试两个的程序,并分别查看test_data和descriptor的内存,看结果是否和自己所计算的一致。根据上述方法,便可实现HOG特征提取在matlab和opencv之间的转化。

附:(1)对opencv中的HOG的源码分析http://blog.csdn.net/mounty_fsc/article/details/51095044

推荐网址:

Matlab:http://blog.csdn.net/langb2014/article/details/45674725

Opencv:http://gz-ricky.blogbus.com/logs/85326280.html

http://blog.csdn.net/yangtrees/article/details/7463431

经验之谈,关于HOG调参:对matlab和opencv作对比相关推荐

  1. 决策树实现及调参的R与python方法对比——以泰坦尼克幸存者数据为例

    R&python的决策树实现及调参 R实现 python实现 注:本文不涉及决策树理论部分,若有兴趣请移步☞https://blog.csdn.net/weixin_43462348/arti ...

  2. XGB 调参基本方法

    - xgboost 基本方法和默认参数  - 实战经验中调参方法  - 基于实例具体分析 在训练过程中主要用到两个方法:xgboost.train()和xgboost.cv(). xgboost.tr ...

  3. 谷歌大脑提出VeLO优化器,无需调参,最高比Adam快16倍!

    文 | 萧箫 发自 凹非寺 源 | 量子位 还在苦恼怎么给优化器调整更好的参数吗? 现在,谷歌大脑搞出了一个新的优化器VeLO,无需手动调整任何超参数,直接用就完事了. 与其他人工设计的如Adam.A ...

  4. matlab的支持向量机调参,支持向量机(2)-应用

    svm-pref 是康奈尔大学的 Thorsten Joachims 实现的 libsvm 和 liblinear 都是由国立台湾大学的 Chih-Jen Lin 博士开发的,本文主要考虑该实现 li ...

  5. 什么是陀螺仪的dr算法_PID控制器调参工具——DR-PID Tuning(Matlab GUI)

    介绍调参工具前,简单讨论一下PID控制器. 一.PID困境 受益于PID控制器的简单,我们在控制工程中往往首选PID. 受限于PID调参的困难,我们常常质疑PID控制器的性能平庸. 毕竟高大上的先进控 ...

  6. DL之DNN优化技术:神经网络算法简介之GD/SGD算法的简介、代码实现、代码调参之详细攻略

    DL之DNN优化技术:神经网络算法简介之GD/SGD算法的简介.代码实现.代码调参之详细攻略 目录 GD算法的简介 GD/SGD算法的代码实现 1.Matlab编程实现 GD算法的改进算法 GD算法中 ...

  7. simulink显示多个数据_如何在 Simulink 中使用 PID Tuner 进行 PID 调参?

    作者 | 安布奇责编 | 胡雪蕊出品 | CSDN(ID: CSDNnews)本文为一篇技术干货,主要讲述在Simulink如何使用PID Tuner进行PID调参. PID调参器( PIDTuner ...

  8. 如何在 Simulink 中使用 PID Tuner 进行 PID 调参?

    作者 | 安布奇 责编 | 胡雪蕊 出品 | CSDN(ID: CSDNnews)本文为一篇技术干货,主要讲述在Simulink如何使用PID Tuner进行PID调参. PID调参器( PIDTun ...

  9. 无迹卡尔曼滤波UKF_代码及调参(2)

    版权声明:本文为博主原创文章,未经博主允许不得转载.https://blog.csdn.net/weixin_38451800/article/details/85721991 从试验工况到建模离散化 ...

最新文章

  1. C++ 应用程序性能优化
  2. c++ 预处理命令 #undef用法
  3. 怎样切换git账号密码错误_git中多账号切换问题的解决方案(转)
  4. swag您的装置不支持_一件充满意境的中国风水墨粒子、电子屏风交互装置
  5. 事件处理程序中event参数的传递
  6. 与MQ通讯的完整JAVA程序
  7. 混合编程:如何用python11调用C++
  8. Java入门基础第3天《使用记事本编写运行Java程序》
  9. CCF认证 2019-03 01小中大
  10. QQ邮箱中转站文件即将过期时如何转存到微云
  11. 计算机控制技术结束语,电子商务在线 - 计算机控制技术教学改革探索与实践
  12. java中lastmodified_Java File lastModified()用法及代码示例
  13. 第八届蓝桥杯兴趣小组 JAVA暴解
  14. 《牧羊少年奇幻之旅》之水晶店老板
  15. 基于Cesium搭建单体化平台全流程简单记录
  16. angular1的分页
  17. Android——AndroidX
  18. gradient设置上下渐变_CSS3 渐变
  19. deepfakes怎么用_手把手教你使用 Deepfakes 换脸
  20. c语言tab什么意思_收藏 | C语言最全入门笔记

热门文章

  1. oracle中prad函数_R中用GDCRNATools包下载TCGA数据
  2. 数字信号处理——Python实现快速傅里叶变换FFT
  3. Python人体肤色检测
  4. 第八周翻译:《Pro SQL Server Internals, 2nd edition》CHAPTER 1 Data Storage Internals Data Pages and DataRow
  5. C++海港(port)
  6. 那些不蹭热点的硬核科技公司,却是元宇宙最好的投资对象?
  7. 无法安装64位版本的office,因为在您的PC上找到以下32位程序: 请卸载所有32位office程序,然后重试安装64位office。如果想要安装32位office,请运行32位安装程序
  8. Tomcat相关原理及性能优化
  9. c#—如何借助windows media player控件编写播放器
  10. python使用turtle绘制叠加等边三角形