Я пытаюсь вычислить гистограмму матрицы, состоящую только из одной строки. Я написал этот код в VS2015 с помощью OpenCV3.1:Ошибка OpenCV: утверждение не выполнено с использованием calcHist
//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<double>
передается от экстерна. cv::Mat stromalHistogram
заполняется правильно, потому что когда я его печатаю, все так, как я ожидал (1 строка, 1203 столбца). Но когда программа работает cv::calcHist
, я получаю следующее сообщение об ошибке:
OpenCV Error: Assertion failed (d == 2 && (sizes[0] == 1 || sizes[1] == 1 || sizes[0]*sizes[1] == 0)) in cv::_OutputArray::create, file D:\Development\lib\OpenCV3.1\opencv-master\modules\core\src\matrix.cpp, line 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.
Что я делаю неправильно?
try 'cv :: Mat hist_out;' вместо 'std :: vector hist_out;' –
sturkmen
Он работает! Благодаря! Но я не понимаю, почему это не нравится, если я пытаюсь использовать 'std :: vector'. – BugsFree