有人可以解释这个图像处理算法吗?

时间:2017-04-20 13:14:48

标签: android image-processing heartbeat

以下是用于图像处理的代码。我在一个应用程序中找到了这个代码,通过检查手指放在相机上时的红色强度来计算每分钟的心跳。我已经注意到几个需要图像处理的地方的decodeYUV方法。我在这里知道两件事:

  1. 什么是YUV以及为什么使用它?
  2. 算法如何找出红色的强度?
  3. ë

    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;
        }`
    

1 个答案:

答案 0 :(得分:0)

YUV是一种颜色模型。也许你熟悉RGB? 这与YUV将颜色信息与强度信息分开的主要区别相似。这在许多应用中都很有用。

有转换公式将YUV转换为RGB值。

算法如何计算出红色值是什么? 阅读代码,你就会知道。必要的数学逐行写下来......

为了提高您对代码的理解,我建议您至少阅读:

https://en.wikipedia.org/wiki/YUV

当然,转换章节对你特别感兴趣......