2013-02-06 69 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

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