android camera拍照失真问题

项目中遇到各种失真,例如图片变绿,图片曝光严重,出现两个图片拼接的情况,这些问题都是偶然的,有些手机可能遇到的比较频繁,例如有个用户使用的是SM-G3502C手机,拼接图片频繁。但其他用户使用的这款手机木有问题。。。哪位大侠遇到过这些问题,快点给我留言呀,单身的英雄,我给你介绍个美丽的妹子大笑

下面是论坛上其他朋友的分析,但应用层我的apk中貌似没法操作系统camera中cpp的内容。有知道如何操作的分享一下,介绍妹子噢(*^__^*) 

http://bbs.csdn.net/topics/390252674

问题: 有没有谁对Android Camera 应用熟悉, Android 原生Camera 应用的全景预览画面有点失真, 颜色偏亮;比如, 深绿色的叶子, 在画面上是浅绿色, 好像覆盖一层亮白, 谁解决了?

建议:我碰到过, 这个是原生方案采用的参数不恰当导致的。

全景图像数据的处理是使用OpenGL 处理的, 你可以看下 Camea apk的 jni部分的源码, 找到文件:
jni/feature_mos/src/mosaic_renderer/YVURenderer.cpp

找到 成员函数 FragmentShaderSource()的定义, 该函数内部采用的从 RGBA 格式转YUV格式的矩阵参数选择不恰当, 如果你对相关 知识熟悉的话, 应该知道是有两组可选参数的, 分别用在静态图像和动态视频中。

相关转换知识请参考: http://www.fourcc.org/fccyvrgb.php

第一组:
Y  =      (0.257 * R) + (0.504 * G) + (0.098 * B) + 16

Cr = V =  (0.439 * R) - (0.368 * G) - (0.071 * B) + 128

Cb = U = -(0.148 * R) - (0.291 * G) + (0.439 * B) + 128

这是原生 camera 采用的这一种, 是不恰当的, 而且存在错误, 请看如下实际代码:
"const vec4 coeff_y = vec4(0.257, 0.594, 0.098, 0.063);\n"
 "const vec4 coeff_v = vec4(0.439, -0.368, -0.071, 0.500);\n"
 "const vec4 coeff_u = vec4(-0.148, -0.291, 0.439, 0.500);\n"

请看每一个向量定义中最后一维的值, 如果RGBA中alpha分量不为255, 必然导致 转换公式中最后的常量部分值不对, 这是错误, 既然是常量, 就不应该收alpha分量影响。

第二组:
y  = 0.299R+0.587G+0.114B
cr =  0.500R-0.419G-0.081B
cb =  -0.169R-0.331G+0.500B

这个是修正方案, 你可以采用这个; 不过需要注意, 这个转换公式不带常数, 因此转换矩阵的最后一维都设为0即可。

修改后:
 "const vec4 coeff_y = vec4(0.299, 0.587, 0.114, 0.0);\n"
 "const vec4 coeff_v = vec4(0.500, -0.419, -0.081, 0.0);\n"
 "const vec4 coeff_u = vec4(-0.169, -0.331, 0.500, 0.0);\n"

你可以试一下。

 

猜你喜欢

转载自gjhappyyy.iteye.com/blog/2191150
今日推荐