【问题标题】:OpenCV camera image shows bluishOpenCV 相机图像显示为蓝色
【发布时间】:2016-08-20 21:04:46
【问题描述】:

我正在使用以下代码从相机获取图像,但相机图像显示的颜色不同。

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;
        }

【问题讨论】:

  • 看起来红色和蓝色通道互换了(绿灯仍然是绿色,但蓝光是红色,红色区域是蓝色)
  • 你的代码很奇怪。 “img”是全局变量吗?
  • @Micka 不,它不公开,我现在也包含了这些字段。

标签: java android opencv


【解决方案1】:

也许您的图像类型是 RGB 而不是 BRG?在这种情况下,您将交换红色和蓝色。试试把TYPE_3BYTE_BGR改成TYPE_3BYTE_RGB

[编辑] 抱歉,我只在 OpenCV 的 Python 端。发生的事情是您不小心切换了通道 B 和 R(图像矩阵的第 1 层和第 3 层),您需要将其切换回来。必要时在矩阵中交换。

该链接可能会有所帮助:Converting BufferedImage to Mat in opencv

[EDIT2] 看看下面 Micka 的评论

【讨论】:

  • 很遗憾,TYPE_3BYTE_RGB 不存在。唯一存在的 rgb 是 TYPE_INT_RGB,它不起作用。
  • 你可以尝试将opencv mat从rgb转换为bgr。 c++ 代码是 cv::cvtColor (mat,mat, CV_RGB2BGR) 也许你可以转换它?
猜你喜欢
  • 2020-05-17
  • 1970-01-01
  • 2019-09-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-09-05
相关资源
最近更新 更多