减去和合并图像以制作视频帧
Posted
技术标签:
【中文标题】减去和合并图像以制作视频帧【英文标题】:Subtract And Merging Images for Making Video Frames 【发布时间】:2013-06-11 09:00:59 【问题描述】:当你想创建一个视频文件时,它的大小很重要。 我想用 JPEG 格式保存彼此的不同帧,而不是全部帧,以减小我的新视频文件的大小。 我使用了 Aforge.Net Framework,它很好地产生了差异的结果(使用差异类)。但是当我想将帧与前一帧合并以生成当前帧时,结果不是我需要的,请参见下面的示例:
这是背景框
这是当前帧
这是差异框架
获取差异的代码:
AForge.Imaging.Filters.Difference sb = new AForge.Imaging.Filters.Difference(bmpDest);
Bitmap result = sb.Apply(bmpSrc);
result.Save(string.Format(address, 10002), ImageFormat.Jpeg);
如您所知,当我将差异帧与背景帧合并时,必须生成当前帧,但这是生成帧: 源代码是:
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 文件(用于压缩)。
感谢高级...
【问题讨论】:
您正在重塑听起来像 MJPG 的东西。为什么不使用现有的视频编解码器? 【参考方案1】:问题是差分滤波器取绝对值。结果是鼠标指针被添加回图像而不是从图像中减去,因为它在差异图像中应该是负数。我不确定如何在 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.
【讨论】:
以上是关于减去和合并图像以制作视频帧的主要内容,如果未能解决你的问题,请参考以下文章