【问题标题】:how to subtract one frame from another using opencv in android如何在android中使用opencv从另一帧中减去一帧
【发布时间】:2024-01-08 00:11:01
【问题描述】:

我正在处理视频的帧,我想从其他帧中减去一帧以找出差异,但我不知道如何继续。我尝试将我的位图帧转换为垫子,然后减去它们,但它不起作用。我正在将 opencv 2.4.3 用于 mat 函数。谁能告诉我该怎么做。如果可能的话,用代码 sn-ps 解释一下。

我试过这样的

     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;

【问题讨论】:

  • 你遇到this problem了吗?你可以直接用imread读取文件吗?
  • 当我在这里时,我建议您可能想要使用absdiff,而不是仅仅减去矩阵。
  • 谢谢先生..我尝试了 absdiff() 及其现在的工作... +1 :)
  • 太棒了!我会给出一个答案,以防万一其他人遇到这个问题。

标签: android opencv frame subtraction


【解决方案1】:

如果你只是从另一帧中减去一个帧,你最终会得到一个只包含第二帧比第一帧值更高的区域的图像。

要获得差异,您需要使用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 图像,那么您可能需要稍微增加它以考虑编码噪声。

【讨论】:

  • 就像指针一样。噪声和掩蔽:使用 blur() 或 GaussianBlur() 过滤可能会改善您的结果,而不仅仅是增加阈值。在其他问题和当前研究中还可以找到更多涉及的方法。
最近更新 更多