有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java使用OpenCV中我自己的公式将RGB转换为灰色

我想将RGB图像转换为灰色,就像此函数所做的那样:

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

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

有没有一种性能高效的方法可以做到这一点?(这是适用于安卓的OpenCV,Java也是如此)

编辑:

下面是分析,我肯定应该早点做:

拍摄相机的基本应用程序以每秒12帧的速度运行

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

这看起来很不可思议,但仅仅是一个小小的功能就花费了FPS的一半。该设备还可以运行非常复杂的东西,比如ORB,在适当的速率(3-4个FPS),所有的O(n)C++例程没有FPS的差异。此外,Miki的“技巧”使函数速度提高了10倍


共 (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)先分析。简单地说,首先尝试易于编码的版本,然后一旦你知道这一部分是缓慢的部分(即,通过运行它并对其计时),更改代码以提高效率