手指放在手機攝像頭和閃光燈前檢測心率的應用是什麼原理?

參考價值如何?
手機攝像頭輸出的圖像數據是否為60幀?為何可以檢測例如78這樣的心律,如果要達到78這樣的精度,手機攝像頭輸出的數據幀數至少應該為多少幀呢?

心電圖 - Cardiograph


很簡單,用高光(攝像頭旁的 LED 閃光燈,或者其他足夠亮的光源也可)照亮指尖皮下毛細血管,當心臟將新鮮的血液壓入毛細血管時,亮度(紅色的深度)會有輕微變化,通過攝像頭監測這一有規律變化的間隔,即可算出心跳了。

其實自己打開攝像頭 App,再讓閃光燈強制常亮,用肉眼也能看出輕微變化。不過這個 App 的創意很好,演算法做得也不錯,準確度還蠻高的。


攝像頭旁的補光燈做持續光源,手指緊貼攝像頭,感光元件能捕捉到透過皮膚與毛細血管折射的由補光燈產生的光線(就像用手指蓋著強光手電筒)。這樣毛細血管的搏動就能通過畫面明度的周期性變化反映出來。

用以上方法直接觀察畫面實時直方圖變化也能得到大致的心率。


http://v.youku.com/v_show/id_XNjc5MzQwNDYw.html
自己中午錄製的,可以明顯看到明暗變化。


哈哈,被評論秒殺。

單位(每秒/每分種)搞錯,0分摺疊吧。

排名靠前的幾個答案已經很好的回答了如何通過攝像頭來採集心律數據的原理,我這裡來嘗試下回答題主的後半個問題:圖像數據如果是60幀,為何可以檢測例如78這樣的心律?

這個問題可以用信號處理里的sampling theorem來回答。如果圖像數據是60幀/秒,能採樣的基帶信號頻率理論上不能超過30Hz(Nyquist limit)。因為任何高於30Hz的信號由於aliasing的關係都會和相對應的某個低頻信號(31Hz &<--&>1Hz)無法區分。舉個極端的例子,如果基帶信號正好是60Hz,採樣率也是60Hz,那麼這個基帶信號在採樣以後將是一個常數信號,因為60Hz被alias成了0Hz。電影電視中的車輪螺旋槳慢速旋轉甚至反轉都是一個原理。

但是為什麼這app能測出78的心律呢。我覺得這是一個典型的bandpass sampling的情況。如果輸入信號的頻譜有一個區間範圍,假設我們知道人的心律範圍肯定是在60Hz-90Hz之間,那麼就可以投機取巧了,還是用60Hz的採樣率(而不是基帶Nyquist limit 90Hz * 2 = 180Hz),找出採樣後信號的自有頻率後(比如是18Hz),反推在有效的心律範圍內哪個頻率會被alias到這個頻率,得到原有信號的頻率成分(在60-90Hz內只有78Hz會被alias成18Hz)。

嚴格的bandpass sampling需要滿足的條件是存在自然數n,使得原有信號的頻率範圍在[n * fs/2, (n+1) * fs/2]之間。


他最原始的原理應該是「光電容積脈搏波描記法」
———————————————以下是介紹———————————————
光電容積脈搏波描記法(PhotoPlethysmoGraphy PPG)是借光電手段在活體組織中檢測血液容積變化的一種無創檢測方法 當一定波長的光束照射到指端皮膚表面時 光束將通過透射或反射方式傳送到光電接收器 在此過程中由於受到指端皮膚肌肉和血液的吸收衰減作用 檢測器檢測到的光強度將減弱 其中皮膚肌肉 組織等對光的吸收在整個血液循環中是保持恆定不變的,而皮膚內的血液容積在心臟作用下呈搏動性變化 當心臟收縮時外周血容量最多 光吸收量也最大 檢測到的光強度最小; 而在心臟舒張時 正好相反 檢測到的光強度最大使光接收器接收到的光強度隨之呈脈動性變化 將此光強度變化信號轉換成電信號 便可獲得容積脈搏血流的變化。
———————————————————————————————————
一、因為手機閃光燈發光的波長不可控,而且手機攝像頭往往有一層膜來濾除紅外線。也就是說,通過手機攝像頭檢測到的的圖像明暗變化是可見光在手指上透過光線多少的反映。
如下圖:

從左到右,依次是手機直接拍攝到的圖片,轉換後的灰度圖和灰度線性展開的圖,下面兩個是對應上方灰度圖的灰度分布圖。

二、因為心臟將血液泵至肺部時,對四肢末端(手指)的血液含量(瞬時血壓)影響不大,而且靜脈血液較平緩,所以這樣說吧,,,心臟將混合了氧氣的新鮮血液泵至動脈時,才會對手指處血管容積造成較大影響。(動脈血的非脈動部分、 靜脈血和毛細管血部分以及肌肉組織等三部分的對光線的吸收而對拍攝畫面造成的明暗變化的影響,幾乎不會被攝像頭檢測到,或者說被人眼察覺到)。

所以說了這麼一堆,就是說由該方法測得量,準確的說是脈率的數值,而脈搏是有心跳引起的,所以等於心率。但是基於此種方法,幾乎不能繪出心電圖像。只能得到脈率的圖像。而且圖像還很不準確。

心電監護儀畫面:脈率74

由畫面全部幀灰度值之和作為因變數,時間作為自變數繪製的脈率圖像

——————看起來和心電監護儀的脈率圖像還挺像的吧,不過和心率圖像就差的遠啦,啦,啦

3、再說說60幀圖像和70+心率的問題。
上面這個脈率圖像是我用手機攝像模式直接拍的視頻繪出來的(幀率:24/s)。
心率的單位是 每分鐘,而幀率是 每秒。拍攝一分鐘就有多少幀呢?24×60=1440幀。
所以呢,就算心率跳的比博爾特還快,攝像的採樣率也足夠COVER啦。(相關知識:採樣定理)
-------------------------------------------分割線---------------------------------------------------

波形圖忘記了翻轉,其實應該是下面這個樣子的(有主波,潮波和重播波)


閃光燈照亮毛細血管,手指覆蓋在攝像頭上通紅一片,紅色會隨著心跳周期性地變暗,通過RGB值可以對心跳進行測量


心率監測App實際是Photoplethysmogram的一種應用,在沒有其他光線干擾並且手指固定不動的情況下60fps足夠應付採樣計算。
實現起來也不難,有興趣可以參考一下:https://github.com/chroman/HeartBeats

這類app的進化型是直接面對攝像頭即可測出心率和呼吸頻率的What"s My Heart Rate,準確度還驚人的高。


每分鐘78下,頻率為1.3HZ,根據奈奎斯特定理,2倍頻率2.6HZ即可採樣,也就是每秒2.6幀。


大家回答難道都沒有發現樓主的一點混淆之處嗎?60幀時間單位一般是每秒,而78的心率絕大多數情況下都是1分鐘的,相當於1.3/s,所以一般的手機攝像頭完全可以應付。人眼的閾值是24幀/s,高於這個就會覺得流暢,反之會覺得卡頓,越低越卡


攝像頭的輸出圖像的頻率是frame per second,心率則是 次/分鐘,所以60fps是足夠測試心率的


[猜測補充] : 採集的數據是通過 攝像頭在閃光燈照亮毛細血管所形成的視頻,對視頻解析幀,對每幀的RGB值進行一定的演算法取值 (比如求均值)。 對所有幀的取值按時間繪製成時域, 做 FTT(快速傅里葉變換) 可以算得心率。 @丁科


嗯,舉個例子吧。
之前班上有個黑哥們,看我在測心跳,他也要試試。結果就是,怎麼都測不出來。


寫過類似的東東。用五點取樣。畫質差點沒事。這兩點能節省很多內存,千萬不要以為高解析度有多好內存會嚇死你的(?ω?)然後不要截取RGB 用hsb明度值取平均值,rgb並沒有什麼差別。最後一步進行濾波操作,去掉一些偽波峰差不多了。聖誕快樂


難道沒有人覺得很燙?


大家都說得差不多。

補充:脈搏使得皮薄(透光性較好)的手指擋住的CMOS感測器接受的信號呈現如波浪般的周期性變化。但該信號需要經過處理。如app開始的前幾秒鐘里先收集幾組數據,設好參數(最高值、最低值、放大倍數等),然後以即時圖像的形式呈現出來(我用的是Heart Rate)。

本科的時候用發光二極體和光感應器插在硬泡沫里,然後套在手指上做過一project,原理相同,只是得到的電壓信號只有5個毫伏,用幾個運放進行濾波/放大後,可以整成方波,最後可以實現計數。


其實很簡單。
血液在皮膚下流動時由於心臟的收縮會產生壓力的變化,從而改變血液的瞬間濃度變化,攝像頭可以在閃光燈的照射下檢測到亮度的變化,從而判斷心臟的收縮頻率,可以算出心率。


然而我現在在刷知乎,我也想知道為什麼。


心率單位是BPS, beats per minute, 而60HZ是 samples per second。足夠了。


第一次上知乎,就為了來問這個問題,沒讓我失望,學習了!!


血管隨著心臟舒張收縮。然後靜脈血液顏色因為含氧量的區別顏色變化了。通過led和攝像頭當然就能檢測到這種變化。分析數據就可以得知心率了


推薦閱讀:

腳上磨的泡是否應該主動挑破?
為什麼黑生物的多是內行,而黑中醫的多是外行呢?
死亡筆記中心臟麻痹真的連四十秒都扛不住么?
心肌炎恢復後如何提升身體素質?

TAG:iPhone | iOS應用 | iOS開發 | Android | 醫學 |