Nowe technologie w fizyce biomedycznej/Kamery 3D: Różnice pomiędzy wersjami

Z Brain-wiki
(Utworzono nową stronę "=Kamery 3D = ==Plan zajęć== Zajęcia 1: *Wstęp teoretyczny: **Budowa i zasada działania sensora Kinect. **Opis podstawowych bibliotek wykorzystywanych do komunikacj...")
 
Linia 79: Linia 79:
  
 
from __future__ import print_function
 
from __future__ import print_function
 
 
import sys
 
import sys
 
sys.path.append('/usr/share/openbci/drivers/kinect/')
 
sys.path.append('/usr/share/openbci/drivers/kinect/')
 
 
from KinectUtils import Serialization
 
from KinectUtils import Serialization
  
Linia 95: Linia 93:
 
         return self._s.unserialize_frame(self.in_algs_file)
 
         return self._s.unserialize_frame(self.in_algs_file)
  
if __name__ == '__main__':
+
try:
     try:
+
     file_name = sys.argv[1]
        file_name = sys.argv[1]
+
except Exception:
    except Exception:
+
    file_name = 'test'
        file_name = 'test'
+
kinect = KinectDataReader(file_name)
    kinect = KinectDataReader(file_name)
+
 
    while True:
+
time = []
        frame = kinect.readNextFrame()
+
joints = []
        if frame is None:
+
first_time = 0
            print('END OF FILE')
+
 
            break
+
while True:
 +
    frame = kinect.readNextFrame()
 +
    if frame is None:
 +
        print('END OF FILE')
 +
        break
  
        frame_index = frame[0]
+
    frame_index = frame[0]
        hands_included = frame[1]
+
    hands_included = frame[1]
        skeleton_included = frame[2]
+
    skeleton_included = frame[2]
        frame_time = frame[3]
+
    frame_time = frame[3]
  
        if skeleton_included:
+
    if skeleton_included:
            skel = frame[8]
+
        skel = frame[8]
        else:
+
    else:
            skel = None
+
        skel = None
  
        if hands_included:
+
    if hands_included:
            hands = frame[9]
+
        hands = frame[9]
        else:
+
    else:
            hands = None
+
        hands = None
                   
+
               
        print('Idx:', frame_index, 'Time:', frame_time)
+
    print('Idx:', frame_index, 'Time:', frame_time)
        if skel is not None:
+
    if skel is not None:
            print('Skeleton: ', skel.user_x, skel.user_y, skel.user_z)
+
        print('Skeleton: ', skel.user_x, skel.user_y, skel.user_z)
  
        if hands is not None:
+
    if hands is not None:
            print('Hands: ', hands.hands[0].x, hands.hands[0].y, hands.hands[0].z)
+
        print('Hands: ', hands.hands[0].x, hands.hands[0].y, hands.hands[0].z)
 
</source>
 
</source>
  

Wersja z 09:14, 4 kwi 2017

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).


Sensor Kinect Xbox 360.


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. 2). 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

Scenariusz w OpenBCI do rejestracji danych przy pomocy Kinecta.

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)

try:
    file_name = sys.argv[1]
except Exception:
    file_name = 'test'
kinect = KinectDataReader(file_name)

time = []
joints = []
first_time = 0

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 skeleton_included:
        skel = frame[8]
    else:
        skel = None

    if hands_included:
        hands = frame[9]
    else:
        hands = None
                
    print('Idx:', frame_index, 'Time:', frame_time)
    if skel is not None:
        print('Skeleton: ', skel.user_x, skel.user_y, skel.user_z)

    if hands is not None:
        print('Hands: ', hands.hands[0].x, hands.hands[0].y, hands.hands[0].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].

Układ pozycji anatomicznych.

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.