5

我正在尝试在 Android 手机上使用 OpenCV 识别和区分黑色背景下 LED 的颜色,但目前正在苦苦挣扎。我迄今为止的调查指向两个不同的问题:

  1. 使用 OpenCV,相机似乎默认为自动白平衡,这使得难以区分某些颜色。使用本机 Android 相机,在白平衡设置为“多云”的情况下,可以生成最佳图像。
  2. OpenCV 提供 RGB 颜色空间中的图像,但 RGB 与人类感知的颜色之间的距离不匹配,这意味着欧几里德 RGB 距离度量不是最佳解决方案(请参阅如何比较两种颜色)。

因此,我有三个问题:

  1. Android Java 或 OpenCV 中有没有办法设置相机的白平衡,以便影响 OpenCV 返回的结果图像?
  2. 如果没有,是否有可用的算法(最好是在 Java 中)来修改 OpenCV 图像的白平衡?
  3. 是否有可用的算法(同样,最好是在 Java 中)将 RGB 颜色转换为可以更好地匹配人类感知的颜色之间距离的替代颜色空间?

谢谢

4

3 回答 3

1

我对问题 1 的回答(意味着我不需要对问题 2 的回答)是使用 Using the OpenCV Tutorial 3 code (Camera Control)(请参阅OpenCV4Android 示例)并修改颜色效果方法以允许设置白平衡:

public List<String> getWhiteBalanceList() {
    return mCamera.getParameters().getSupportedWhiteBalance();
}

public boolean isWhiteBalanceSupported() {
    return (mCamera.getParameters().getWhiteBalance() != null);
}

public String getWhiteBalance() {
    return mCamera.getParameters().getWhiteBalance();
}

public void setWhiteBalance(String whiteBalance) {
    Camera.Parameters params = mCamera.getParameters();
    params.setWhiteBalance(whiteBalance);
    mCamera.setParameters(params);
}

一旦我知道这行得通,我就可以向我的主线程添加一个调用来设置正确的白平衡:

mOpenCvCameraView.setWhiteBalance(Parameters.WHITE_BALANCE_CLOUDY_DAYLIGHT);

在回答问题 3 时,我使用了Color Logic Algorithm中的 Java 答案。

于 2013-03-30T12:18:04.653 回答
0

为了从黑色背景中识别不同的 LED 颜色,我提出以下建议:

  1. 首先,使用 OpenCV 的cvtColor 函数将 RGB 转换为 HSV 颜色空间。这里 HSV 代表 Hue(如红色、绿色、黄色、蓝色等)、Saturation(颜色的饱和度)、Value(亮度)。转换每个 RGB 值后,您将获得 HSV 值。像 RGB HSV 一样具有三个通道 H、S 和 V。

  2. 其次,由于您对 LED 的颜色感兴趣,请仅分析色相分量来确定 LED 的颜色。例如,您可以对 Hue 通道进行阈值处理,并确定图像的哪个部分包含从 10 到 25 的色调,等等……绘制/打印阈值图像以检查您的代码。

于 2013-03-26T19:34:57.867 回答
0
  1. 我认为这与相机的设备驱动程序是否可以通过Android的Camera API控制它有关。
  2. 这对您很有用:检测颜色

我喜欢电子产品,所以一个简单的光敏电阻无需任何代码就可以做到这一点:)。

于 2013-03-25T13:03:41.773 回答