2014-08-27 249 views
2

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

我找到了類似的問題herehere,但都沒有得到一個工作解決方案。

+0

是的,悲傷的話題-2 java獨立opencv包裝,兩者基本不兼容。 – berak 2014-08-27 19:04:49

+0

必須有某種方式。編寫一個手動函數來做它或某事。 – 2014-08-27 19:10:17

+0

「我正在編寫使用JavaCV的Android應用程序」:我強烈建議您使用官方OpenCV Java API來獲取新代碼。但是,如果你真的必須這樣做,你可能需要編寫一些本地代碼來進行轉換並通過JNI調用它,除非有人將OpenCV的'Mat.dataAddr()'的長結果轉換爲bytdeco指針,你可以將它傳遞給bytedeco的Mat構造函數。 – Bull 2014-08-28 01:58:40

回答

1

您可以使用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的東西,但對於測試用例,這應該是足夠的。

+0

沒有像'opencv_core.Mat..get(0,0,data)這樣的方法;'!!在'javacv'中 – user924 2017-12-05 08:45:59