OpenCV 错误:使用 calcHist 断言失败

Posted

技术标签:

【中文标题】OpenCV 错误:使用 calcHist 断言失败【英文标题】:OpenCV Error: Assertion failed using calcHist 【发布时间】:2016-04-20 08:56:54 【问题描述】:

我正在尝试计算仅由一行组成的矩阵的直方图。我使用 OpenCV3.1 在 VS2015 中编写了这段代码:

//Create matrix stromal pop
cv::Mat stromalHistogram(1, i_stromalIID.size(), CV_32F);
float * ref_ptr = stromalHistogram.ptr<float>(0);
std::copy(i_stromalIID.begin(),
          i_stromalIID.end(),
          stdext::checked_array_iterator<float *>(ref_ptr, stromalHistogram.cols));

#ifdef _DEBUG
std::cout << "Matrix =" << std::endl << stromalHistogram << std::endl;
#endif

// calculate histogram for stromal pop
auto  itRangesRef     = std::minmax_element(i_stromalIID.begin(), i_stromalIID.end());
float stromalRanges[] = *itRangesRef.first, *itRangesRef.second;
const float *      rangesRef[] = stromalRanges;
const int          channel     = 0;
const int          histSize    = 256;
std::vector<float> hist_out;
cv::calcHist(
  &stromalHistogram, 1, &channel, cv::Mat(), hist_out, 1, &histSize, rangesRef);

i_stromalIID 是从外部传递的std::vector&lt;double&gt;cv::Mat stromalHistogram 填充正确,因为当我打印它时,一切都如我所料(1 行,1203 列)。但是当程序运行cv::calcHist时,我收到以下错误:

OpenCV 错误:断言失败 (d == 2 && (sizes[0] == 1 || sizes[1] == 1 || size[0]*sizes[1] == 0)) 在 cv::_OutputArray::create,文件 D:\Development\lib\OpenCV3.1\opencv-master\modules\core\src\matrix.cpp, 第2363行

我尝试调试OpenCV代码,尝试做的时候报错在cv::calcHist

void cv::calcHist( const Mat* images, int nimages, const int* channels,
                   InputArray _mask, OutputArray _hist, int dims, const int* histSize,
                   const float** ranges, bool uniform, bool accumulate )

      .....
      .....

      _hist.create(dims, histSize, CV_32F);

然后在matrix.cpp里面调用:

void _OutputArray::create(int d, const int* sizes, int mtype, int i,
                          bool allowTransposed, int fixedDepthMask) const

      .....
      .....

      if( k == STD_VECTOR || k == STD_VECTOR_VECTOR )
      
        CV_Assert( d == 2 && (sizes[0] == 1 || sizes[1] == 1 || sizes[0]*sizes[1] == 0) );
        .....
        .....
      

这个断言失败了,因为在我的例子中d 等于 1。

我做错了什么?

【问题讨论】:

试试cv::Mat hist_out;而不是std::vector&lt;float&gt; hist_out; 有效!谢谢!但我不明白为什么它不喜欢我尝试使用std::vector 【参考方案1】:

将 Mat 大小更改为源图像。

【讨论】:

拜托,你能更准确一点吗?我应该改变哪个尺寸?我的源“图像”是一个长度为 1203 的向量,cv::Mat stromalHistogram 已经具有相同的维度。【参考方案2】:

您将 dims 作为 1 传递,并且断言它是 2 失败。

【讨论】:

以上是关于OpenCV 错误:使用 calcHist 断言失败的主要内容,如果未能解决你的问题,请参考以下文章

当我想使用 calcHist 生成图片特定范围内的像素数时,断言失败

Opencv中直方图函数calcHist

使用 OpenCV 官方 Matlab 绑定 cv.calcHist

为啥使用 cv2.calcHist 总是有一个错误“返回 NULL 而没有设置错误”

opencv2 直方图之calchist函数使用(转)

使用Python,OpenCV计算图像直方图(cv2.calcHist)