2015-05-15 3 views
1

У меня есть этот исходный код, который может открыть изображение для OpenCv в Mat, а затем выполнить некоторую операцию, тогда bufferedImage должен преобразовать его в изображение, чтобы он отображался в JFrame. Но я не могу понять, как передавать аргументы.Преобразование изображения в Mat в BufferedImage

public class objectDetection{ 


    public void getMatImg(){ 

     Mat imageInMat = Imgcodecs.imread(getClass().getResource("lena.png").getPath()); 
    } 

    /* 
    * 
    * OpenCV code 
    */ 


    public static BufferedImage bufferedImage(Mat m) { 


     int type = BufferedImage.TYPE_BYTE_GRAY; 
     if (m.channels() > 1) { 
      type = BufferedImage.TYPE_3BYTE_BGR; 
     } 
     BufferedImage image = new BufferedImage(m.cols(), m.rows(), type); 

     m.get(0, 0, ((DataBufferByte)image.getRaster().getDataBuffer()).getData()); 
     return image; 

    } 

ответ

3

Вот код, который мы использовали некоторое время назад для 2.4.8 или .9. Дайте мне знать, если это сработает для вас.

Возможно, у нас были некоторые проблемы с этим, когда мы пытались передать существующий BufferedImage, но он работал нормально, если вы передали значение null для BufferedImage.

/** 
* Converts/writes a Mat into a BufferedImage. 
* 
* @param matrix Mat of type CV_8UC3 or CV_8UC1 
* @return BufferedImage of type TYPE_3BYTE_BGR or TYPE_BYTE_GRAY 
*/ 
public static BufferedImage matToBufferedImage(Mat matrix, BufferedImage bimg) 
{ 
    if (matrix != null) { 
     int cols = matrix.cols(); 
     int rows = matrix.rows(); 
     int elemSize = (int)matrix.elemSize(); 
     byte[] data = new byte[cols * rows * elemSize]; 
     int type; 
     matrix.get(0, 0, data); 
     switch (matrix.channels()) { 
     case 1: 
      type = BufferedImage.TYPE_BYTE_GRAY; 
      break; 
     case 3: 
      type = BufferedImage.TYPE_3BYTE_BGR; 
      // bgr to rgb 
      byte b; 
      for(int i=0; i<data.length; i=i+3) { 
       b = data[i]; 
       data[i] = data[i+2]; 
       data[i+2] = b; 
      } 
      break; 
     default: 
      return null; 
     } 

     // Reuse existing BufferedImage if possible 
     if (bimg == null || bimg.getWidth() != cols || bimg.getHeight() != rows || bimg.getType() != type) { 
      bimg = new BufferedImage(cols, rows, type); 
     }   
     bimg.getRaster().setDataElements(0, 0, cols, rows, data); 
    } else { // mat was null 
     bimg = null; 
    } 
    return bimg; 
} 
Смежные вопросы