EmguCV / OpenCV图像加法/减法

时间:2009-11-04 20:05:02

标签: c# image opencv subtraction emgucv

我正在使用EmguCV并尝试减去2张图片以创建类似于AForge .NET的MoveTowards过滤器的过滤器。

这是我在上面的URL中稍加修改的版本尝试做的事情。给定2个图像,源和叠加 - 它将源图像缓慢移向叠加层。它基于以下内容执行此操作:

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

其中result,source和overlay是images,movingFactor是0到1范围内的变化率。

当我在moveFactor等于1的代码中尝试这个时,结果看起来搞砸了(有一些像运动轨迹)。为了进一步测试,我从上面的等式中删除了movingFactor,并将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));
    }
}

但这显着减慢了处理速度。如何克服上述的加/减问题或速度问题?谢谢你的回答!

2 个答案:

答案 0 :(得分:1)

我将发布我在这里找到的答案,以防将来有人遇到同一问题。

这就是你要做的:

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

来源:EmguCV的论坛,这里是给我回复的post

答案 1 :(得分:1)

  

我会在这里发布我找到的答案,万一有人遇到过   将来也是同样的问题。

     

这就是你要做的:

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);