0

我想像这个函数一样将 RGB 图像转换为灰色:

Imgproc.cvtColor(mRgba, mGrey, Imgproc.COLOR_RGBA2GRAY);

但是 openCV 使用一个特定的公式(0.299*R + 0.587*G + 0.114*BI 认为?),我想使用 min(R,G,B) 代替。

有没有一种高效的方法来做到这一点?(这是适用于 android 的 OpenCV,因此适用于 Java)

编辑 :

这是分析,我绝对应该早点完成:

捕获相机的基本应用程序以 12 FPS 运行

  • 使用 OpenCV 的 cvtColor() :12 FPS(速度差异微不足道)
  • 马克米勒的回答:1.5 FPS
  • 用 Mark Miller 的回答和 Miki 的优化(获取数据指针一次):7 FPS

这可能看起来令人难以置信,但只是这个小功能花费了 FPS 的一半。该设备还可以以不错的速度(3-4 FPS)运行非常复杂的东西,例如 ORB,并且所有 O(n) C++ 例程都没有 FPS 差异。也只是 Miki 的“技巧”使函数快了 10 倍。

4

1 回答 1

1

没有预先构建的方法可以为 OpenCV 提供任意函数以转换为灰度。剩下的选项是使用 RGB 通道本身。

for (int x = 0; x < mRgba.cols(); x++)
{
    for (int y = 0; y < mRgba.rows(); y++)
    {
        double[] rgb = mRgba.get(x, y);
        mGray.put(x, y, Math.min(rgb[0], Math.min(rgb[1], rgb[2])));
    }
}

正如您所提到的,它可能太慢了,特别是对于大图像和来自 if 语句的分支。但是,优化的三个规则:(1)不要做,(2)暂时不要做,(3)Profile first。简单地说,首先尝试易于编码的版本,然后一旦你知道这部分是慢部分[即,通过运行它并计时],更改代码以提高效率。

于 2015-07-13T16:11:29.330 回答