Вопрос

Я использую EmguCV и пытаюсь вычесть 2 изображения, чтобы создать фильтр, подобный AForge.net's Двигайтесь вперед Фильтр.

Это то, что пытается сделать моя слегка измененная версия с приведенного выше URL-адреса.Учитывая 2 изображения, исходное и наложенное - он медленно перемещает исходное изображение в направлении наложения.Он делает это на основе следующего:

result = source + movementFactor * (overlay - source);

где результат, источник и наложение - изображения, а movementFactor - скорость изменения в диапазоне от 0 до 1.

Когда я попробовал это в коде с movementFactor, равным 1, результаты выглядели испорченными (было что-то вроде следа движения).Чтобы протестировать это дальше, я удалил movementFactor из приведенного выше уравнения и сделал result = source + overlay - source .Я ожидал увидеть в результате наложенное изображение, что я и сделал, но вместе с одной областью изображения, которая мигала.

Я предполагаю, что интенсивность пикселей обрезается в верхней или нижней границах, когда происходит сложение / вычитание.

С помощью этого я могу добиться того, чего хочу:

for (int i = 0; i < src.Height; i++)
{
    for (int j = 0; j < src.Width; j++)
    {
        res[i, j] = new Gray(src[i, j].Intensity + movementFactor * (ovr[i, j].Intensity - src[i, j].Intensity));
    }
}

Но это значительно замедляет обработку.Как я могу преодолеть проблему сложения / вычитания или проблему скорости с помощью вышеперечисленного?Спасибо за ваши ответы!

Это было полезно?

Решение

Я опубликую ответ, который нашел здесь, на случай, если кто-то столкнется с той же проблемой в будущем.

Вот как бы вы это сделали:

Image<Gray,Byte> result = new Image<Gray,Byte>(source.Size);
CvInvoke.cvAddWeighted(source, 1.0-movementFactor, overlay, movementFactor, 0.0, result);

Источник:Форумы EmguCV, вот почта это дало мне ответ

Другие советы

Я отправлю ответ, который я нашел здесь, в случае кто-то перебегает тот же вопрос в будущем.

Вот как бы вы это сделали:

Image<Gray,Byte> result = new Image<Gray,Byte>(source.Size);
CvInvoke.cvAddWeighted(source, 1.0-movementFactor, overlay, movementFactor, 0.0, result); 

Источник:Форумы EmguCV, вот сообщение , которое дало мне ответ

Обратите внимание, что для этого существует более чистый синтаксис:

var result = frame.AddWeighted(1.0 - movementFactor, overlay, movementFactor, 0.0);
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top