1

我正在寻找在背景上提取单一颜色的最佳方法,并将其替换为 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;
}

我也尝试过grabCut,但这非常慢,不能用于实时更改流:(

最好的问候

4

1 回答 1

1

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

正如这里所回答的那样。

于 2013-08-17T19:27:05.783 回答