2016-04-26 103 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