2012-01-11 2 views
5

Я пытаюсь получить гистограмму от моего цвета (3-й канальный) изображений в OpenCV, но каждый раз, когда я делаю calcHist гистограмму, как это:Необработанного исключения после прочтения гистограммы (созданная с calcHist)

//int histSize[3]; 
//float hranges[2]; 
//const float* ranges[3]; 
//int channels[3]; 

ColorHistogram::ColorHistogram() 
{ 
    // Prepare arguments for a color histogram 
    histSize[0]= histSize[1]= histSize[2]= 256; 
    hranges[0]= 0.0; // BRG range 
    hranges[1]= 255.0; 
    ranges[0]= hranges; // all channels have the same range 
    ranges[1]= hranges; 
    ranges[2]= hranges; 
    channels[0]= 0; // the three channels 
    channels[1]= 1; 
    channels[2]= 2; 
} 

cv::MatND ColorHistogram::getHistogram(const cv::Mat &image) 
{ 
    cv::MatND hist; 
    // Compute histogram 
    cv::calcHist(&image, 
     1, // histogram of 1 image only 
     channels, // the channel used 
     cv::Mat(), // no mask is used 
     hist, // the resulting histogram 
     3, // it is a 3D histogram 
     histSize, // number of bins 
     ranges // pixel value range 
     ); 
    return hist; 
} 

enter image description here

Когда я пытаюсь подать результат, например, cv::minMaxLoc Я получаю необработанное исключение.

cv::Mat ColorHistogram::getHistogramImage(const cv::Mat &image){ 
    // Compute histogram first 
    cv::MatND hist = getHistogram(image); 
    // Get min and max bin values 
    double maxVal=0; 
    double minVal=0; 
    cv::minMaxLoc(hist, &minVal, &maxVal, 0, 0); 
//.... 
} 

EDIT

Я не знаю, если это важно, но я получаю эту ошибку в консоли:

OpenCV Error: Assertion failed (img.dims <= 2) in unknown function, file C:\slave\WinInstallerMegaPack\src\opencv\modules\core\src\stat.cpp, line 788

и мои image «ы dims = 2

ответ

2

Вы можете 't звоните minMaxLoc с трехмерной гистограммой (то есть hist.dims == 3 это правда), к сожалению , Ниже приведен код для minMaxLoc:

void cv::minMaxLoc(InputArray _img, double* minVal, double* maxVal, 
       Point* minLoc, Point* maxLoc, InputArray mask) 
{ 
    Mat img = _img.getMat(); 
    CV_Assert(img.dims <= 2); // <-- This is the line that is asserting for you... 

    minMaxIdx(_img, minVal, maxVal, (int*)minLoc, (int*)maxLoc, mask); 
    if(minLoc) 
     std::swap(minLoc->x, minLoc->y); 
    if(maxLoc) 
     std::swap(maxLoc->x, maxLoc->y); 
} 

Вы должны будете искать минимального и максимального значений в 3D-гистограммы вручную. Вы можете использовать NAryMatIterator, чтобы облегчить поиск. Существует пример того, как использовать это с документацией. Кроме того, вы можете найти мой ответ here.

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