2014-11-24 4 views
0

Для того, чтобы понять функции гистограммы ориентированных градиентов (HOG), предложенные Dalal и Triggs, я решил жестко кодировать ее без использования HOGDescriptor от openCV. Вот некоторые соответствующий код, который я пытался реализовать HOG:Вычислительная гистограмма ориентированных градиентов

void hog::hog_process(Mat &direction) // direction is the gradient direction matrix 
{ 

    Size blockSize(8,8); 
    Size cellSize(4,4); 

    vector<Mat> block; 
    Size s = direction.size(); 
    Mat cell_eightPx; 
    Mat cell_fourPx; 

// Essentially split the image into 8 by 8 cells. HOG processing of each block should be essiantially here. 
// the 8 by 8 cells are then split again into 4 by 4 cells 
    for(int col = 0; col < direction.rows; col += blockSize.height) 
    { 
     for(int row = 0; row < direction.cols; row += blockSize.width) 
     { 
      Rect rect= Rect(row, col,blockSize.width,blockSize.height); 

      cell_eightPx = Mat(direction,rect); // Get a 8 by 8 cell from the gradient direction matrix. 

      //**********COMPUTE 9 bin gradient direction histogram of the 8 by 8 cell here !!! **** 
      for(int i = 0; i < cell_eightPx.rows; i += cellSize.height) 
      { 
       for(int j = 0; j < cell_eightPx.cols; j += cellSize.width) 
       { 
        Rect rect_fourPx = Rect(i,j,cellSize.width,cellSize.height); // 4 by 4 rectangle size 
        cell_fourPx = Mat(cell_eightPx,rect_fourPx); // create a 4 by 4 cell from gradient direction matrix (cell_eightPx) 
        gradientHist(cell_fourPx); // Calculate gradient histogram of the 4 by 4 cell. (Function call) 
        cell_fourPx.deallocate(); // clear the cell. 
       } 
      } 
     } 
    } 
} 

Вот функция gradientHist() для вычисления 9 бен гистограмму для функций HOG:

void hog::gradientHist(Mat &cell_fourPx) 
{ 
    Mat hist; 
    ofstream feature("Hist_Values.csv",std::ofstream::app); 

    // create a 9 bin histogram with range from 0 t0 180 for HOG descriptors. 
    int histSize = 9; 
    float range[] = {0,180}; 
    const float *histRange = {range}; 
    bool uniform = true; 
    bool accumulate = false; 

    calcHist(&cell_fourPx, 1, 0,Mat(),hist, 1, &histSize, &histRange, uniform, accumulate); //Calculate the 9 bin histogram. 

    normalize(hist, hist, 0, 0, NORM_MINMAX, -1, Mat()); 


    for(int i = 0; i < histSize; i++) 
    { 
     feature << hist.at<float>(i) << ","; // Output the value of HOG to a csv file    
    } 
} 

Однако OpenCV говорит мне :

unsupported format or combination of formats() in calcHist, file....line 1219....histogram.cpp:1219: 
error(-210) in function calcHist 

Возможно, я что-то упустил? Любые предложения/идеи будут оценены. Спасибо заранее ...

ответ

1

Третий параметр channels в вызове cv::calcHist(...) не должен быть 0 (что делает его нулевым указателем). OpenCV ожидает здесь указателя на массив индексов, представляющих интересующие каналы.

Так как вы хотите использовать первые каналы (индекс 0), код должен выглядеть следующим образом:

int channels[] = { 0 }; 
calcHist(&cell_fourPx, 1, channels, ...); 
+0

Hi sansuiso, однако его до сих пор дает ту же ошибку. Я не уверен, какой параметр вызывает его. – tarmizi

+0

Можете ли вы добавить тесты в свой код, чтобы проверить, не является ли ваше входное изображение непустым и набрало CV_8U или CV_32F? Это поможет устранить возможные причины ошибок. – sansuiso

Смежные вопросы