TSKumarage

Untitled

Sep 26th, 2020
850
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. @RequiresApi(api = Build.VERSION_CODES.O)
  2.     public void processHeartRate(){
  3.  
  4.         File videoFile = new File(getExternalFilesDir(null).toString()+ File.separator + "FingertipVideo.mp4");
  5.  
  6.         Uri videoFileUri = Uri.fromFile(videoFile);
  7.  
  8.  
  9.         MediaMetadataRetriever retriever = new MediaMetadataRetriever();
  10.  
  11.         retriever.setDataSource(videoFile.getAbsolutePath());
  12.  
  13.         ArrayList<Bitmap> bitMapArray = new ArrayList<Bitmap>();
  14.  
  15.         MediaPlayer mPlayer = MediaPlayer.create(getBaseContext(), videoFileUri);
  16.  
  17.         int millis = mPlayer.getDuration();
  18.  
  19.         Log.d("Status", ""+millis);
  20.  
  21.         Bitmap bitmap;
  22.         for(int i=0;i<millis;i+=100){
  23.             bitmap=retriever.getFrameAtTime(i,OPTION_CLOSEST_SYNC);
  24.             assert bitmap != null;
  25.  
  26.             bitMapArray.add(bitmap);
  27.  
  28.         }
  29.  
  30.         double redIntensity = 0.0;
  31.         int boxSize = 0;
  32.         ArrayList<Double> redColSignal = new ArrayList<Double>();
  33.         ArrayList<Double> redColDiffSignal = new ArrayList<Double>();
  34.  
  35.         Log.d("Status", "Processing Started HeartRate Video");
  36.         for(Bitmap frame:bitMapArray){
  37.  
  38.             redIntensity = 0.0;
  39.             boxSize = 0;
  40.             for(int x = (int)(frame.getWidth()*boxStart); x<(int)frame.getWidth()* boxEnd; x++)
  41.             {
  42.                 for(int y = (int)(frame.getHeight()*boxStart); y<(int)frame.getHeight()* boxEnd; y++)
  43.                 {
  44.                     redIntensity += frame.getColor(x, y).red();
  45.                     boxSize +=1;
  46.                 }
  47.  
  48.             }
  49.  
  50.             redColSignal.add(redIntensity/boxSize);
  51.  
  52.         }
  53.  
  54.         for(int i =0 ; i< redColSignal.size()-1; i++){
  55.  
  56.             redColDiffSignal.add(redColSignal.get(i+1) - redColSignal.get(i));
  57.  
  58.         }
  59.  
  60.         Log.d("Status", "Processing Completed HeartRate Video");
  61.         ArrayList<Double> movAVGVals = getMovAvgSignal(redColSignal, 15);
  62.         writeHeartRate(redColSignal);
  63.         int heartRate = rate( movAVGVals, 0.0001, 1,"hr");
  64.  
  65.         Log.d("Status", "Heart Rate:"+heartRate);
  66.     }
  67.     public ArrayList<Double> getMovAvgSignal(ArrayList<Double> signal, int windowSize){
  68.  
  69.         ArrayList<Double> movSignal = new ArrayList<Double>();
  70.         double movAverage = 0.0;
  71.  
  72.         for(int i =0 ; i< signal.size()-windowSize; i++){
  73.  
  74.             movAverage = 0.0;
  75.             for(int j =i ; j< i+windowSize; j++){
  76.  
  77.                 movAverage +=signal.get(j);
  78.  
  79.             }
  80.  
  81.             movSignal.add(movAverage/windowSize);
  82.  
  83.         }
  84.  
  85.         Log.d("Status", "Processing Completed Moving Average Signal");
  86.         return movSignal;
  87.     }
  88.  
  89.     public int rate(ArrayList<Double> signal, double delta, int windows, String signalType){
  90.         int rate = 0;
  91.         double majVoteRate = 0.0;
  92.         ArrayList<Double> peakRates = new ArrayList<Double>();
  93.         Log.d("Status", "Processing Started Peak Detection");
  94.  
  95.         for(int i =0; i<windows; i++)
  96.         {
  97.             int subStart = i*((int)(signal.size()/windows));
  98.             int subEnd = ((i+1)*((int)(signal.size()/windows)));
  99.             peakRates.add(getPeaksCount(signal.subList(subStart,subEnd), delta));
  100.         }
  101.         Log.d("Status", "Processing Completed Peak Detection");
  102.  
  103.         if(signalType.equals("hr")){
  104.  
  105.             rate = (int) ((60/45)* (windows*getNormRate(peakRates)));
  106.  
  107.         }
  108.  
  109.         if(signalType.equals("rr")){
  110.  
  111.             rate = (int) ((60/45)* (windows*getNormRate(peakRates)));
  112.  
  113.         }
  114.  
  115.         return rate;
  116.     }
  117.  
  118.     public double getPeaksCount(List<Double> signal, double delta){
  119.         Double maximum = null;
  120.         Double minimum = null;
  121.         int maximumCount = 0;
  122.         int minimumCount = 0;
  123.  
  124.  
  125.         boolean lookForMax = true;
  126.  
  127.         List<Integer> indices = new ArrayList<Integer>();
  128.         for (int i=0; i<signal.size(); i++) {
  129.             indices.add(i);
  130.         }
  131.  
  132.         Integer pos = 0;
  133.         for (Double value : signal) {
  134.             if (maximum == null || value > maximum ) {
  135.                 maximum = value;
  136. //                maximumPos = indices.get(pos);
  137.             }
  138.  
  139.             if (minimum == null || value < minimum ) {
  140.                 minimum = value;
  141. //                minimumPos = indices.get(pos);
  142.             }
  143.  
  144.             if (lookForMax) {
  145.                 if (value < maximum - delta) {
  146.                     maximumCount +=1;
  147.                     minimum = value;
  148. //                    minimumPos = indices.get(pos);
  149.                     lookForMax = false;
  150.                 }
  151.             } else {
  152.                 if (value > minimum + delta) {
  153.                     minimumCount +=1;
  154.                     maximum = value;
  155. //                    maximumPos = indices.get(pos);
  156.                     lookForMax = true;
  157.                 }
  158.             }
  159.  
  160.             pos++;
  161.         }
  162.         Log.d("Status", "Peak count & Size:"+maximumCount+" "+signal.size());
  163.         return maximumCount;
  164.     }
  165.  
  166.     public double getNormRate(ArrayList<Double> rates)
  167.     {
  168.         double majVoteRate =0.0;
  169.         for(double val: rates){
  170.             majVoteRate += val;
  171.         }
  172.  
  173.         return majVoteRate/rates.size();
  174.  
  175.     }
  176.  
RAW Paste Data