我使用Renderscript固有的颜色矩阵来应用Sepia滤镜,但它会将整个图像变成绿色,而不是黄色(Sepia)。这个线程的答案是我目前测试的基础(http://answers.opencv.org/question/99510/opencv4android-31-mat-to-allocation-renderscript/)。位图被转换为OpenCV Mat,然后转换为Allocation,并传递到renderscript上,其中以下内部函数起作用:
Element element = Element.RGBA_8888(mRS);
ScriptIntrinsicColorMatrix colorMatrix = ScriptIntrinsicColorMatrix.create(mRS, element);
final Matrix4f mSepia = new Matrix4f(new float[]{
0.189f, 0.769f, 0.393f, 0f,
0.168f, 0.686f, 0.349f, 0f,
0.131f, 0.534f, 0.272f, 0f,
0.000f, 0.000f, 0.000f, 1f});
colorMatrix.setColorMatrix(mSepia);
colorMatrix.forEach(inputAllocation, outputAllocation);
我排除了这个复杂的位图到垫子到分配过程中的一个错误,因为几周前我试图直接在位图上运行内部时,我遇到了完全相同的绿色色调问题。
我假设它应该是一个向量(R,G,B,a),然后乘以我给出的矩阵,但在这个过程中一定发生了一些可疑的事情。
有人知道这里发生了什么吗?
OpenCV使用B-G-R格式存储图像,而不是R-G-B格式,因此您可能只需要交换B和R通道:)
这已经花了很长时间,但我认为这只是输入矩阵的错误方法。我认为它必须转换。Renderscript只是希望输入的形式不同。