多通道背投断言(j < nimages)
Multi-Channel Back Projection Assertion (j < nimages)
尝试在三通道图像上进行直方图反向投影会导致以下错误:
OpenCV Error: Assertion failed (j <./modules/imgproc/src/histogram.cpp,第148行
失败的代码:
cv::Mat _refImage; //contains reference image of type CV_8UC3
cv::Mat output; //contains image data of type CV_8UC3
int histSize[] = {16, 16, 16};
int channels[] = {0, 1, 2};
const float hRange[] = {0.f, 256.f};
const float* ranges[] = {hRange, hRange, hRange};
int nChannels = 3;
cv::Mat hist;
cv::calcHist(&_refImage, 1, channels, cv::noArray(), hist, nChannels, histSize, ranges);
cv::calcBackProject(&output, 1, channels, hist, output, ranges); //This line causes assertion failure
在单通道图像上运行几乎相同的代码是有效的。根据文档,还支持多通道图像。为什么这段代码不能工作?
简短的回答是cv::calcBackProject()
不支持就地操作,尽管文档中没有提到这一点。
深入研究OpenCV源代码会得到以下代码片段:
void calcBackProject( const Mat* images, int nimages, const int* channels,
InputArray _hist, OutputArray _backProject,
const float** ranges, double scale, bool uniform )
{
//Some code...
_backProject.create( images[0].size(), images[0].depth() );
Mat backProject = _backProject.getMat();
assert(backProject.type() == CV_8UC1);
histPrepareImages( images, nimages, channels, backProject, dims, hist.size, ranges,
uniform, ptrs, deltas, imsize, uniranges );
//More code...
}
引起问题的行是:
_backProject.create( images[0].size(), images[0].depth() );
,如果源和目标相同,则重新分配输入的图像数据。images[0].depth()
的计算结果为CV_8U
,在数值上等同于类型说明符CV_8UC1
。因此,数据被创建为单通道图像。
这是一个问题,因为histPrepareImages
仍然期望输入图像有3个通道,并且抛出断言。
幸运的是,解决方法很简单。输出参数必须与输入参数不同,如下所示:
cv::Mat result;
cv::calcBackProject(&output, 1, channels, hist, result, ranges);
相关文章:
- 请解释这句话(cout<<1+int((a<b)^((b-a)&1) )<<endl
- 呼叫运营商<<临时
- 如何防止clang格式在流运算符调用之间添加换行符<<
- <<操作员在下面的行中工作
- 如何显式调用运算符<<
- 模板操作员&lt;未打电话
- C / CUDA中的模板方法是3个角括号(&lt;&lt;&lt;)
- C - 创建矢量&lt; vector&lt; double&gt;&gt;矩阵具有分配而不是inizializ
- 错误:调用"std::vector<:vector<int>>::p ush_back(std::vector<std::__cxx11::basic_string<
- C 建造者Clang STD :: Sill,找不到超载的操作员&lt;
- 为什么STD :: MAP需要操作员&lt;以及我如何写一个
- 为什么“操作员”需要const但不是为“运营商&lt;”
- 为什么将此对向量&lt; map&lt; int,int&gt;&gt;中的地图进行更新.失败
- C :对矢量进行排序&lt; struct&gt;(结构有2个整数)基于结构的整数之一
- 明确的专业化“ CheckIntmap&lt;&gt;”实例化
- 什么是模板&lt;&gt;inline bla bla
- 左角支架解释为操作员&lt;而不是模板参数
- 编辑C Qlist&lt; object*&gt; gt;QML代码和一些QML警告中的模型
- 超载操作员&lt;&lt; - 必须是二进制操作员
- 没有匹配的“运营商&lt;&lt;”