2016-09-08 8 views
0

Я думаю, что я должен не понимать, как работает Renderscript для применения colormatrix, потому что мои результаты не получаются так, как я ожидаю.Renderscript Colormatrix intrinsic - Помогите мне разобраться

Итак, у меня есть распределение для Renderscript, которое «накладывает» на OpenCV Mat, в основном представляя его как трехмерный массив, полный пикселей, где каждый пиксель имеет значения RGBA (красный, зеленый, синий, альфа).

Так что я хочу, чтобы применить 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 

Так что я ожидаю, чтобы это произошло, что новый вектор 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'. А всегда будет оставаться прежним.

В кодексе это выглядит следующим образом:

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, но мой результат обычно такая странная, например, эта матрица не должна влиять ни на что иное, кроме красного, зеленого и их комбинаций (например, красный цвет становится темным оттенком серого/коричневого цвета, зеленый становится грязно-желтым, а фиолетовый - красным + синим, поэтому красный цвет исчезает и пурпурный становится только синим. Даже белая бумага получает зеленоватый оттенок).

Original, Expected and Renderscript

Я также попытался прямой потоковой передачи из канала камеры только через и хранение информации в Bitmaps Renderscript, но результаты в конечном итоге то же самое.

Любая помощь была бы принята с благодарностью! :-)

ответ

2

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

+0

Вы спасатель! – AllBecomesGood

 Смежные вопросы

  • Нет связанных вопросов^_^