我认为我必须误解Renderscript应用colormatrix的内在函数是如何工作的,因为我的结果并没有像我预期的那样结果 .
所以我有一个Renderscript的分配,它“覆盖”一个OpenCV Mat,基本上把它想象成一个三维数组,每个像素都有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将永远保持不变 .
在Code中它看起来像这样:
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以外的任何东西,绿色和它们的组合(例如红色变成深灰色/棕色,绿色变成泥黄色,紫色变成红色蓝色,所以红色消失,紫色变成蓝色 . 甚至白纸变成绿色色调) .
我还尝试仅通过Renderscript从相机输入直接流式传输并将信息存储在位图中,但结果最终相同 .
任何帮助将不胜感激! :-)
1 回答
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