如何在android中使用opencv从另一帧中减去一帧



我正在制作视频帧,我想从另一帧中减去一帧以找出差异,但我不知道如何进行。我试着把我的位图帧转换成垫子,然后减去它们,但它不起作用。我使用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图像,那么您可能需要将其增加一点以考虑编码噪声。

相关内容

  • 没有找到相关文章

最新更新