Класс cv :: Mat имеет недостатки в дизайне?

Я много работаю с интерфейсом OpenCV C ++ и разработал ряд классов, которые используют Mat 'как частные ресурсы.

Недавно я забеспокоился о классе Mat, поскольку он всегда использует данные изображения в качестве общего ресурса, если я не вызываю явно клон.Даже если я напишуconst Mat Я могу'Убедитесь, что визуальные данные не изменятся позже снаружи.

Поэтому мне нужно клонировать, чтобы обеспечить инкапсуляцию. Но проблема с необходимостью явного клонирования мата состоит в том, что он часто является ненужным и дорогим. С другой стороны, я понимаю, что потребность в общих imagedata возникает из-за селекторов roi и возможности написать что-то вроде этого:.Mat m_small = m_big(my_roi)

Мои вопросы:

1.)Разве класс cv :: Mat не должен быть довольно лениво клонирован? Таким образом, пользователь не увидит Mat 's как обработчики общих ресурсов извне. Не должен ли пользователь явно создавать экземпляр класса, называемого чем-то вродеSharedMat когда нужны реальные общие изображения?

2.) Есть ли у вас какие-либолучшая стратегия, чем всегда клонирование в случае cv :: Mat в качестве частного ресурса для класса?

ОБНОВИТЬ: "ты не используешьMat::clone() если вы не планируете изменять данные. " (Вадим Писаревский)

У этой идеи есть проблема. Рассмотрим ситуацию, когда у вас есть этот класс:

class Res_handler{
public:
  const Mat emit_mat(){ return m_treasure; } // I argue you are compelled to clone here.
private:
  Mat m_treasure;
};

Если вы этого не сделаетеclone в этом случае вы можете написать

Mat m_pirate = res_handler.emit_mat(); m_pirate = Scalar(0,0,0);

что вызывает полное затемнение вm_treasure внутриres_handler через общие данные изображения междуm_pirate а такжеm_treasure, :) Чтобы избежать случайной модификации внутреннего,m_treasureвам нужноclone Это.

С другой стороны, это решение также имеет недостатки:

const Mat m_pirate = res_handler.emit_mat(); 

так какm_treasure может быть изменен, так что содержаниеm_pirate меняется на заднем плане, вызывая сильную головную боль у пиратапрограммист :)

Ответы на вопрос(4)

Ваш ответ на вопрос