【问题标题】:Adding Image Overlay OpenCV for Android为 Android 添加图像覆盖 OpenCV
【发布时间】:2013-02-15 22:13:29
【问题描述】:

我正在寻找一种在 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中走这条路的原因,但此时我会考虑任何解决方案

【问题讨论】:

  • 你是说覆盖图和背景图一样吗?

标签: android opencv image-processing video-processing


【解决方案1】:

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

这是一个我认为可以满足您需求的算法:

第 1 步: 调整 liveFrame 的大小(不改变它,因此您要么创建一个副本,要么使用在内部创建副本的调整大小方法)使其成为一个比原来的。 You might want to check this question.

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

第 3 步: 将 mProcMat 放置在 liveFrame 上,在 liveFrame 上创建一个 ROI,该 ROI 位于其右上角与 mProcMat 大小相同。为 ROI 使用 submat,has you have seen in your other question,它更灵活,因为您有 3 种不同的方式来设置它。

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

这听起来不错?

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

你可能也想check this thread,有点类似。

【讨论】:

    【解决方案2】:

    I've talked about this before,但如果你想用透明度覆盖我建议看看:Transparent image overlays in OpenCV

    如果您需要调整大小其中一张图片,只需checkthis link

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-02-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-12-13
      • 1970-01-01
      相关资源
      最近更新 更多