2013-08-17 95 views
1

我正在尋找提取背景上單一顏色的最佳方式,並用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; 
} 

我也試過grabCut但這是極其緩慢的,並且不能在活:(

問候 改變流一月

回答

1

使用,因爲JavaCV是OpenCV的接口,那麼你必須能夠執行Grabcut分割

也作爲回答here

+0

親愛的TGO 我嘗試使用Ex5GrabCut示例,但它的接縫速度也很慢:(我沒有正確的結果,但幀速度變化非常慢,我沒有在全高清視頻流上工作:( – johnnyGor

+0

@johnnyGor是你在執行算法時預覽它嗎? – TGO

+0

我找到了一些例子。這些值取自它。這還沒有完成,但在這一步我注意到它的速度非常低。 public static IplImage bgTest(IplImage img){ \t \t \t \t \t \t IplImage frame = cvCloneImage(img); \t \t CvRect rect = new CvRect(0, 0, 200, 200); \t \t IplImage result = IplImage.create(cvGetSize(frame), IPL_DEPTH_8U, 1); \t \t CvMat a = new CvMat(null); \t \t CvMat b = new CvMat(null); \t \t \t \t grabCut(frame, result, rect, a, b, 3, GC_INIT_WITH_RECT); \t \t cvCmpS(result, GC_PR_FGD, result, CV_CMP_EQ); \t \t \t \t \t return result; \t \t \t } johnnyGor

相關問題