Мне нужно применить функции OpenCV dilate()
а также erode()
к Mat
объект, который на самом деле является ROI в большем изображении. Mat roiImg
создается путем создания заголовка для ROI внутри исходного изображения img
:
Mat img = imread(...);
Mat roiImg = img (Rect(...));
Это список аргументов для erode()
:
void erode(InputArray src, OutputArray dst, InputArray kernel, Pointanchor=Point(-1,-1), int iterations=1, int borderType=BORDER_CONSTANT, const Scalar& borderValue=morphologyDefaultBorderValue() )
Проблема в том, что, поскольку мое входное изображение для функций разрушает / расширяет заголовок для ROI, кажется, что выбор BORDER_CONSTANT
в качестве типа границы вместе со значением границы, равным morphologyDefaultBorderValue()
не оказывает никакого влияния, и значения границ получены из исходного изображения.
Тогда я нашел это в документации для copyMakeBorder()
:
Когда исходное изображение является частью (ROI) большего изображения, функция будет пытаться использовать пиксели вне области ROI для формирования границы. Чтобы отключить эту функцию и всегда делать экстраполяцию, как будто
src
не был ROI, используйте borderType |BORDER_ISOLATED
,
Тем не мение, cv::borderInterpolate()
которая является функцией, вызываемой изнутри erode()
функция, не принимает BORDER_ISOLATED
как допустимый тип границы!
На данный момент, чтобы обойти эту проблему, я должен клонировать roiImg
, а затем позвоните erode()
, Но в идеале я не хочу накладных расходов на клонирование. Есть ли способ обойти это?
Это похоже на известная ошибка в OpenCV. Пока это не исправлено, клонирование может быть лучшим обходным путем.
Других решений пока нет …