我目前正在开发一个应该在相机框架上绘制一个小图像的程序。使用Android OpenCV,您可以使用以下功能来处理框架:
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);
}
我尝试做的是将调整大小的mComparatorImage版本复制到mOutputFrame(mOutputFrame = rgba)引用的相机框架中。
所以我尝试了(3)。 仅供参考:mResizedImageClone的类型为Mat,并初始化为新的Mat()
执行(3)不会更改mOutputFrame。
(2)然后我尝试将整个mComparatorImage(类型为Mat,与mOutputFrame大小相同)复制到mOutputFrame。这令人惊讶。
(1)然后我认为问题必须是submat,因为复制大图像是有效的,但是将它的一个小版本复制到mOutputFrame中并不行。所以我尝试将一个小黑图复制到mOutputFrame中。这也不起作用,虽然我在这里听了其他答案。
可能是什么问题?没有错误,但相机框架在(1)和(3)
中保持不变如果您需要任何其他信息,请与我们联系。
伊萨
答案 0 :(得分:8)
好的,我发现了,这有点棘手。
如果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);