我想将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
- 与OpenCV的cvtColor(): 12 FPS(速度差异是微不足道的)
- 与Mark Miller的回答:1.5 FPS
- 与Mark Miller的答案和Miki的优化(获得数据指针一次):7 FPS
这可能看起来不可思议,但仅仅是这个小功能就花费了一半的FPS。该设备还可以运行非常复杂的东西,如ORB,以体面的速率(3-4帧/秒),以及所有没有FPS差异的O(n) c++例程。还有就是Miki的"技巧"让这个函数的运行速度快了10倍。
没有预先构建的方法来给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)首先配置文件。简单地说,首先尝试易于编码的版本,然后一旦你知道这部分是慢的部分[1]。E,通过运行它并计时],更改代码以提高效率。