簡體   English   中英

OpenCV Mat 到 JavaCV Mat 的轉換

[英]OpenCV Mat to JavaCV Mat conversion

我正在編寫一個使用 JavaCV 進行面部識別的 Android 應用程序。 我遇到了一個小問題,我需要從onCameraFrame(CvCameraViewFrame inputFrame)函數返回到org.bytedeco.javacpp.opencv_core.Matorg.opencv.core.Mat轉換為org.bytedeco.javacpp.opencv_contrib.FaceRecognizer需要。

我在這里這里發現了類似的問題,但都沒有找到可行的解決方案。

https://github.com/bytedeco/javacpp/issues/38#issuecomment-140728812中記錄了一種更簡單、更有效的方法,簡而言之:

到 JavaCPP/JavaCV:

Mat mat2 = new Mat((Pointer)null) { { address = mat.getNativeObjAddr(); } };

OpenCV的官方Java API:

Mat mat = new Mat(mat2.address());

編輯OpenCVFrameConverter現在提供了一種更簡單、更安全的方法來執行此操作,例如:

OpenCVFrameConverter.ToMat converter1 = new OpenCVFrameConverter.ToMat();
OpenCVFrameConverter.ToOrgOpenCvCoreMat converter2 = new OpenCVFrameConverter.ToOrgOpenCvCoreMat();
Mat mat = ...;
org.opencv.core.Mat cvmat = converter2.convert(converter1.convert(mat));
Mat mat2 = converter2.convert(converter1.convert(cvmat));

您可以使用 java.awt.image.BufferedImage 作為接口。

只需將您的org.opencv.core.Mat對象轉換為java.awt.image.BufferedImage ,然后將結果對象轉換為org.bytedeco.javacpp.opencv_core.Mat

現在,這些是您需要的功能:

1) 將 org.opencv.core.Mat 轉換為 java.awt.image.BufferedImage:

public BufferedImage matToBufferedImage(Mat frame) {       
        int type = 0;
        if (frame.channels() == 1) {
            type = BufferedImage.TYPE_BYTE_GRAY;
        } else if (frame.channels() == 3) {
            type = BufferedImage.TYPE_3BYTE_BGR;
        }
        BufferedImage image = new BufferedImage(frame.width() ,frame.height(), type);
        WritableRaster raster = image.getRaster();
        DataBufferByte dataBuffer = (DataBufferByte) raster.getDataBuffer();
        byte[] data = dataBuffer.getData();
        frame.get(0, 0, data);
        return image;
    }

2) 將 java.awt.image.BufferedImage 轉換為 org.bytedeco.javacpp.opencv_core.Mat:

public Mat bufferedImageToMat(BufferedImage bi) {
        OpenCVFrameConverter.ToMat cv = new OpenCVFrameConverter.ToMat();
        return cv.convertToMat(new Java2DFrameConverter().convert(bi)); 
    }

確保擁有所有必要的罐子和進口。

您可以更深入地研究 JNI 的內容,但對於測試用例,這應該足夠了。

暫無
暫無

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

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