【问题标题】:Unhandled exception after reading histogram (created with calcHist)读取直方图后未处理的异常(使用 calcHist 创建)
【发布时间】:2012-02-08 07:52:14
【问题描述】:

我试图从 OpenCV 中的彩色(3 通道)图像中获取直方图,但每次我都像这样进行 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;
}

当我尝试将结果提供给例如 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

还有我的imagedims = 2

【问题讨论】:

    标签: c++ opencv histogram unhandled-exception


    【解决方案1】:

    很遗憾,您不能使用 3D 直方图(即 hist.dims == 3 为真)调用 minMaxLoc。下面是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

    【讨论】:

      猜你喜欢
      • 2020-06-16
      • 1970-01-01
      • 2021-01-01
      • 2018-06-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-04-26
      • 1970-01-01
      相关资源
      最近更新 更多