Странная ошибка в OpenCV - добавление всех матриц внутри вектора‹Mat›

Я работаю над проектом. У меня есть vector<Mat> cache. Каким-то образом я получаю странную ошибку (я уже проверил другие решения, но это все еще происходит), когда я запускаю этот модуль:

if(cache.size() == 10)
{
  Mat sum_template = Mat::zeros(cache.at(1).size(), cache.at(1).type());

  for(int i=0; i<cache.size(); i++)
  {
    sum_template += cache.at(i);
    imshow("sum_template", sum_template);   waitKey();
  }
}

Что я хочу сделать, так это добавить каждый из Mat внутри cache в sum_template. Но в строке sum_template += cache.at(i); появляется следующая ошибка:

Операция не является ни "массивом операции массива" (где массивы имеют одинаковый размер и одинаковое количество каналов), ни "массивом операции скаляра", ни "скалярной операцией массива" в функции arithm_op

Я просто добавляю Mats. Я проверил, cache.at(i) правильно отображается перед сбоем, а также показывает размер кеша 10. Есть идеи, что здесь не так??

ИЗМЕНИТЬ кеш представляет собой вектор матриц, аналогичный матрице результатов R как показано здесь


person learner    schedule 05.04.2014    source источник
comment
что произойдет, если вы напишете это как sum_template = sum_template + cache.at(i)?   -  person Massa    schedule 05.04.2014
comment
Правильно ли копируется Mat? Это должно быть, если он должен быть кандидатом в std::vector и не показывать проблемы при выполнении различных операций std::vector.   -  person PaulMcKenzie    schedule 05.04.2014
comment
@Massa Та же ошибка. Это просто сокращение, которое я пробовал для того, что вы предложили...   -  person learner    schedule 05.04.2014
comment
@PaulMcKenzie можно скопировать? как?   -  person learner    schedule 05.04.2014
comment
Он должен иметь Mat::operator=(Mat&) для копирования...   -  person Massa    schedule 05.04.2014
comment
@PaulMcKenzie Я этого не понимаю. Не могли бы вы немного объяснить? ИЛИ, может быть, отразить это в моем коде?   -  person learner    schedule 05.04.2014
comment
См. этот ответ здесь: stackoverflow .com/questions/22841696/ Здесь говорится о другом классе (PolyTree), но шаблонный код в решении определяет, может ли этот тип безопасно использоваться вектором. Вектор будет делать копии, и если ваш тип имеет конструктор копирования, который работает неправильно, то это ваша проблема.   -  person PaulMcKenzie    schedule 05.04.2014
comment
@PaulMcKenzie, пожалуйста, также проверьте редактирование   -  person learner    schedule 05.04.2014
comment
@learner - Да, я вижу вашу ссылку, но не имеет значения, что класс делает на высоком уровне. Мы хотим знать, может ли ваш класс безопасно создавать копии объектов. Неважно, какое приложение лежит в основе. Пожалуйста, посмотрите ссылку в моем предыдущем комментарии - проходит ли эта крошечная программа main() тест на возможность копирования? Замените PolyTree на Mat или любой другой класс. Поверьте, это надежный тест, хоть и маленький.   -  person PaulMcKenzie    schedule 05.04.2014
comment
Ну, можешь наполнить Мэт ценностями? Если да, то заполните один значениями и запустите тест, на который я ссылался. Это все. Замените PolyTree на Mat, заполните его значениями и выполните копии точно так же, как последние 3 строки в этой программе. Если ваша программа не вылетает из строя и не происходит повреждения, то мы проходим этот тест. Окончательный тест, тем не менее, состоит в том, чтобы пройти через ваш класс, найти указатели и посмотреть, как они используются. В конце концов, может оказаться, что Mat можно безопасно копировать, но нам нужно устранить причину вашей проблемы, заключающуюся в плохом типе, помещенном в вектор.   -  person PaulMcKenzie    schedule 05.04.2014
comment
@PaulMcKenzie Я заполнил P1 некоторым imread(). И его хорошо скопировали в других. Они отображаются правильно. Что теперь?   -  person learner    schedule 05.04.2014
comment
@learner - Так ты запустил мою программу? Если нет, пожалуйста, сделайте это. Он также проверяет уничтожение и проверяет его, вызывая деструктор для 3 объектов, которые были скопированы и назначены.   -  person PaulMcKenzie    schedule 05.04.2014
comment
@PaulMcKenzie Я проверил это. Я поместил изображение внутрь P1, используя функцию imread(). И все они показали одно и то же изображение.   -  person learner    schedule 05.04.2014
comment
Вы не совсем понимаете. Мне все равно, что делает ваша программа. Я хочу знать, будет ли std::vector правильно работать с вашим типом. Мы знаем это только в том случае, если нет побочных эффектов от копирования, присвоения и уничтожения, и это то, что делает та программа, с которой я связался.   -  person PaulMcKenzie    schedule 05.04.2014
comment
@PaulMcKenzie Видишь ли, я заполнил P1, как ты и предложил. И его хорошо копируют, как я могу проверить с помощью imshow(). Я не могу понять, что вы подразумеваете. Я проверил код, который вы прислали.   -  person learner    schedule 05.04.2014
comment
Ok. Это все, что я хочу знать. Причина, по которой мне нужно было это знать, заключается в том, что при выполнении программы все может казаться хорошо, но когда эта надоедливая штука, называемая деструктором, начинает вызываться для скопированных объектов, все начинает рушиться. частей.   -  person PaulMcKenzie    schedule 05.04.2014
comment
@PaulMcKenzie окей ... честно говоря, я все еще пытаюсь понять, что ты сказал. Но что теперь? есть ли решение? почему так происходит?   -  person learner    schedule 05.04.2014
comment
Я говорю, что std::vector копирует и уничтожает ваши объекты в различных операциях, которые выполняет вектор. Это то, что тестировала эта программа, копируя и уничтожение в простой программе. Вы только наблюдали, были ли изображения в порядке, но это не верный тест, чтобы точно знать, можно ли безопасно копировать и уничтожать этот объект.   -  person PaulMcKenzie    schedule 05.04.2014
comment
@PaulMcKenzie, я только что проверил: и cache.at(i).type(), и sum_template.type() дают один и тот же тип 5, но cache.at(i).size() равен [ 100 x 100], тогда как sum_template.size() равно [101 x 101]. это полезно? только cache.at(0).size() имеет значение [100x100] для всех остальных i это [101x101], а также для sub_templates это [101x101]   -  person learner    schedule 05.04.2014
comment
@PaulMcKenzie ДА!!! Я ПОНЯЛ!!! ЭТО РАЗМЕР БЫЛ ПРОБЛЕМОЙ!!! Не знаю почему, но самое первое изображение в кеше имеет размер 100x100, а все остальные - 101x101. Сначала я изменил размер до 101x101, и он работает !!! УУУУУУУУ!!! БОЛЬШОЕ СПАСИБО ЗА ВАШЕ ВРЕМЯ И ВКЛАДЫ. НО Я ИНТЕРЕСУЮСЬ, ПОЧЕМУ ТАКОЙ РАЗМЕР ПРОИЗОШЕЛ!!!   -  person learner    schedule 05.04.2014
comment
@learner - Поскольку я не знаю, как вы заполнили вектор кеша, не могу сказать вам причину. Вы должны начать снова с пустого вектора, установить кеш (0) и посмотреть, как заполняются кеш (1), кеш (2) и т. д. Если они заполняются с использованием прямого копирования, которое вызывает пользовательский оператор копирования (или компилятор сгенерировал его, если пользовательский оператор не существует), то оператор копирования неисправен или должен быть (пере) написан для безопасной обработки копирования.   -  person PaulMcKenzie    schedule 05.04.2014
comment
cache.size() (i‹cache.size()... обрабатывается как 1D, Mat::zeros(cache.at(1).size()... как 2D.   -  person Vlad    schedule 05.04.2014