我正在寻找在背景上提取单色的最佳方法,并在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,但这非常慢,不能用于改变直播中的流:(
最诚挚的问候 扬