2016-08-04 8 views
0

Я использую внутреннюю константу colormatrix от Renderscript, чтобы применить фильтр Sepia, однако он превращает все изображение в зеленый цвет, вместо того, чтобы придать ему желтоватый оттенок (Sepia). Ответ этой темы - моя текущая основа для тестирования (http://answers.opencv.org/question/99510/opencv4android-31-mat-to-allocation-renderscript/). Растровое изображение превращается в OpenCV Мат затем в Allocation и перешли на Renderscript где следующее внутреннее делает свою работу:Применение Sepia через Renderscript ScriptIntrinsicColorMatrix превращает изображение в оттенки зеленого

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); 

исключить ошибку в этой сложной Bitmap к мату процесса распределения, потому что, когда я пытался запустив встроенный Bitmap непосредственно через несколько недель назад, я получил ту же самую проблему с зеленым оттенком.

Я предполагаю, что это должен быть вектор (R, G, B, A), который затем умножается на Матрицу, которую я дал, но на пути должно происходить что-то подозрительное.

Кто-нибудь знает, что здесь происходит?

+0

является источником растрового изображения из файла или камеры? Если камера не должна быть в формате YUV? –

+0

Он исходит из растрового изображения из файла. Когда я сделал это несколько недель назад, я превратил OpenCV Mat rgba в Bitmap argb_8888 и получил ту же проблему. – AllBecomesGood

+0

Обновление: я получаю тот же странный зеленый оттенок при потоковой передаче непосредственно из Camerafeed и позволяя Renderscript делать преобразования (YUV в RGB, а затем применять colormatrix и преобразовывать в растровое изображение, чтобы показывать на экране). Я подозрительно отношусь к битмапсам, возможно, способ, которым он сохраняет пиксели, отличается и вызывает странность. – AllBecomesGood

ответ

0

OpenCV сохраняет изображения с использованием формата B-G-R, а не R-G-B один, так что, возможно, вам просто нужно поменять местами B и R каналы :)

+0

Если бы это было так просто! Спасибо за предложение! :) – AllBecomesGood

+0

Я пробовал, это общая недооцененная проблема – cmaster11