Tham dự Tech Lounge

Tham dự Tech Lounge


Nguyên lý đo nhịp tim bằng camera điện thoại

khuongnguyen.ict
10/7/2016 8:58Phản hồi: 3
Em là sinh viên năm cuối, chuẩn bị làm đồ án tốt nghiệp. Em đã chọn đề tài từ thầy hướng dẫn: "Xây dựng phần mềm đo nhịp tim thông qua camera điện thoại trên hệ điều hành Android." Đồ án sẽ liên quan đến lập trình Java trên Android thì em có biết chút ít, nhưng phần đọc và sử lý ảnh thì em mù tịt nên chưa có giải thuật rõ ràng cho bài toán này.
Em thấy trên Store đã có những phần mềm tương tự (Instant Heart Rate, Runstatic Heart Rate) đo được theo nguyên lý này và độ chính xác khá cao, chỉ sai khoảng 2 - 3 nhịp/phút. Không biết họ dùng giải thuật xử lý ảnh gì cho bài toán này. Anh chị nào đã làm sử lý anh cho em xin một vài gợi ý, hoặc từ khóa.
Em cảm ơn nhiều ạ.
3 bình luận
Chia sẻ

Xu hướng

Mình đã viết phần mềm đo nhịp tim bằng camera điện thoại và đèn flash giống như dự án mà bạn miêu tả. Phần mềm của mình (Me Fitness) đã lên Play Store, độ chính xác 95% đo được vào khoảng 2-3 nhịp /phút.

Để làm được phần mềm này, theo mình là không khó, bạn chỉ cần có kiến thức cơ bản về sử lý ảnh, lập trình Android trên Android Studio và một chút về Matlab. Nếu bạn biết Matlab và sử lý ảnh trên Matlab thì thời gian xây dựng và thử nghiệm thuât toán của bạn sẽ rút ngắn đi rất nhiều, vì Matlab có nhiều hàm sử lý ảnh đã build sẵn, vẽ đồ thị, sử lý mảng và ma trận… bạn chỉ việc gọi hàm ra sài.

Mình sẽ hướng dẫn bạn trình tự thuật toán mà mình đã làm để xây dựng nên phần mềm này như sau:

1. Camera điện thoại và đèn flash:


Tín hiệu từ camera điện thoại, khi bật đèn flash lên sẽ như thế này.

Đỏ chót, chả nhìn thấy gì. Nhưng nếu bạn để ý kỹ hơn, sẽ thấy phần bên trái của bức hình có màu nhạt hơn phần bên phải. Nguyên nhân là do camera của mình có đèn flash phía dưới. Phần ngón tay gần đèn flash sẽ sáng hơn. Đó chính là cơ sở để bạn phân tích nhịp tim từ dữ kiện này.

2. sử lý ảnh:


Trong thuật toán của phần mềm Me Fitness, mình đổi màu bức ảnh từ RGB sang Gray, bạn có thể làm điều này trên Matlab rất dễ dàng thông qua hàm Gray = rgb2gray(data);

Nhưng dữ liệu nhìn từ Gray cũng không khá hơn dữ liệu màu đỏ trên là bao nhiêu, nên bạn cần làm thêm một bước nữa: chuyển dữ liệu từ gray sang Black – White.

Mình thực hiện bước này trên Matlab với hàm bw = im2bw(Gray,thresh) để chuyển ảnh gray sang ảnh Black – White với ngưỡng thresh=60 cho hình ảnh xuất ra từ máy Nexus 5 thì ảnh chuyển đổi được như sau:



Khá rõ ràng rồi phải không. Từ chuỗi những hình ảnh đen trắng này, bạn có thể tính toán được nhịp tim rồi.

Trong thuật toán của mình, mình sẽ đếm số điểm đen xuất hiện trên hình ảnh, kèm theo thời gian xuất hiện, mình thu được đồ thị như sau:


3. Phân tích dữ liệu số:


Đến bây giờ thì bài toán dễ dàng quá rồi phải không? Như phần mềm Instant Heart Rate thì nó đếm số điểm peak-to-peak rồi tính ra nhịp tim. Đây là 1 cách làm hay nhưng cách này khá rắc rối. Mình xem source code của phần mềm thì nó cần 4 class lên đến cả ngàn dòng code để thực hiện công việc này.
Bản chất dữ liệu thu được là một dao động theo giời gian. Mình là gốc là dân cơ khí BK, đã làm khá nhiều về phân tích dao động nên mình làm cách khác đơn giản hơn nhiều mà vẫn đảm bảo độ chính xác: thực hiện phép biển đổi Fourier rời rạc cho dãy số này. Toàn bộ phần nhân giải thuật của chương trình viết trên Java chỉ gói gọn trong khoảng 100 dòng code. Do vậy nếu bạn làm theo giải thuật của mình thì chương trình của bạn sẽ rất đơn giản.

Trong Matlab, bạn thực hiện công việc này chỉ với 1 dòng lệnh:

Y = fft(day_so);

Và kết quả sẽ như thế này:

Trên Java, bạn có thể sử dụng class này để tính biến đổi Fourier nhanh FFT, cho ra kết quả rất nhanh. http://introcs.cs.princeton.edu/java/97data/FFT.java.html


Từ kết quả trên, bạn có thể thấy nhịp tim tìm được là 1.6Hz, hay 96 nhịp/phút. Kết quả này có độ chính xác khá cao vì đỉnh tại vị trí 1.6 Hz cao hơn hẳn các giá trị nền xung quanh. Kết quả này sai khác với kết quả mình đo từ máy Omron khoảng 1-3 nhịp trên phút. Điều này cũng phù hợp với thực tế là nhịp tim của bạn luôn thay đổi dù là bạn đang ngồi không gõ code.

Hi vọng giải thuật của mình có thể giúp bạn hoàn thành đồ án.

Bạn có thể tham khảo phần mềm mình viết ở đây, chức năng đo nhịp tim đã được tích hợp.

https://play.google.com/store/apps/details?id=com.softphan.gymcalculator
Cảm ơn anh đã chia sẻ. Phần mềm của anh rất hay, em đo liên tục thì thấy kết quả dao động trong khoảng 5 nhịp tim từ 80 - 85. Anh cho em hỏi là anh dùng thư viện gì để xử lý hình ảnh vậy ạ?
Mình dùng openCV. Tuy nhiên nếu bạn cũng dùng thư viện thì lấy gì để bảo vệ đồ án? Đây là một project khá nhỏ, phần code chính của bạn cũng chỉ khoảng vài trăm dòng thôi.

Xu hướng

Bài mới









  • Chịu trách nhiệm nội dung: Trần Mạnh Hiệp
  • © 2024 Công ty Cổ phần MXH Tinh Tế
  • Địa chỉ: Số 70 Bà Huyện Thanh Quan, P. Võ Thị Sáu, Quận 3, TPHCM
  • Số điện thoại: 02822460095
  • MST: 0313255119
  • Giấy phép thiết lập MXH số 11/GP-BTTTT, Ký ngày: 08/01/2019