减去并合并用于制作视频帧的图像

时间:2013-06-14 16:25:36

标签: c# opencv image-processing video-processing aforge

如果要创建视频文件,其大小非常重要。 我想用JPEG格式保存彼此之间的差异帧,而不是整个差异帧,以减小我的新视频文件的大小。 我使用了Aforge.Net Framework并且它很好地产生了差异的结果(使用差异类)。但是当我想要将帧与前一帧合并以生成当前帧时,结果不是我需要的,请参见下面的示例:

这是背景框架

This is Background Frame

这是当前帧

This is Current Frame

这是差异框架

This is Difference Frame

获得差异的代码:

AForge.Imaging.Filters.Difference sb = new AForge.Imaging.Filters.Difference(bmpDest);
            Bitmap result = sb.Apply(bmpSrc);
            result.Save(string.Format(address, 10002), ImageFormat.Jpeg);

如您所知,当我将差异帧与背景帧合并时,必须生成当前帧,但这是生成帧: enter image description here 源代码是:

 AForge.Imaging.Filters.Merge mg = new AForge.Imaging.Filters.Merge(bmpSrc);
            Bitmap results = mg.Apply(new Bitmap(string.Format(address, 10002)));
            results.Save(string.Format(address, 1004), ImageFormat.Jpeg);

所以,问题很明显。 这些是屏幕截图,但是当我想使用此操作进行相机捕捉时,结果也存在很多问题。

我也使用openCV进行此操作,但是在提到差异的指令中,首先我应该将帧转换为灰度图像,我也有合并图像的问题,如AForge。

最后我使用了我的算法,但差异图像的大小比原始图像大!

我该怎么做这个操作? 请记住,图像的大小非常重要,我想保存JPEG文件(用于压缩)。

感谢高级......

1 个答案:

答案 0 :(得分:0)

问题在于差异过滤器采用绝对值。结果是鼠标指针被添加回图像而不是从图像中减去,因为它在差异图像中应该是负的。我不知道如何在AForge.net中解决这个问题。

在opencv中,您可以使用支持有符号数的图像类型来解决此问题,例如CV_16SC3而不是RGB / BGR图像的默认CV_8UC3。您不应该使用CV_8SC3,因为8位中的一个将用于符号,因此+/- 127之外的像素值将被钳位。

void imageDelta(cv::Mat& A, cv::Mat& B, cv::Mat& deltaOut)
{
    //Calculate B - A, preserving sign
    A.convertTo(A, CV_16SC3);
    B.convertTo(B, CV_16SC3);
    cv::subtract(B, A, deltaOut); //deltaOut is a CV_16SC3
}

void reconstructB(cv::Mat& A, cv::Mat& delta, cv::Mat& BOut)
{
   //Calculate B = A + delta
   cv::add(A, delta, BOut);
   BOut.convertTo(BOut, CV_8UC3); //Safe to go back to CV_8UC3 now.
}