在预览中叠加透明颜色

Overlay transparent colour on preview

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

我正在为 Android 使用 OpenCV。

我找到了使用其他语言的其他教程,例如 this

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

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

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;
}

问题(logcat 表明了这一点)是 greenOverlay 和 inputFrame 的大小不同。 Logcat 留言:

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')

我该如何解决这个问题?

解决方案

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

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

出自教程(写于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 – second input array of the same size and channel number as src1.

因此,克隆 mRgba 以制作 greenOverlay 并在其上绘制矩形。


示例代码(未测试):

替换

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);