我正在制作视频帧,我想从另一帧中减去一帧以找出差异,但我不知道如何进行。我试着把我的位图帧转换成垫子,然后减去它们,但它不起作用。我使用opencv 2.4.3的mat函数。有人能告诉我怎么做吗?如果可能的话,用代码片段来解释。
我试过这样做
Bitmap myBitmap1 = BitmapFactory.decodeFile("/mnt/sdcard/Frames/mpgFrames/image001.jpg");
Bitmap myBitmap2 = BitmapFactory.decodeFile("/mnt/sdcard/Frames/mpgFrames/image002.jpg");
int width = myBitmap1.getWidth();
int height = myBitmap1.getHeight();
Mat imgToProcess1 = new Mat(height, width, CvType.CV_8UC4);
Mat imgToProcess2 = new Mat(height, width, CvType.CV_8UC4);
Mat imgToProcess = new Mat(height, width, CvType.CV_8UC4);
Utils.bitmapToMat(myBitmap1, imgToProcess1);
Utils.bitmapToMat(myBitmap2, imgToProcess1);
imgToProcess = imgToProcess1-imgToProcess2;
如果你只是从另一帧中减去一帧,你最终得到的图像只包含第二帧比第一帧值高的区域。
要获取差异,您需要使用absdiff
:
absdiff(imgToProcess1, imgToProcess2, imgToProcess);
这将给你一个实际差异的矩阵,但是如果你想要一个差异区域的掩码,你可以对结果应用一个阈值:
Mat mask(imgToProcess.rows, imgToProcess.cols, CV_8U);
cvtColor(imgToProcess, mask, CV_RGB2GRAY, 1); //your conversion specifier may vary
threshold(mask, mask, 0, 255, CV_THRESH_BINARY);
最小阈值(以上0
)可调。如果您使用的是JPEG图像,那么您可能需要将其增加一点以考虑编码噪声。