Я работаю над проблемой расширения в C ++ с opencv. Я запечатлел видеокадры с автостоянки, и для того, чтобы получить лучшие капли, я придумал это.
Так, что я сделал, чтобы заставить это работать? Во-первых, мне нужно было знать 2 точки (x, y) и 2 хороших расширенных размера ядра в этих точках. С помощью этой информации можно интерполировать и экстраполировать эти значения по всему изображению. Поэтому я рассчитал ROI (размер и размер ядра расширения) из этих параметров. Таким образом, каждый ROI имеет свой предопределенный размер ядра, используемый для расширения. Обратите внимание, что между двумя последовательными областями интереса (прямоугольниками opencv) нет пробела. Все работает нормально, но Есть два побочных эффекта:
Я перепробовал все, что касается изменения размеров ROI, и оставил некоторое пространство между ними, но недостатком является то, что капля между 2 отдельными областями ROI не расширена.
Итак, мои вопросы:
РЕДАКТИРОВАТЬ
Поэтому я нашел свое решение: когда вы вызываете функцию расширения opencv, нужно быть уверенным, что тот же cv :: Mat может использоваться в качестве целевого изображения. Если нет, вы будете использовать части оригинального и нового изображения. Поэтому все, что мне нужно было сделать, это включить пункт назначения cv :: Mat.
Это не отвечает на ваш первый вопрос (что вызывает эти побочные эффекты наверняка), но чтобы их устранить, вы можете сделать несколько вариантов из следующего, предполагая, что параметры ROI являются дискретными, а не непрерывными (как кажется, имеет место ).
Вы можете вычислить расширение для всего изображения, используя любой возможный размер ядра. Затем, после того, как все эти двоичные изображения вычислены, вы можете объединить их вместе, выбрав правильные образцы из правильного изображения, чтобы получить желаемое выходное изображение. Это абсолютно потратит много времени, но должно работать без артефактов.
Как только вы подтвердите, что результаты, которые вы получили выше (которые гарантированно будут иметь максимально возможное качество), вы можете начать пытаться оптимизировать. Одна вещь, которую я бы попробовал, — это расширить каждый из размеров ROI для вычисления расширения на размер размера ядра. Это может обойти артефакты, которые могут возникнуть из-за странных граничных условий.
Это наводит меня на мысль о том, что вызывает артефакты в первую очередь: всякий раз, когда вы берете конечное изображение и запускаете свертку (или морфологический оператор), вам нужно выбрать, что вы будете делать с краевыми пикселями. Обычно доступ к пикселю в точке (-4, -1) не имеет смысла, но для выполнения оператора вам придется, если ваше ядро перекрывается с ним. Если OpenCV выполняет этот отступ для ваших субрегионов, он очень легко может дать вам артефакты, которые вы видите.
Надеюсь это поможет!
Других решений пока нет …