【问题标题】:Copying a small image into the camera frame with OpenCV for Android使用 OpenCV for Android 将小图像复制到相机框架中
【发布时间】:2014-03-15 19:10:16
【问题描述】:

我目前正在开发一个程序,该程序应该在相机框架上绘制一个小图像。使用 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)中的相机帧保持不变

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

伊萨

【问题讨论】:

    标签: java android opencv image-processing


    【解决方案1】:

    好的,我找到了,有点棘手。

    只有当 src 和 dest Mat 的类型相同时,使用子矩阵的 copyTo 函数才能正常工作。否则,它只是……什么都没有。 (它宁可抱怨!)

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

    还要注意,子垫的尺寸(#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); 
    

    【讨论】:

    • 干得好..但实际上 mComparatorImage 需要灰色的..对吗?
    猜你喜欢
    • 1970-01-01
    • 2013-01-26
    • 1970-01-01
    • 1970-01-01
    • 2017-02-11
    • 2011-10-09
    • 1970-01-01
    • 2015-05-24
    • 1970-01-01
    相关资源
    最近更新 更多