为Android添加图像叠加OpenCV

时间:2013-02-06 14:40:58

标签: android opencv image-processing video-processing

我正在寻找一种在Android的openCV(2.4.3)中叠加图像的方法。基本上,我正在做一些图像过滤,我希望用户能够看到干净过滤的视频流,但在上角看到过滤器正在做的预览:

我尝试在过滤后的图片上设置投资回报率,并使用像这样的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中走这条路的原因,但此时我会考虑任何解决方案

2 个答案:

答案 0 :(得分:2)

如果我理解正确,您希望实时图像不会显示,并且在上角将实际图像应用一些滤镜的结果是正确的吗? 您希望过滤后的预览代表整个图像还是只是其中的一部分?

我认为这是一个你想做的算法:

第1步:调整liveFrame的大小(不改变它,所以你要么创建一个副本,要么使用在内部创建副本的resize方法)所以它是一个小于的新图像(称为mProcMat)原版的。 You might want to check this question.

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

第3步:将mProcMat放置在liveFrame上,在liveFrame上创建一个ROI,它位于右上方,并且具有相同大小的mProcMat 。使用submat作为投资回报率has you have seen in your other question,它更灵活,因为您有3种不同的方式进行设置。

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

这听起来不错吗?

修改 我甚至认为你不需要添加第4步的加权,要获得预览,你可以在第3步的roi上绘制mProcMat。我完全不明白你使用addWeighted的想法。

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

答案 1 :(得分:1)

I've talked about this before,但如果您希望以透明度叠加,我建议您查看:Transparent image overlays in OpenCV

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