2

我正在寻找一种在 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,每个相机输入流只能有 1 个表面视图。所以这就是我在opencv中走这条路的原因,但此时我会考虑任何解决方案

4

2 回答 2

2

如果我理解正确,您希望实时图像原样显示,并且在上角是对实时图像应用一些过滤器的结果,这是正确的吗?您希望过滤后的预览代表整个图像还是仅代表其中的一部分?

这是我认为可以满足您要求的算法:

第 1 步:调整 liveFrame 的大小(不改变它,因此您要么创建一个副本,要么使用在内部创建副本的调整大小方法),使其成为比原始图像更小的新图像(称为 mProcMat)。你可能想检查这个问题。

第 2 步:对 mProcMat 应用图像过滤。

第 3 步:将 mProcMat 放置在 liveFrame 上,在 liveFrame 上创建一个 ROI,该 ROI 位于其右上角并且与 mProcMat 具有相同的大小。将 submat 用于 ROI,您是否在其他问题中看到过,它更灵活,因为您有 3 种不同的方式来设置它。

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

这听起来不错?

编辑: 我什至认为您不需要执行第四步的 addWeighted,要获得预览,您可以从第 3 步开始在 roi 上绘制 mProcMat。我不完全理解您使用 addWeighted 的想法。

您可能还想检查这个线程,它有点相似。

于 2013-02-13T23:17:19.673 回答
1

我之前已经讨论过这个问题,但是如果你想用透明度进行叠加,我建议你看一下:OpenCV 中的透明图像叠加

如果您需要调整其中一张图片的大小,只需查看 此链接

于 2013-02-13T23:53:56.450 回答