Hier ist der Code für die Bildverarbeitung. Ich fand diesen Code in einer App, die Herzschläge pro Minute berechnet, indem die Intensität der roten Farbe überprüft wird, wenn der Finger auf die Kamera gelegt wird. Ich habe die decodeYUV-Methode an mehreren Stellen bemerkt, an denen Bildverarbeitung erforderlich ist. Ich möchte zwei Dinge hier wissen:Kann jemand diesen Bildverarbeitungsalgorithmus erklären?
- Was ist YUV und warum wird es verwendet?
- Wie funktioniert der Algorithmus, um die Intensität von Rot herauszufinden?
e
private static int decodeYUV420SPtoRedSum(byte[] yuv420sp, int width, int height) {
if (yuv420sp == null) return 0;
final int frameSize = width * height;
int sum = 0;
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 & 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;
int pixel = 0xff000000 | ((r << 6) & 0xff0000) | ((g >> 2) & 0xff00) | ((b >> 10) & 0xff);
int red = (pixel >> 16) & 0xff;
sum += red;
}
}
return sum;
}`
https://www.google.com/search?q=YUV+color und https://en.wikipedia.org/wiki/YUV –