Nowe technologie w fizyce biomedycznej/Kamery 3D
Spis treści
Kamery 3D
Plan zajęć
Zajęcia 1:
- Wstęp teoretyczny:
- Budowa i zasada działania sensora Kinect.
- Opis podstawowych bibliotek wykorzystywanych do komunikacji z urządzeniem.
- Profesjonalne systemy do rejestracji ruchu
- Zastosowania w biomechanice oraz rehabilitacji.
- Zapoznanie się z działaniem sensora Kinect
- Pomiary:
- W ramach pomiarów studenci wykonają standardowy test wykorzystywany w medycynie sportowej do oceny prawdopodobieństwa urazów więzadła krzyżowego przedniego (ACL).
Media:3D_Kinect.pdf Informacje wstępne oraz opis zadań
Zajęcia 2,3,4:
- Analiza zebranych danych
- Zaprezentowanie uzyskanych wyników
Sensor Kinect
Śledzenie ruchów postaci ludzkiej w ogólności znajduje zastosowanie m.in. w analizie chodu, diagnostyce chorób związanych z układem ruchu człowieka, analizie ruchu sportowców, czy nawet w procesie animacji postaci na potrzeby produkcji filmów i gier. W tym celu wykorzystuje się głównie profesjonalne markerowe systemy śledzenia ruchu (marker-based motion capture systems) określane w skrócie jako systemy mocap. Systemy te wymagają zastosowania specjalistycznego sprzętu, a na ciele śledzonej postaci muszą zostać umieszczone odpowiednie markery, przez co rejestracja musi odbywać się w warunkach laboratoryjnych. Systemy te nie nadają się do śledzenia ruchu w czasie rzeczywistym, a przesłonięcie lub przemieszczenie markerów w trakcie ruchu może być przyczyną błędów. Z tych względów coraz większe zainteresowanie zyskują bezmarkerowe systemy śledzenia ruchu, które wykorzystują zaawansowane algorytmy analizy obrazu.
Sensor Kinect firmy Microsoft do śledzenia ruchu postaci wykorzystuje informacje z kamery głębokości. Znajduje on zastosowanie w różnego rodzaju systemach umożliwiających interakcję człowiek-komputer, ale zaczyna również budzić coraz większe zainteresowanie w dziedzinach związanych z biomechaniką i rehabilitacją. W tym celu konieczne jest jednak określenie dokładności pozycji estymowanych przy pomocy bibliotek obsługujących sensor. Problem ten został poruszony w pracy (Webster, 2014).
Budowa sensora Kinect Xbox 360 (rys. 1):
- kamera wizyjna RGB (typu CMOS, o rozdzielczości 640x480) - przesyła serię obrazów z prędkością 30 klatek na sekundę,
- kamera głębokości (typu CMOS, o rozdzielczości ~300x200) - zwraca informację o głębokości poprzez analizę zniekształconej przez obiekt wiązki promieni podczerwonych,
- emiter podczerwieni - emituje wiązkę promieni podczerwonych,
- 4 mikrofony kierunkowe - wykorzystywane przez funkcje rozpoznawania mowy,
- napęd umożliwiający ruch głowicą z akcelerometrem.
Pomiary
Rejestracja danych odbywa się w środowisku OpenBCI. System ten uruchamiamy wykonując w terminalu polecenie:
$ obci_gui
Obsługa sensora wraz z algorytmami estymacji poszczególnych pozycji anatomicznych śledzonej postaci, możliwa jest dzięki bibliotekom OpenNI i NiTE. Scenariusz do rejestracji danych przy pomocy sensora Kinect pokazany został poniżej (rys. 3). Umożliwia on rejestrację w trybie online, i wówczas zarówno obraz RGB, jak mapa głębokości mogą zostać zapisane w domyślnym formacie .oni. Dodatkowo tworzony jest plik binarny .algs z metadanymi rejestracji, gdzie zapisywane są między innymi współrzędne wyestymowanych pozycji anatomicznych. Tryb offline umożliwa odtwarzanie plików .oni oraz .algs. W przypadku rejestracji w trybie online w scenariuszu zmieniamy następujące parametry:
capture_raw = 1 – zapis obrazu do pliku .oni (0 lub 1) out_raw_file_path = test.oni – nazwa pliku .oni capture_hands = 1 – zapis pozycji rąk (0 lub 1) capture_skeleton = 1 – zapis pozycji anatomicznych (0 lub 1) out_algs_file_path = test.algs – nazwa pliku .algs z metadanymi rejestracji
Wybierając tryb offline należy podać odpowiednią ścieżkę do plików .oni oraz .algs:
in_raw_file_path = test.oni in_algs_file_path = test.algs
Wszystkie pliki zapisywane są w lokalizacji: /home/.obci/sandbox
Drop Vertical Jump
Zeskok z następującym wyskokiem pionowym (drop vertical jump, DVJ) należy do badań przesiewowych, pozwalających oszacować ryzyko występienia urazu (w szczególności więzadła krzyżowego przedniego u kobiet) lub określić efekty rehabilitacji. Przed rozpoczęciem skoku osoba badana stoi na platformie o wysokości ok. 30 cm. Ma ona za zadanie wykonać zeskok z platformy na ziemię, a następnie maksymalny skok pionowy w górę. W dalszej analizie interesujące będą momenty: kontaktu pięt z podłożem (initial contact, IC) zaraz po wykonaniu zeskoku oraz moment maksymalnego zgięcia kolan (peak flexion, PF) zaraz po IC, ale przed oderwaniem pięt od podłoża w celu wykonania skoku pionowego.
Analiza danych
Studenci zapoznają się z modułami (napisanymi w języku programowania Python) do wczytywania oraz wstępnego przetwarzania danych. Następnie samodzielnie wyznaczą następujące wskaźniki biomechaniczne (opisane w pracy (Stone et al., 2013), którą można znaleźć pod adresem: [1]):
- knee valgus motion (KVM),
- frontal plane knee angle (FPKA) w dwóch momentach (w trakcie kontaktu pięt z podłożem zaraz po wykonaniu zeskoku oraz w trakcie maksymalnego zgięcia kolan),
- knee-to-ankle separation ration (KASR) w momencie PF,
- zmiana w czasie średniej pozycji bioder.
Wyniki opracowane powinny zostać w formie tabeli, gdzie zestawione zostaną wartości KVM, FPKA, KASR otrzymane dla każdej osoby z grupy. Trajektoria średniej pozycji bioder podczas wykonywania zadania powinna zostać przedstawiona na wykresie.
Analiza danych
Przykładowy skrypt do wczytywania wyników algorytmów śledzenia pozycji anatomicznych (wraz z metadanymi rejestracji):
#!/usr/bin/env python
# -*- coding: utf-8 -*-
from __future__ import print_function
import sys
sys.path.append('/usr/share/openbci/drivers/kinect/')
from KinectUtils import Serialization
class KinectDataReader(object):
def __init__(self, file_name):
super(KinectDataReader, self).__init__()
self.file_name = file_name
self.in_algs_file = open(self.file_name + '.algs', 'rb')
self._s = Serialization()
def readNextFrame(self):
return self._s.unserialize_frame(self.in_algs_file)
first_time = 0
joints = []
time = []
try:
file_name = sys.argv[1]
except Exception:
file_name = 'test'
kinect = KinectDataReader(FILE_PATH+file_name)
while True:
frame = kinect.readNextFrame()
if frame is None:
print('END OF FILE')
break
frame_index = frame[0]
hands_included = frame[1]
skeleton_included = frame[2]
frame_time = frame[3]
if not first_time:
first_time = frame_time
if skeleton_included:
skel = frame[8]
time.append(frame_time-first_time)
joints.append(skel.joints)
print('Idx:', frame_index, 'Time:', frame_time-first_time)
print('Head x,y,z [mm]: ', skel.joints[0].x, skel.joints[0].y, skel.joints[0].z)
print('Torso x,y,z [mm]: ', skel.joints[8].x, skel.joints[8].y, skel.joints[8].z)
Plik z metadanymi rejestracji zawiera: nagłówek, wyniki algorytmów śledzenia 15 pozycji anatomicznych, wyniki algorytmów śledzenia pozycji rąk (oddzielna opcja w scenariuszu). Pozycje anatomiczne sylwetki zapisane są w następującej kolejności:
joints = [JOINT_HEAD, JOINT_NECK, JOINT_RIGHT_SHOULDER, JOINT_LEFT_SHOULDER, JOINT_RIGHT_ELBOW, JOINT_LEFT_ELBOW, JOINT_RIGHT_HAND, JOINT_LEFT_HAND, JOINT_TORSO, JOINT_RIGHT_HIP, JOINT_LEFT_HIP, JOINT_RIGHT_KNEE, JOINT_LEFT_KNEE, JOINT_RIGHT_FOOT, JOINT_LEFT_FOOT]
Ich położenie (x,y,z) wyrażone jest w jednostkach [mm].
Literatura
- Stone E.E., Butler M., McRuer A., Gray A., Marks J., Skubic M., Evaluation of the Microsoft Kinect for Screening ACL Injury, Conference proceedings: ... Annual International Conference of the IEEE Engineering in Medicine and Biology Society, 2013:4152-5, 2013.
- Webster D., Celik O., Systematic review of Kinect applications in elderly care and stroke rehabilitation, Journal of NeuroEngineering and Rehabilitation, 11:108, 2014.