Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/209.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android Renderscript Colormatrix内部-帮助我理解_Android_Opencv_Renderscript_Colortransform - Fatal编程技术网

Android Renderscript Colormatrix内部-帮助我理解

Android Renderscript Colormatrix内部-帮助我理解,android,opencv,renderscript,colortransform,Android,Opencv,Renderscript,Colortransform,我想我一定是误解了Renderscript应用colormatrix的内在机制,因为我的结果并不像我预期的那样 所以我有一个Renderscript的配置,它“覆盖”了一个OpenCV Mat,基本上将它想象成一个充满像素的三维数组,其中每个像素都有RGBA(红、绿、蓝、阿尔法)值 因此,我想对每个像素应用颜色矩阵,如下所示: Vector R times Matrix 0.152286f, 1.052583f, -0.204868f, 0f, G 0

我想我一定是误解了Renderscript应用colormatrix的内在机制,因为我的结果并不像我预期的那样

所以我有一个Renderscript的配置,它“覆盖”了一个OpenCV Mat,基本上将它想象成一个充满像素的三维数组,其中每个像素都有RGBA(红、绿、蓝、阿尔法)值

因此,我想对每个像素应用颜色矩阵,如下所示:

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
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 
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);
因此,我预计新的向量R'G'B'A将是这样的:

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
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 
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);
因此,新的R'值将是旧RGB值的组合,a不影响RGB。G'和B'的行为相同。A将永远保持不变

在代码中,它如下所示:

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
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 
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,但是我的结果通常很奇怪,例如这个矩阵不应该影响任何东西,除了红色,绿色和它们的组合(例如,红色变成深灰色/棕色,绿色变成浑浊的黄色,紫色是红色+蓝色,因此红色消失,紫色变成蓝色。即使是白色纸张也会有绿色)

我还尝试过仅通过Renderscript从摄影机提要直接流式传输信息,并将信息存储在位图中,但结果是一样的


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

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


你是救命恩人!