我正在寻找一种在Android的openCV(2.4.3)中覆盖图像的方法。基本上,我正在进行一些图像过滤,我希望用户能够看到干净过滤的视频流,但在上角可以看到过滤器的预览:
我尝试在过滤后的图像上设置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,据我所知,每个相机输入流只能有一个表面视图。所以这就是为什么我在opencv中走上了这样的道路,但在这一点上我会考虑任何解决方案
如果我理解正确,你希望实时图像显示不变,并且在上角是对实时图像应用一些过滤器的结果,这是正确的吗?您希望过滤后的预览表示整个图像还是仅表示图像的一部分?
这里有一个算法,我认为它可以满足你的需求:
步骤1:调整liveFrame的大小(不更改它,因此您可以创建一个副本,也可以使用内部创建副本的调整大小方法),使其成为比原始图像小的新图像(称为mProcMat)。你可能想检查一下这个问题。
步骤2:将图像过滤应用于mProcMat。
步骤3:要将mProcMat放置在liveFrame上,请在liveFrame中创建一个ROI,该ROI位于其右上角,大小与mProcMat相同。使用投资回报率的子模型,你在其他问题中看到过吗,它更灵活,因为你有三种不同的方法来设置它。
步骤4:AddMats(liveFrameROI.getNativeObjAddr(), mProcMat.getNativeObjAddr());
这听起来不错吗?
编辑:我甚至不认为你需要对第四步进行addWeighted,为了获得预览,你可以在第三步的roi上绘制mProcMat。我不完全理解你使用addWeighted的想法。
你可能还想检查一下这个线程,它在某种程度上是相似的。
我之前已经谈到过这一点,但如果你想用透明覆盖,我建议你看看:OpenCV中的透明图像覆盖。
如果您需要调整其中一个图像的大小,只需选中此链接。