2013-02-06 41 views
2

我正在尋找一種方式來覆蓋Android中的openCV(2.4.3)圖像。基本上,我正在做一些圖像過濾,我希望用戶能夠看到乾淨的過濾視頻流,但在上角看到過濾器正在做的預覽:添加OpenCV for Android的圖像覆蓋

我試過設置ROI中的濾波後的圖像上,並且在JNI代碼的使用AddWeighted這樣

在活動:

liveFrame.copyTo(mRgba); //going to be used as the unfiltered stream 

//image filtering happends here... 

Rect roi = new Rect(0, 0, liveFrame.cols()/4, liveFrame.rows()/4); 
mProcMat = new Mat(liveFrame, roi); 
AddMats(mRgba.getNativeObjAddr(),mProcMat.getNativeObjAddr()); //will add the two, assign the result to mRgba 

AddMats(本機方法):

Mat* image1=(Mat*)mat1; 
Mat* image2 = (Mat*)mat2; 
float alpha = 0.5; 
float beta = 0.5; 
addWeighted((InputArray)*image1, alpha, (InputArray)*image2, beta, 0.0, (OutputArray)*image1); 

但是這不會工作,因爲圖像的大小必須相同,所以我似乎不能想辦法讓這個工作。我可以在iOS中輕鬆完成此操作,因爲您只需將該幀應用於直播視頻頂部的新視圖即可。對於Android,據我所知,每個相機輸入流只能有1個表面視圖。所以這就是爲什麼我在opencv中這樣做的道路,但我會考慮在這一點上的任何解決方案

+0

你是說覆蓋圖像與* background *圖像相同嗎? – karlphillip

回答

2

如果我理解正確,你想要一個實時圖像顯示不變,並在結果的上角對實時圖像應用一些過濾器,這是正確的嗎? 您想要過濾的預覽代表整個圖像還是其中的一部分?

這是一種算法,我想你想要做什麼:

第1步:調整大小liveFrame(不改變它,這樣你就可以創建一個副本,或使用其內部創建副本的大小調整方法),這樣它是一個比原來小的新圖像(稱爲mProcMat)。 You might want to check this question.

第2步:將圖像過濾應用到mProcMat。

步驟3:放置mProcMat上liveFrame,創建liveFrame其位於其右上並且具有mProcMat的相同尺寸的投資回報率。使用投資回報率的子分區,has you have seen in your other question,它更靈活,因爲您有3種不同的方式來設置它。

第4步:AddMats(liveFrameROI.getNativeObjAddr(), mProcMat.getNativeObjAddr());

這聽起來是不是好?

編輯: 我甚至不認爲你需要做的第4步的addWeighted,讓你可以只畫mProcMat上的投資回報率預覽從第3步我沒有完全理解你的想法使用addWeighted。

您可能還想要check this thread,它在某種程度上類似。

+0

向我們展示一些結果,如果你使它工作:) –