00001 
00002 
00003 
00004 
00005 
00006 
00007 
00008 #include <iostream>
00009 #include "CHaarFeature.h"
00010 #include <vector>
00011 #include <opencv/cv.h>
00012 
00013 using namespace std;
00014 
00015 
00016 CHaarFeature::CHaarFeature(int r1x1,int r1x2,int r1y1,int r1y2,int r2x1,int r2x2,int r2y1,int r2y2,double r1weight,double r2weight ){
00017         this->nr_reg = 2;
00018         this->weights = vector<double>(2);
00019         this->weights[0] = r1weight;
00020         this->weights[1] = r2weight;
00021         this->regions = vector<int>(8);
00022         this->regions[0] = r1x1;
00023         this->regions[1] = r1x2;
00024         this->regions[2] = r1y1;
00025         this->regions[3] = r1y2;
00026         this->regions[4] = r2x1;
00027         this->regions[5] = r2x2;
00028         this->regions[6] = r2y1;
00029         this->regions[7] = r2y2;
00030 }
00031 
00032 
00033 CHaarFeature::CHaarFeature(int r1x1, int r1x2, int r1y1, int r1y2, int r2x1, int r2x2, int r2y1, int r2y2, int r3x1, int r3x2, int r3y1, int r3y2, double r1weight, double r2weight, double r3weight){
00034         this->nr_reg = 3;
00035         this->weights = vector<double>(3);
00036         this->weights[0] = r1weight;
00037         this->weights[1] = r2weight;
00038         this->weights[2] = r3weight;
00039         this->regions = vector<int>(12);
00040         this->regions[0] = r1x1;
00041         this->regions[1] = r1x2;
00042         this->regions[2] = r1y1;
00043         this->regions[3] = r1y2;
00044         this->regions[4] = r2x1;
00045         this->regions[5] = r2x2;
00046         this->regions[6] = r2y1;
00047         this->regions[7] = r2y2;
00048         this->regions[8] = r3x1;
00049         this->regions[9] = r3x2;
00050         this->regions[10] = r3y1;
00051         this->regions[11] = r3y2;
00052 }
00053 
00054 CHaarFeature::CHaarFeature(int r1x1, int r1x2, int r1y1, int r1y2, int r2x1, int r2x2, int r2y1, int r2y2, int r3x1, int r3x2, int r3y1, int r3y2, int r4x1, int r4x2, int r4y1, int r4y2, \
00055                          double r1weight, double r2weight, double r3weight, double r4weight){
00056         this->nr_reg = 4;
00057         this->weights = vector<double>(4);
00058         this->weights[0] = r1weight;
00059         this->weights[1] = r2weight;
00060         this->weights[2] = r3weight;
00061         this->regions = vector<int>(16);
00062         this->regions[0] = r1x1;
00063         this->regions[1] = r1x2;
00064         this->regions[2] = r1y1;
00065         this->regions[3] = r1y2;
00066         this->regions[4] = r2x1;
00067         this->regions[5] = r2x2;
00068         this->regions[6] = r2y1;
00069         this->regions[7] = r2y2;
00070         this->regions[8] = r3x1;
00071         this->regions[9] = r3x2;
00072         this->regions[10] = r3y1;
00073         this->regions[11] = r3y2;
00074         this->regions[12] = r4x1;
00075         this->regions[13] = r4x2;
00076         this->regions[14] = r4y1;
00077         this->regions[15] = r4y2;
00078 }
00079 
00080 
00081 
00082 double CHaarFeature::calcFval(cv::Mat heightsIntegral, int pos_x, int pos_y)
00083 {
00084         double retval = 0;
00085         double retval_old = 0;
00086         for (int reg = 0; reg < this->nr_reg; reg++){   
00087                 double weight = this->weights[reg];
00088                 int colx1 = pos_x + this->regions[4*reg];       
00089                 int colx2 = pos_x + this->regions[4*reg+1];     
00090                 int rowy1 = pos_y + this->regions[4*reg+2]; 
00091                 int rowy2 = pos_y + this->regions[4*reg+3]; 
00092                 retval_old = retval;
00093                 retval = retval + weight*(
00094                                 ((double*)(heightsIntegral.ptr() + heightsIntegral.step*(rowy2)))[colx2]                
00095                         +       ((double*)(heightsIntegral.ptr() + heightsIntegral.step*(rowy1-1)))[colx1-1]    
00096                         -       ((double*)(heightsIntegral.ptr() + heightsIntegral.step*(rowy2)))[colx1-1]              
00097                         -       ((double*)(heightsIntegral.ptr() + heightsIntegral.step*(rowy1-1)))[colx2]              
00098                         );
00099                 
00100         }
00101         return retval;
00102 }
00103