使用javaCV删除背景的最佳方法是什么?

时间:2013-08-17 19:05:04

标签: java opencv javacv

我正在寻找在背景上提取单色的最佳方法,并在JavaCV中动态替换它。我写了非常简单的逐个像素读取方法,如果颜色为绿色则替换它。 这是非常缓慢的,即使我把它分成几个线程,它的工作速度也非常慢。 这必须在现场完成,所以我必须找出一些其他的方法。也许在替换背景后我也必须添加一些水印,因此应用程序必须非常快。

有人能帮我找到合适的方法吗? 我花了一整天的时间试图找到其他方式,但是......我找到的所有例子都不起作用,或者我不知道如何根据我的需要采用它们。

这家伙(http://www.youtube.com/watch?v=WOEuE3D88b0)写道,他正在逐个像素地阅读 - 没办法,或者他可能拥有非常快速的多核工作站。在我的MacBook Pro 2.5 i5上它不起作用:(

我已经使用了你的例子,我认为我完全混合了它。我可以看到移动我的面具(黑色背景上的白色),如果我使用CvCopy,我可以看到出现在白点的地方的背景。 不幸的是他不是要求的结果,但我认为我必须非常接近它;)我必须离开我并替换所有静态对象。 你能检查一下我的代码吗?

private static final IplImage back = cvLoadImage("/Users/user/app/eclipse/JavaCV/resources/1.png", CV_LOAD_IMAGE_COLOR);

private static BackgroundSubtractorMOG2 bgs = new BackgroundSubtractorMOG2(30,16,false);

public static IplImage replacePixels2(IplImage img){
IplImage frame = cvCloneImage(img); 
//bgs.getBackgroundImage(frame);
IplImage image = IplImage.create(frame.width(), frame.height(), IPL_DEPTH_8U,1);
bgs.apply(frame, image, -1);


IplROI roi = new IplROI();
roi.xOffset(0);
roi.yOffset(0);
roi.width(frame.width());
roi.height(frame.height());


IplImage backImageWithRoi = frame.roi(roi);


cvCopy(back, backImageWithRoi, image );

    return backImageWithRoi;
}

private static BackgroundSubtractorMOG2 bgs = new BackgroundSubtractorMOG2(30,16,false); public static IplImage replacePixels2(IplImage img){ IplImage frame = cvCloneImage(img); //bgs.getBackgroundImage(frame); IplImage image = IplImage.create(frame.width(), frame.height(), IPL_DEPTH_8U,1); bgs.apply(frame, image, -1); IplROI roi = new IplROI(); roi.xOffset(0); roi.yOffset(0); roi.width(frame.width()); roi.height(frame.height()); IplImage backImageWithRoi = frame.roi(roi); cvCopy(back, backImageWithRoi, image ); return backImageWithRoi; }

我也试过了grabCut,但这非常慢,不能用于改变直播中的流:(

最诚挚的问候 扬

1 个答案:

答案 0 :(得分:1)

由于JavaCV是OpenCV的接口,因此您必须能够执行 Grabcut分割

也回答here