static
public
void
decodeYUV420SP(
int
[] rgb,
byte
[] yuv420sp,
int
width,
int
height) {
final
int
frameSize = width * height;
for
(
int
j =
0
, yp =
0
; j < height; j++) {
int
uvp = frameSize + (j >>
1
) * width, u =
0
, v =
0
;
for
(
int
i =
0
; i < width; i++, yp++) {
int
y = (
0xff
& ((
int
) yuv420sp[yp])) -
16
;
if
(y <
0
) y =
0
;
if
((i &
1
) ==
0
) {
v = (
0xff
& yuv420sp[uvp++]) -
128
;
u = (
0xff
& yuv420sp[uvp++]) -
128
;
}
int
y1192 =
1192
* y;
int
r = (y1192 +
1634
* v);
int
g = (y1192 -
833
* v -
400
* u);
int
b = (y1192 +
2066
* u);
if
(r <
0
) r =
0
;
else
if
(r >
262143
) r =
262143
;
if
(g <
0
) g =
0
;
else
if
(g >
262143
) g =
262143
;
if
(b <
0
) b =
0
;
else
if
(b >
262143
) b =
262143
;
rgb[yp] =
0xff000000
| ((r <<
6
) &
0xff0000
) | ((g >>
2
) &
0xff00
) | ((b >>
10
) &
0xff
);
}
}
}
考虑到需要做识别,自然得先把它转成灰度图像,经典心理公式Gray = R*0.299 + G*0.587 + B*0.114出场了,但是手机的计算速度不那么快,这样的浮点运算还是尽量避免吧~ 于是考虑Gray = (R*299 + G*587 + B*114 + 500) / 1000或者Gray = (R*30 + G*59 + B*11 + 50) / 100。但是除法总是还是不够快,用移位吧……Gray = (R*19595 + G*38469 + B*7472) >> 16,稍微小一点,用Gray = (R*38 + G*75 + B*15) >> 7