0
$\begingroup$

I would like to implement a HOG descriptor in C++. I found an implementation of this code in Open Pattern Recognition Project - Histograms of Oriented Gradients (HOG) Feature Extraction.

An extract of the code follows:

//extract HOG features from a group of key points
void HOGExtractor::extract(ublas::matrix<float> &dscr_list, const 
ublas::matrix<int> &bbox_list, const IntegralHistogram &inthist)
{
    unsigned int length = _param.xgrid * _param.ygrid * inthist.dirnum();
        if (dscr_list.size1() != bbox_list.size1() || dscr_list.size2() != 
length)
    throw std::runtime_error( boost::str(
                boost::format("Allocate proper memory for dscr_list [%1% %2%] != [%3% %4%]") % dscr_list.size1() % dscr_list.size2() % dscr_list.size2() % length) );

ublas::matrix<float>::iterator1 idscr_list;
ublas::matrix<int>::const_iterator1 ibbox_list;
ublas::matrix<int>::const_iterator1 ibbox_list_end(bbox_list.end1());
ublas::vector<int> bbox_grids( _param.xgrid * _param.ygrid * 4 );
for ( ibbox_list = bbox_list.begin1(), idscr_list = dscr_list.begin1(); ibbox_list != ibbox_list_end; ++ibbox_list, ++idscr_list)
{
    ublas::matrix<int>::const_iterator2 ibbox = ibbox_list.begin();
    float x0 = std::max( *ibbox++, 0 );
    float y0 = std::max( *ibbox++, 0 );
    float x1 = std::min( *ibbox++, inthist.width() - 1 );
    float y1 = std::min( *ibbox++, inthist.height() - 1 );
    if ( x1 - x0 < _param.xgrid || y1 - y0 < _param.ygrid )
        throw std::runtime_error( boost::str(boost::format("Grid number should be less than bbox width/height [%1% %2% %3% %4%]/[%5% %6%]") % x0 % y0 % x1 % y1 % _param.xgrid % _param.ygrid) );

    float xstep = (x1 - x0 + 1) / _param.xgrid;
    float ystep = (y1 - y0 + 1) / _param.ygrid;
    for (int i = 0; i < _param.xgrid; ++i)
        for (int j = 0; j < _param.ygrid; ++j)
        {
            bbox_grids( (i * _param.ygrid + j)*4 + 0) = static_cast<int>(x0 + xstep*i);    //x0 
            bbox_grids( (i * _param.ygrid + j)*4 + 1) = static_cast<int>(y0 + ystep*j);    //y0 
            bbox_grids( (i * _param.ygrid + j)*4 + 2) = static_cast<int>(x0 + xstep*(i + 1) - 1);    //x1 
            bbox_grids( (i * _param.ygrid + j)*4 + 3) = static_cast<int>(y0 + ystep*(j + 1) - 1);    //y1 
        }
    inthist.get_hist< ublas::matrix<float>::iterator2, ublas::vector<int>::const_iterator>( idscr_list.begin(), bbox_grids.begin(), bbox_grids.end(), _param.normalize);
}

}

The "key points" it is referred to here are (if I'm not mistaken) the coordinates of the box containing an object we want to extract the features.

However, I am wondering how I can get these coordinates in a image? (Given an image and an object I want to extract the features, how can I know the values of x0, x1, y0, y1?)

$\endgroup$
2
  • $\begingroup$ So your question is, how to automatically find the position of an object in an image? You can use an object detector for this. Like Viola-Jones or Felzenszwalbs Deformable Part Models. $\endgroup$
    – sietschie
    Commented Sep 13, 2013 at 22:45
  • $\begingroup$ @sietschie Basically yes. Thank you for your answer! $\endgroup$
    – bigTree
    Commented Sep 15, 2013 at 22:36

1 Answer 1

0
$\begingroup$

HoG and like are feature extractors. In the classic pipeline there is a classifier attached to them to give a meaning to the result.

$\endgroup$

Not the answer you're looking for? Browse other questions tagged or ask your own question.