美文网首页
测量心跳

测量心跳

作者: 上行彩虹人 | 来源:发表于2018-09-25 10:58 被阅读4次
 public abstract  class ImageProcessing {

        /**
         * 内部调用的处理图片的方法
         * @param yuv420sp
         * @param width
         * @param height
         * @return
         */
        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 & ((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;

                    int pixel = 0xff000000 | ((r << 6) & 0xff0000)
                            | ((g >> 2) & 0xff00) | ((b >> 10) & 0xff);
                    int red = (pixel >> 16) & 0xff;
                    sum += red;
                }
            }
            return sum;
        }

        /**
         * 对外开放的图像处理方法
         * @param yuv420sp
         * @param width
         * @param height
         * @return
         */
        public static int decodeYUV420SPtoRedAvg(byte[] yuv420sp, int width,
                                                 int height) {
            if (yuv420sp == null)
                return 0;
            final int frameSize = width * height;
            int sum = decodeYUV420SPtoRedSum(yuv420sp, width, height);
            return (sum / frameSize);//返回每个点的像素值
        }


}

private static PreviewCallback previewCallback = new PreviewCallback() {
        public void onPreviewFrame(byte[] data, Camera cam) {
            if (data == null)
                throw new NullPointerException();
            Camera.Size size = cam.getParameters().getPreviewSize();
            if (size == null)
                throw new NullPointerException();
            if (!processing.compareAndSet(false, true))
                return;
            int width = size.width;
            int height = size.height;
            //图像处理
            int imgAvg = ImageProcessing.decodeYUV420SPtoRedAvg(data.clone(),height,width);
            gx=imgAvg;
            text1.setText("平均像素值是"+String.valueOf(imgAvg));
            //像素平均值imgAvg,日志
            //Log.i(TAG, "imgAvg=" + imgAvg);
            if (imgAvg == 0 || imgAvg == 255) {
                processing.set(false);
                return;
            }
            //计算平均值
            int averageArrayAvg = 0;
            int averageArrayCnt = 0;
            for (int i = 0; i < averageArray.length; i++) {
                if (averageArray[i] > 0) {
                    averageArrayAvg += averageArray[i];
                    averageArrayCnt++;
                }
            }
            //计算平均值
            int rollingAverage = (averageArrayCnt > 0)?(averageArrayAvg/averageArrayCnt):0;
            TYPE newType = currentType;
            if (imgAvg < rollingAverage) {
                newType = TYPE.RED;
                if (newType != currentType) {
                    beats++;
                    flag=0;
                    text2.setText("脉冲数是"+String.valueOf(beats));
                    //Log.e(TAG, "BEAT!! beats=" + beats);
                }
            } else if (imgAvg > rollingAverage) {
                newType = TYPE.GREEN;
            }

            if (averageIndex == averageArraySize)
                averageIndex = 0;
            averageArray[averageIndex] = imgAvg;
            averageIndex++;

            // Transitioned from one state to another to the same
            if (newType != currentType) {
                currentType = newType;
                //image.postInvalidate();
            }
            //获取系统结束时间(ms)
            long endTime = System.currentTimeMillis();
            double totalTimeInSecs = (endTime - startTime) / 1000d;
            if (totalTimeInSecs >= 2) {
                double bps = (beats / totalTimeInSecs);
                int dpm = (int) (bps * 60d);
                if (dpm < 30 || dpm > 180||imgAvg<200) {
                    //获取系统开始时间(ms)
                    startTime = System.currentTimeMillis();
                    //beats心跳总数
                    beats = 0;
                    processing.set(false);
                    return;
                }
                //Log.e(TAG, "totalTimeInSecs=" + totalTimeInSecs + " beats="+ beats);
                if (beatsIndex == beatsArraySize)
                    beatsIndex = 0;
                beatsArray[beatsIndex] = dpm;
                beatsIndex++;
                int beatsArrayAvg = 0;
                int beatsArrayCnt = 0;
                for (int i = 0; i < beatsArray.length; i++) {
                    if (beatsArray[i] > 0) {
                        beatsArrayAvg += beatsArray[i];
                        beatsArrayCnt++;
                    }
                }
                int beatsAvg = (beatsArrayAvg / beatsArrayCnt);
                text.setText("您的的心率是"+String.valueOf(beatsAvg)+"  zhi:"+String.valueOf(beatsArray.length)
                        +"    "+String.valueOf(beatsIndex)+"    "+String.valueOf(beatsArrayAvg)+"    "+String.valueOf(beatsArrayCnt));
                //获取系统时间(ms)
                startTime = System.currentTimeMillis();
                beats = 0;
            }
            processing.set(false);
        }
    };

    /**
     * 预览回调接口
     */

相关文章

  • 测量心跳

  • 救命药

    今年6月份儿的时候,突然有几天心跳过速,胸口发闷,心慌意乱,用仪器测量心跳每分钟110下,我跟和我关系不错的惠芳阿...

  • 时光波 | 心 - 血管的诊断

    心 - 血管诊断 心率异常测量 什么是心率变异性? 心脏不规律跳动。 两次心跳之间的间隔跳动节拍变化以及心脏频率。...

  • 2018-01-04 - 要相信自己没有病

    自从格外关注自己的健康,尤其是心脏健康以来,完全没有生活质量可言。 走路像乌龟?挪动,需要反复测量心跳。可惜那个F...

  • 什么是良好的敏捷开发?

    测量软件的开发策略 测量产生价值的时间 测量编码时间 测量缺陷密度 测量发现缺陷的时间 测量功能的客户价值 测量未...

  • 常用英语单词分类速记(111)

    Measure 测量 Measure 测量(动) Measure 计量单位/测量标准 Measurement 测量...

  • 明日隔山岳,世事两茫茫

    昨天,我的一个室友突然心跳得非常快,心里感觉特别慌。于是宿管阿姨让我们几个把她带去医务室,校医测量后发现她...

  • 新生儿的日常护理

    掌握测量新生儿的方法, 身长测量 体重测量 头围测量 胸围测量。 腹围测量。 前囟测量。如果前囟数值小于一厘米或大...

  • 《测绘科学》投稿信息、投稿须知、投稿范例

    征稿范围 本刊主要刊载大地测量、工程测量、摄影测量、遥感、地图学、海洋测量、矿山测量、地籍测绘、地理信息系...

  • 二建公路笔记 公路工程施工测量工作要求

    一、控制测量 控制性桩点,应进行现场交桩 精度高:GPS测量、导线测量、三角测量、三边测量,路线平面宜采用导线测量...

网友评论

      本文标题:测量心跳

      本文链接:https://www.haomeiwen.com/subject/qobkoftx.html