簡體   English   中英

使用OpenCV for Android將小圖像復制到相機框架中

[英]Copying a small image into the camera frame with OpenCV for Android

我目前正在開發一個應該在相機框架上繪制一個小圖像的程序。 使用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)中保持不變

如果您需要任何其他信息,請告訴我們。

伊薩

好的,我發現它,這有點棘手。

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM