2014-08-27 3 views
2

일부 얼굴 인식을 위해 JavaCV를 사용하는 Android 애플리케이션을 작성하는 중입니다. 나는 org.opencv.core.Mat에서 onCameraFrame(CvCameraViewFrame inputFrame) 함수가 org.bytedeco.javacpp.opencv_contrib.FaceRecognizer에 필요한 org.bytedeco.javacpp.opencv_core.Mat으로 되돌아 오는 변환이 필요한 약간의 문제를 발견했습니다.OpenCV 매트에서 JavaCV 매트로 변환

비슷한 질문이 herehere인데 작동 해결책이 없습니다.

+0

슬픈 주제 - 2 자바 독립 opencv 래퍼, 둘 다 기본적으로 호환되지 않습니다. – berak

+0

어떤 방법이 있어야합니다. 그것을하기 위해 수동으로 함수를 작성하는 것. –

+0

"JavaCV를 사용하는 Android 애플리케이션을 작성하는 중입니다."새 코드에 공식 OpenCV Java API를 사용하는 것이 좋습니다. 그러나 정말로 이것을해야한다면, OpenCV의'Mat.dataAddr()'의 오랜 결과를 ​​bytdeco 포인터로 감추는 것이 아니라면 변환을 수행하고 JNI를 통해 호출하기위한 네이티브 코드를 작성해야 할 것입니다 bytedeco Mat 생성자에 전달할 수 있습니다. – Bull

답변

1

java.awt.image.BufferedImage를 인터페이스로 사용할 수 있습니다.

그냥 java.awt.image.BufferedImageorg.opencv.core.Mat 개체를 변환 한 후 org.bytedeco.javacpp.opencv_core.Mat로 변환 결과 개체를 가져 가라.

1) java.awt.image.BufferedImage에 org.opencv.core.Mat 변환 :

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) 자바를 변환

지금이 당신이 필요로하는 기능입니다. org.bytedeco.javacpp.opencv_core.Mat에 awt.image.BufferedImage는 :

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

관련 문제