Необработанное исключение после чтения гистограммы (создано с помощью calcHist) - PullRequest
5 голосов
/ 12 января 2012

Я пытаюсь получить гистограмму из своего цветного (3-канального) изображения в OpenCV, но каждый раз, когда я делаю гистограмму 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);
//....
}

РЕДАКТИРОВАТЬ

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

Ошибка OpenCV: Ошибка подтверждения (img.dims <= 2) в неизвестной функции, файл C: \ slave \ WinInstallerMegaPack \ src \ opencv \ modules \ core \ src\ stat.cpp, строка 788 </p>

и мои image dims = 2

1 Ответ

2 голосов
/ 12 января 2012

К сожалению, вы не можете вызвать 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 , чтобы упростить поиск.Есть пример того, как использовать это с документацией.Также, вы можете найти мой соответствующий ответ здесь .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...