预览时叠加透明色

时间:2017-11-15 16:18:25

标签: java android opencv blending

我正在写一个运动探测器。我能够检测到框架特定区域的运动。现在,我想用透明的颜色突出显示该区域。

我正在使用OpenCV for Android。

我发现其他语言使用其他语言,例如this

他们使用addWeighted()来混合两个图像。

目前,我只是尝试覆盖预览框。我尝试了以下代码:

def check_string(code):
    return all(character in {'A', 'T', 'C', 'G'} for character in code)

问题(logcat显示此问题)是greenOverlay和inputFrame的大小不同。 Logcat消息:

public Mat onCameraFrame(CameraBridgeViewBase.CvCameraViewFrame inputFrame {
mRgba = inputframe.rgba();
//defined a Mat that overlays the frame:
Mat greenOverlay = mRgba.submat(0, mRgba.height(), 0, mRgba.width()/5)
mGreenOverlay.setTo(GREEN);

Core.addWeighted(mGreenOverlay,0.5,mRgba,0.5, 0.0, mRgba);
return mRgba;
}

我该如何解决这个问题?

解决方案

Toris回答有效。代码如下所示:

OpenCV Error: Sizes of input arguments do not match 
(The operation is neither 'array op array' 
(where arrays have the same size and the same number of channels), 
nor 'array op scalar', nor 'scalar op array')

1 个答案:

答案 0 :(得分:1)

从问题中显示的教程(用python编写):

overlay = image.copy()
output = image.copy()

cv2.rectangle(overlay, ...)

参考OpenCV:
https://docs.opencv.org/2.4/modules/core/doc/operations_on_arrays.html#addweighted

  

addWeighted()
  src2 - 与src1具有相同大小和通道编号的第二个输入数组。

因此,克隆mRgba以生成greenOverlay并在其上绘制rect。

示例代码(未经测试):

替换

Mat greenOverlay = mRgba.submat(0, mRgba.height(), 0, mRgba.width()/5);
mGreenOverlay.setTo(GREEN);

使用

Mat greenOverlay = mRgba.clone();
Core.rectangle(greenOverlay, new Point(0, 0), new Point(mRgba.width()/5, mRgba.height()), GREEN, -1);