在 OpenCV 中使用我自己的公式将 RGB 转换为灰色
Convert RGB to Gray with my own formula in OpenCV
我想像这个函数一样将 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++ 例程,没有 FPS 差异。此外,只有 Miki 的 "trick" 使函数速度提高了 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) 先分析。简而言之,首先尝试易于编码的版本,然后一旦您确定该部分是慢速部分 [即 运行 并对其计时],请更改代码以提高效率。
我想像这个函数一样将 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++ 例程,没有 FPS 差异。此外,只有 Miki 的 "trick" 使函数速度提高了 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) 先分析。简而言之,首先尝试易于编码的版本,然后一旦您确定该部分是慢速部分 [即 运行 并对其计时],请更改代码以提高效率。