2016-04-26 144 views
2

我正在使用下面的代碼從攝像機獲取圖像,但攝像機圖像以不同方式顯示顏色。OpenCV攝像機圖像顯示藍色

public Mat mat = new Mat(); 
private BufferedImage img; 
private byte[] dat; 

    public void getSpace(Mat mat) { 
      this.mat = mat; 
      int w = mat.cols(), h = mat.rows(); 
      if (dat == null || dat.length != w * h * 3) 
       dat = new byte[w * h * 3]; 
      if (img == null || img.getWidth() != w || img.getHeight() != h || img.getType() != BufferedImage.TYPE_3BYTE_BGR) 
       img = new BufferedImage(w, h, BufferedImage.TYPE_3BYTE_BGR); 
     } 

     public BufferedImage getImage(Mat mat) { 
      getSpace(mat); 
      mat.get(0, 0, dat); 
      img.getRaster().setDataElements(0, 0, mat.cols(), mat.rows(), dat); 
      return img; 
     } 

enter image description here

+3

看起來像紅色和藍色通道的評論互換(綠燈仍然是綠色的,但藍燈爲紅色,瑞迪施地區很藍) – Micka

+0

你的代碼很奇怪。是「img」一個全局變量? – Micka

+0

@Micka不,它不公開,我現在也包括這些領域。 – PRCube

回答

1

也許你的圖像是RGB類型,而不是BRG的?在這種情況下,你會交換紅色和藍色。嘗試將TYPE_3BYTE_BGR更改爲TYPE_3BYTE_RGB

[編輯]對不起,我只在OpenCV的Python端。發生的事情是,你意外地切換了通道B和R(圖像矩陣的第一層和第三層),你需要切換回來。如有必要,在矩陣中交換它。

該鏈接可能會幫助:Converting BufferedImage to Mat in opencv

[EDIT2]看一看Micka以下

+0

不幸的是,TYPE_3BYTE_RGB不存在。唯一存在的rgb是TYPE_INT_RGB,它不起作用。 – PRCube

+1

你可以嘗試將opencv mat從rgb轉換爲bgr。 c + +代碼將cv :: cvtColor(mat,mat,CV_RGB2BGR)也許你xan轉換? – Micka