1. 程式人生 > >Android模擬實現檢測心率變化

Android模擬實現檢測心率變化

當今,市面上有了一些可以通過Android應用來檢測病人心率,血壓,體溫,等等,一系列方便人們日常生活的Android手機應用。那麼,這些實用的手機應用程式是怎麼做出來的呢?那麼,今天,我就給大家奉上一個很有意思的應用,那就是Android上模擬實現檢測心率的變化。我利用Android模擬實現了通過手機攝像頭來感知使用者指尖毛細血管的變化來檢測心率的功能。哇哦,聽起來是不是很高大上呢?瞬間對這個功能充滿了膜拜與好奇,有木有?!有木有呢?!哈哈,那就讓我們一起來實現這些功能吧。

一、原理

首先我們還是要講講這個應用的原理吧,在下認為,要做一個Android應用程式,咱們還要先弄懂它的實現原理吧。不然,看了半天各位都不知道這個應用是基於什麼原理做的呢。是吧,那就讓我們一起來分析下它的實現原理。

通過攝像頭來獲得心率,搜了一下這個技術真不是噱頭,據說在iPhone早有實現,主要原理是:當開啟軟體時,手機的閃光燈也會被自動開啟,使用者將手指放在攝像頭上時,指尖皮下血管由於有血液被壓入,被光源照射的手指亮度(紅色的深度)會有輕微的變化。這個過程可以憑藉感光元件捕捉到。這樣毛細血管的搏動就能通過畫面明度的週期性變化反映出來。

好了,原理說完了,大家有木有看懂呢?

二、實現

1、建立影象處理類ImageProcessing

這個類主要提供處理影象本身的方法。

具體實現如下:

  1. package com.lyz.monitor.utils;  
  2. /** 
  3.  * 影象處理類 
  4.  * @author liuyazhuang 
  5.  * 
  6.  */
  7. publicabstractclass ImageProcessing {  
  8.     /** 
  9.      * 內部呼叫的處理圖片的方法 
  10.      * @param yuv420sp 
  11.      * @param width 
  12.      * @param height 
  13.      * @return 
  14.      */
  15.     privatestaticint decodeYUV420SPtoRedSum(byte[] yuv420sp, int width,int height) {  
  16.         if (yuv420sp == null)  
  17.             return0;  
  18.         finalint frameSize = width * height;  
  19.         int sum = 0;  
  20.         for (int j = 0, yp = 0; j < height; j++) {  
  21.             int uvp = frameSize + (j >> 1) * width, u = 0, v = 0;  
  22.             for (int i = 0; i < width; i++, yp++) {  
  23.                 int y = (0xff & ((int) yuv420sp[yp])) - 16;  
  24.                 if (y < 0)  
  25.                     y = 0;  
  26.                 if ((i & 1) == 0) {  
  27.                     v = (0xff & yuv420sp[uvp++]) - 128;  
  28.                     u = (0xff & yuv420sp[uvp++]) - 128;  
  29.                 }  
  30.                 int y1192 = 1192 * y;  
  31.                 int r = (y1192 + 1634 * v);  
  32.                 int g = (y1192 - 833 * v - 400 * u);  
  33.                 int b = (y1192 + 2066 * u);  
  34.                 if (r < 0)  
  35.                     r = 0;  
  36.                 elseif (r > 262143)  
  37.                     r = 262143;  
  38.                 if (g < 0)  
  39.                     g = 0;  
  40.                 elseif (g > 262143)  
  41.                     g = 262143;  
  42.                 if (b < 0)  
  43.                     b = 0;  
  44.                 elseif (b > 262143)  
  45.                     b = 262143;  
  46.                 int pixel = 0xff000000 | ((r << 6) & 0xff0000)  
  47.                         | ((g >> 2) & 0xff00) | ((b >> 10) & 0xff);  
  48.                 int red = (pixel >> 16) & 0xff;  
  49.                 sum += red;  
  50.             }  
  51.         }  
  52.         return sum;  
  53.     }  
  54.     /** 
  55.      * 對外開放的影象處理方法 
  56.      * @param yuv420sp 
  57.      * @param width 
  58.      * @param height 
  59.      * @return 
  60.      */
  61.     publicstaticint decodeYUV420SPtoRedAvg(byte[] yuv420sp, int width,  
  62.             int height) {  
  63.         if (yuv420sp == null)  
  64.             return0;  
  65.         finalint frameSize = width * height;  
  66.         int sum = decodeYUV420SPtoRedSum(yuv420sp, width, height);  
  67.         return (sum / frameSize);  
  68.     }  
  69. }  

2、MainActivity實現

為了簡單,我沒有單獨新建別的類來分解這些功能,我直接在MainActivity中實現了這些功能,那麼我們就一起來看看是如何一步步實現的吧。

(1)程式中用到的屬性

首先,我們來看看程式中定義了哪些屬性欄位,來實現這些功能吧。

具體屬性欄位如下所示:

  1. //曲線
  2. private Timer timer = new Timer();  
  3. //Timer任務,與Timer配套使用
  4. private TimerTask task;  
  5. privatestaticint gx;  
  6. privatestaticint j;  
  7. privatestaticdouble flag=1;  
  8. private Handler handler;  
  9. private String title = "pulse";  
  10. private XYSeries series;  
  11. private XYMultipleSeriesDataset mDataset;  
  12. private GraphicalView chart;  
  13. private XYMultipleSeriesRenderer renderer;  
  14. private Context context;  
  15. privateint addX = -

    相關推薦

    Android模擬實現檢測心率變化

    當今,市面上有了一些可以通過Android應用來檢測病人心率,血壓,體溫,等等,一系列方便人們日常生活的Android手機應用。那麼,這些實用的手機應用程式是怎麼做出來的呢?那麼,今天,我就給大家奉上一個很有意思的應用,那就是Android上模擬實現檢測心率的變化

    原生js實現檢測物件變化

    最近這段時間,前端開發開始逐漸模組化,一些MVC、MVVM等框架比較流行,比如angular、vue、react;這三個框架比較相似的有一點就是資料的雙向繫結,檢視的更新導致相應資料變化,資料的改變引起檢視的變化。像這種魔法的操作是怎麼實現的呢?像angular則是採用了‘

    Android移動開發檢測網路狀態並使用BroadcastReceiver(廣播接收者)進行接收網路變化的後續處理

    在Android開發中,許多功能需要網路連線,所以在開發過程中需要進行手機網路的檢測。而每做一個App,就要進行檢測,那麼我直接將檢測網路狀態的功能封裝成一個類。 檢測網路狀態所需要的Api: ConnectivityManager主要用於檢視網路狀態和管理網路連線相關的

    android實現檢測app是否有通知許可權,沒有就跳轉去設定,設定成功返回時並測試發出一條通知訊息

    1.判斷是否有通知許可權 2.沒有的話,彈出一個對話方塊,提示使用者是否去設定,使用者點選確定後跳轉到設定頁面 3.手動設定許可權成功後,結果會返回到 onActivityResult方法中,其中返回的請求碼等於傳入的碼時,並且結果碼等於2,編輯正確設定了,此時就可以呼

    torch平臺上利用K-means方法實現SAR影象變化檢測

    1 SAR影象變化檢測步驟 :   首先獲取原始SAR影象的對數比值影象,再利用kmeans方法對比值影象的畫素值進行聚類,聚成2類,由此得到粗略的變化檢測結果. 2 K-means聚類演算法

    Android模擬 HTTP multipart/form-data 請求協議資訊實現圖片上傳

    轉自:http://www.linuxidc.com/Linux/2011-08/41944.htm 問題: Android應用中,當遇到填寫使用者資訊、發表評論等操作,不可避免會遇到“form表單操作”(類似web form操作)上傳圖片的功能。 在這種情況下,使用

    2014-11-6Android學習------Android 模擬翻頁效果實現--------貝塞爾曲線(二)

    寫一篇文章很辛苦啊!!! 轉載請註明,聯絡請郵件[email protected] 我學習Android都是結合原始碼去學習,這樣比較直觀,非常清楚的看清效果,覺得很好,今天的學習原始碼是網上找的原始碼 百度搜就知道很多下載的地方  網上原始碼的名字叫:A

    Android模擬點選螢幕,實現按鍵精靈點選螢幕功能

    我在實現安卓模擬點選螢幕固定位置時嘗試了很多方法,碰了不少壁,現在我將我實現的方法分享給大家,以及我嘗試過的方法也分享給大家,讓大家在開發的路上少走些彎路。 首先我嘗試用安卓輔助功能AccessibilityService類實現模擬螢幕點選,但是這個類只能找到頁面的控制元件,然後對控制元件進行模

    Android app實現自更新和安裝,許可權檢測適配Android6.0以下和Android6.0和Android7.0和Android8.0總結篇

    首先下載問檔案需要在AndroidManifest.xml裡新增SD卡讀寫許可權,下面兩個許可權:<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> <us

    android——自動檢測網路變化,斷網彈出對話方塊提示

    一、首先,建立一個類繼承BroadcastReceiver,重寫onReceive 方法 在onReceive方法中新增操作程式碼 二、在MainActivity中添加註冊操作 三、別忘了,在AndroidManifest.xml中新增許可權 <

    android 模擬器 實現 打電話 發簡訊的模擬狀態

    之前有哥們也寫過這個東西,這次重新寫的主要原因是那哥們 我按照他的東西做了後發現還是不行,這次就當對那哥們的一個補充吧。具體步驟:首先,我們要啟動兩個android模擬器。只有這樣,才能模擬效果。1.第一個模擬器,我們通過eclipse啟動。具體方法是:開啟你的eclipse,隨便執行一個專案。Eclipse

    Android模擬位置實現

    今天,我們就使用Android自帶的模擬位置功能來實現。 準備工作: 1:設定-開發者選項-允許模擬位置 打鉤 2:我這裡使用了百度地圖,所以需要去申請一個地圖的key。傳送門申請key 3:定位方式修改成 僅限GPS 4:不是所有軟體的GPS都能

    Mac 上使用 Shell 指令碼 + adb shell 實現簡單的 Android 模擬點選自動化測試

    需求 在 A 介面,點選跳轉到 B 介面(該介面會執行一些業務),再點選返回鍵出現 Dialog 彈窗,點選確認退出按鈕,返回 A 介面。不斷迴圈。 思路 一開始想到的就是按鍵精靈,下了 mac 版使用後發現功能太不完善,於是試了試 Windows 版

    Android FaceDetector實現人臉檢測,人臉追蹤(框出人臉)(MVP模式)

    一 主要流程: 1.通過FaceDetector類來檢測人臉,返回獲取到的人臉資訊,以及人臉的座標,通過人臉座標可以做人臉追蹤的操作。 2.通過兩個surfaceview,一個surfaceview用來做相機的預覽,另外一個surfaceview附著在相機預覽surface

    《老羅Android》監聽電量變化、Broadcast實現開機啟動

    1. Broadcast監聽電量變化    如果我們閱讀軟體,可能是全屏閱讀,這個時候使用者就看不到剩餘的電量,我們就可以為他們提供電量的資訊。要想做到這一點,我們需要接收一條電量變化的廣播,然後獲取百分比資訊.public class MainActivity exten

    Android單點登入的模擬實現

    介紹一個實現單點登入的方法:通過多個應用之間共享SharedPreference檔案來獲取相應的登入狀態,從而實現單點登入的功能。 一、實現SharedPreference檔案共享的條件 1、要實現SharedPreference檔案的共享,需要將被共享的應用的Sha

    android opencv實現人臉檢測 以及 年齡和性別識別

    支援技術分享,轉載或複製,請指出文章來源此部落格作者為Jack__0023 1、背景 因為面對的場景不同,所以我上次使用 andr

    python基礎作業------模擬實現一個ATM + 購物商城程序

    setting water 轉賬 atm 結算 pan auth hide use 模擬實現一個ATM + 購物商城程序 作業需求: 額度 15000或自定義 實現購物商城,買東西加入 購物車,調用信用卡接口結賬 可以提現,手續費5% 每月22號出賬單,每月10號為還款日

    Android 4.1 Audio系統變化說明

    興趣 oop cau none bstr sta 解決 應用 sco 轉自Android 4.1 Audio系統變化說明 Android 4.1,英文代號簡稱JB。在國人眼裏,JB這個詞還和動物有點關系。Google如此頻繁修改Android,終於推出了一個可以被大

    模擬實現簡化版List叠代器&嵌入List

    元素 sort 可能 節點數 != ring type 部分 分配 1、叠代器(iterators)概念(1)叠代器是一種抽象的設計概念,其定義為:提供一種方法,使他能夠按順序遍歷某個聚合體(容器)所包含的所有元素,但又不需要暴露該容器的內部表現方式。 (2)叠代器是一種行