我希望将RGB图像转换为格雷,就像这个函数一样:
Imgproc.cvtColor(mRgba, mGrey, Imgproc.COLOR_RGBA2GRAY);
但是openCV使用了一个特定的公式(我认为0.299 * R + 0.587 * G + 0.114 * B?),我想改用min(R,G,B)。
是否有一种性能效率高的方法? (这是用于Android的OpenCV,因此使用Java)
编辑:
以下是我最初应该做的分析:
捕获相机的基本应用程序以12 FPS运行
这可能看起来令人难以置信,但只是那个小功能花费了FPS的一半。该设备可以运行非常复杂的东西,如ORB以不错的速率(3-4 FPS),以及所有O(n)C ++例程,没有FPS差异。也只是三木"技巧"使功能快10倍。
答案 0 :(得分: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)优先配置。简单地说,首先尝试易于编码的版本,然后一旦你知道这个部分是一个慢的部分[即,通过运行它并计时],改变代码以提高效率。