我正在使用OpenCV4Android 3.1.0版本,我想删除Android相机拍摄的每帧中的背景。我提到了一些帖子和我理解的内容,因为背景应该从非静态中删除 背景" Android相机"我应该使用' createBackgroundSubtractorMOG2'
根据一个例子,我正在使用' createBackgroundSubtractorMOG2'如下面的代码所示。但是在运行时,无论从相机中检索到的帧的背景如何变化,我都会得到掩码" fgmask"始终包含 一张白色的图片。
请让我知道如何使用createBackgroundSubtractorMOG2
代码:
//use createBackgroundSubtractorMOG2
fgmask = new Mat();
BackgroundSubtractorMOG2 bgs = Video.createBackgroundSubtractorMOG2(30, 16, false);
bgs.apply(mMatInputFrame,fgmask,0);
//to display the mask
final Bitmap bitmap = Bitmap.createBitmap(this.mMatInputFrame.cols(), this.mMatInputFrame.rows(), Bitmap.Config.ARGB_8888);
Utils.matToBitmap(this.fgmask, bitmap);
getActivity().runOnUiThread(new Runnable() {
@Override
public void run() {
mIVEdges.setImageBitmap(bitmap);
}
});
答案 0 :(得分:0)
正如@Miki所说,如果您的背景不是静态的,则无法使用此方法。
BackgroundSubtractorMOG2
使用高斯混合模型对背景进行建模,因此它可以适应它的微小变化(照明,新的静态物体等),但它无法适应完全动态的背景。
但如果您仍想尝试,可以使用以下方法:
public class MOG2Subtractor {
private final static double LEARNING_RATE = 0.01;
private BackgroundSubtractorMOG2 mog;
private Mat foreground;
public MOG2Subtractor() {
mog = Video.createBackgroundSubtractorMOG2();
foreground = new Mat();
// You can configure some parameters. For example:
mog.setDetectShadows(false);
}
public Mat process(Mat inputImage) {
mog.apply(inputImage, foreground, LEARNING_RATE);
return foreground;
}
}
这里有所有参数及其含义:BackgroundSubtractorMOG2