Android Renderscript Colormatrix内部-帮助我理解
我想我一定是误解了Renderscript应用colormatrix的内在机制,因为我的结果并不像我预期的那样 所以我有一个Renderscript的配置,它“覆盖”了一个OpenCV Mat,基本上将它想象成一个充满像素的三维数组,其中每个像素都有RGBA(红、绿、蓝、阿尔法)值 因此,我想对每个像素应用颜色矩阵,如下所示: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
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'值
你是救命恩人!