[英]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.