2016-04-20 4 views
1

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

Что я делаю неправильно?

+1

try 'cv :: Mat hist_out;' вместо 'std :: vector hist_out;' – sturkmen

+0

Он работает! Благодаря! Но я не понимаю, почему это не нравится, если я пытаюсь использовать 'std :: vector'. – BugsFree

ответ

0

Измените размер мата на исходное изображение.

+0

, пожалуйста, не могли бы вы уточнить? Какой размер я должен изменить? Мой исходный «образ» представляет собой вектор длины 1203, а 'cv :: Mat stromalHistogram' имеет уже те же размеры. – BugsFree

Смежные вопросы