• 【图像处理】计算Haar特征个数


    http://blog.csdn.net/xiaowei_cqu/article/details/8216109

    Haar特征/矩形特征

    Haar特征本身并不复杂,就是用图中黑色矩形所有像素值的和减去白色矩形所有像素值的和。

    看过Rainer Lienhart文章的人知道,Rainer Lienhart在文章中给出了计算特定图像面积内Haar特征个数公式。小女才拙,到最后也没推出那个公式来,还望看明白的大牛留言指教~

    Haar特征个数计算

    Rainer Lienhart计算Haar特征个数的公式:


    其中,为图片大小,为矩形特征大小,表示矩形特征在水平和垂直方向的能放大的最大比例系数。

    对于45°的rotated特征(如1(c)和1(d)),w,h表示如下图所示:

    其计算公式为:

    *论文中没有说明,个人认为此处除了Z,XY值也有变化:

    下面是我理解的计算过程~

    首先有两点要清楚:

    1、对于某特定大小的特征,在窗口内滑动计算。
          也就是如图1(a)特征大小为2*1,对于24*24的图像。水平可滑动23步,垂直滑动24步,所以共有23*24个特征。

    2、对于一个特征,特征本身沿水平、竖直方向分别缩放。
          还看特征1(a),特征大小为2*1,则延水平方向可放大为:4*1,6*1,8*1,…,24*1;竖直方向可放大为:2*1,2*2,2*3,…,2*24。即每个特征有XY种放大方式。(!放大的矩形特征并限制保持2:1的比例!)


    清楚这两点,就很容易写出计算特征个数的代码:

    [cpp] view plain copy
     
    1. int getHaarCount(int W,int H,int w,int h){  
    2.     int X=W/w;  
    3.     int Y=H/h;  
    4.     int count=0;  
    5.   
    6.     //放大Haar特征到 iw*jh  
    7.     for (int i=1;i<=X;i++)  
    8.         for(int j=1;j<=Y;j++)  
    9.             //滑动iw*jh矩形,遍历图像计算每个位置Haar特征  
    10.             for(int x=1;x<=W-i*w+1;x++)  
    11.                 for(int y=1;y<=H-j*h+1;y++)  
    12.                     count++;  
    13.   
    14.     return count;  
    15. }  

    对于45°特征,由于Rainer Lienhart定义的w,h与原矩阵含义不同(参见第一幅图),即实际滑动的矩阵框为(h+w)*(w+h)。

    所以只要用如下方式调用原函数:

    [cpp] view plain copy
     
    1. getHaarCount(W,H,h+w,w+h);  


    当然如果你喜欢写代码,也可以写个新的函数:

    [cpp] view plain copy
     
    1. int getRotatedHaarCount(int W,int H,int w,int h){  
    2.     int X=W/(w+h);//计算新的X  
    3.     int Y=H/(w+h);//计算新的Y  
    4.     int count=0;  
    5.     for (int i=1;i<=X;i++)  
    6.         for(int j=1;j<=Y;j++)  
    7.             //注意这里滑动窗口边界变化  
    8.             for(int x=1;x<=W-i*(w+h)+1;x++)  
    9.                 for(int y=1;y<=H-j*(w+h)+1;y++)  
    10.                     count++;  
    11.   
    12.     return count;  
    13. }  

    计算在24*24的图片中,几种特征的个数为:

    可以看到和论文用公式计算得到的值是一致的~

    另一种递推计算方法:

    特征个数虽然很大,但很有规律,不用程序用笔也很容易推出递推公式。

    如1(a)和1(b)特征递推为:(12^2)*(1+2+...+24)=43,200

    具体参见此贴:Re: [OpenCV] Re: Number of haar features

  • 相关阅读:
    MSXML 解析XML文件
    内存泄露
    TCHAR CHAR LPTSTR LPCTSTR
    union过代理存根
    jquery placeholder
    SASS 编译后去掉缓存文件和map文件
    js冒泡排序
    android 下滤镜效果的实现
    ViewPagger介绍
    android下实现对wifi连接的监听
  • 原文地址:https://www.cnblogs.com/jukan/p/7803884.html
Copyright © 2020-2023  润新知