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