Класс 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
меняется на заднем плане, вызывая сильную головную боль у пиратапрограммист :)