使用OpenCV for Android将小图像复制到相机框架中

我目前正在开发一个应该在相机框架上绘制一个小图像的程序。 使用Android OpenCV,您可以使用以下function来处理帧:

public Mat onCameraFrame(CvCameraViewFrame inputFrame) { Mat rgba = inputFrame.rgba(); mDetector.setFrame(rgba); mDetector.processFrame(); return rgba; } 

Mat rgba然后显示在屏幕上。 我的探测器现在应该处理帧rgba(改变它)。 这是相关的代码:

 public void processFrame() { // (1) Doesn't work Rect roi = new Rect(0, 0, 100, 100); Mat submat = mOutputFrame.submat(roi); Mat image = new Mat(100, 100, CvType.CV_8UC3, new Scalar(0,0,0)); image.copyTo(submat); // (2) Does work // --- mComparatorImage is the same size as mOutputFrame. // --- mComparatorImage is 8bit greyscale, mOutputFrame is the rgba CameraFrame mComparatorImage = mComparatorHolder.getCurrentImage(); mComparatorImage.copyTo(mOutputFrame); // (3) Should work (but doesn't) Imgproc.resize(mComparatorImage, mResizedImageClone, new Size (200, 100)); Mat bSubmat = mOutputFrame.submat(new Rect(0, 0, 200, 100)); mResizedImageClone.copyTo(bSubmat); } 

我想要做的是将resize的mComparatorImage版本复制到mOutputFrame(mOutputFrame = rgba)引用的相机框架中。

所以我尝试了(3)。 仅供参考:mResizedImageClone属于Mat类型并初始化为新的Mat()

执行(3)不会更改mOutputFrame。

(2)然后我尝试将整个mComparatorImage(类型为Mat,与mOutputFrame大小相同)复制到mOutputFrame。 这令人惊讶。

(1)然后我认为问题必须是submat,因为复制大图像是有效的,但是将它的一个小版本复制到mOutputFrame中并不行。 所以我尝试将一个小黑图复制到mOutputFrame中。 这也不起作用,虽然我在这里遵循其他答案。

可能是什么问题呢? 没有错误,但相机框架在(1)和(3)中保持不变

如果您需要任何其他信息,请告诉我们。

伊萨

好的,我发现它,有点棘手。

如果src和dest Mat属于同一类型,则使用子矩阵的copyTo函数只能正常工作。 否则,它只是…没有。 (它应该抱怨!)

我没有使用rect,而是使用带参数的submat(row_start,row_end,col_start,col_end)

另请注意,submat(#cols和#rows)的尺寸必须与copyTo中使用的src图像完全匹配。

所以这是我对(1)的解决方案:

 // (1) Inserting a little black rect into the camera frame: Mat submat = mOutputFrame.submat(0, 100, 0, 100); Mat image = new Mat(100, 100, mOutputFrame.type(), new Scalar(0,0,0)); image.copyTo(submat); 

我的解决方案(3):

 // (3) Resizing and inserting an arbitrary grey image into the rgba camera frame Imgproc.resize(mComparatorImage, mResizedImageClone, new Size (200, 100)); Imgproc.cvtColor(mResizedImageClone, mResizedImageClone, Imgproc.COLOR_GRAY2RGBA); Mat submat = mOutputFrame.submat(0, 100, 0, 200); mResizedImageClone.copyTo(submat);