我认为我一定误会了应用colormatrix的Renderscript内在函数的工作方式,因为我的结果没有达到我的预期。

因此,我为Renderscript分配了一个“覆盖” OpenCV Mat的Renderscript,基本上可以将其想象为一个充满像素的3维数组,其中每个像素都具有RGBA(红色,绿色,蓝色,Alpha)值。

所以我想对每个像素应用一个colormatrix,像这样:

Vector R times Matrix 0.152286f,  1.052583f,  -0.204868f, 0f,
       G              0.114503f,  0.786281f,  0.099216f,  0f,
       B              -0.003882f, -0.048116f, 1.051998f,  0f,
       A              0.000000f,  0.000000f,  0.000000f,  1f

因此,我希望发生的事情是新的Vector R'G'B'A'将像这样:
R' = R * 0.152286f + G * 1.052583f + B * -0.204868f + A * 0f
G' = as above
B' = as above
A' = R * 0 + G * 0 + B * 0 + A * 1

因此,新的R'值将是旧RGB值的组合,而A不影响RGB。 G'和B'的行为相同。 A将始终保持不变。

在代码中,它看起来像这样:
Matrix4f mProtan = new Matrix4f(new float[]{
                0.152286f, 1.052583f, -0.204868f, 0f,
                0.114503f, 0.786281f, 0.099216f, 0f,
                -0.003882f, -0.048116f, 1.051998f, 0f,
                0.000f, 0.000f, 0.000f, 1f
        });
        scriptIntrinsicColorMatrix.setColorMatrix(mProtan);
        scriptIntrinsicColorMatrix.forEach(inputAllocation, outputAllocation);

所以我已经在使用OpenCV了,它可以按预期工作,但是有点慢,因此我想使用Renderscript,但是我的结果通常很奇怪,例如,这个矩阵除了Red之外,不应该真正影响其他任何东西,绿色及其组合(例如,红色变成深灰色/棕色阴影,绿色变成泥黄色,紫色是红色+蓝色,所以红色消失,紫色变成仅蓝色。甚至白皮书也变成绿色)。

android - Renderscript Colormatrix内部函数-帮助我理解-LMLPHP

我还尝试了仅通过Renderscript从相机供稿直接流式传输并将信息存储在位图中,但是结果却是相同的。

任何帮助将不胜感激! :-)

最佳答案

RS对矩阵使用列主格式,因此您需要转置矩阵以获得期望的R'G'B'A'值。

https://developer.android.com/guide/topics/renderscript/reference/rs_matrix.html

https://android.googlesource.com/platform/frameworks/rs/+/android-7.0.0_r6/cpu_ref/rsCpuIntrinsicColorMatrix.cpp#820

关于android - Renderscript Colormatrix内部函数-帮助我理解,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/39395527/

10-10 06:26