Dopasowanie dźwięku Kinect do obrazu

Mam projekt dotyczący wideokonferencji za pomocą Kinect (lub, bardziej prawdopodobne, cztery z nich). W tej chwili, moja firma używa tych głupio drogich kamer do naszych pokoi VTC. Mamy nadzieję, że używając kilku połączonych ze sobą Kinektów, możemy obniżyć koszty. Plan polega na tym, aby cztery/pięć z nich pokrywało łuk 180 stopni, aby Kinekty mogły zobaczyć cały pokój / stół (nadal dużo tańsze niż nasze obecne kamery!). Aplikacje wybierają strumień wideo pochodzący z Kinect na podstawie kto przy stole mówi. Teoretycznie Plan jest dobry, ale mam problem.

Z tego co wiem, nie da się określić, która tablica mikrofonów odpowiada obiektowi Kinect Runtime. Można uzyskać obiekt reprezentujący każdy Kinect używając:

Device device = new Device();
Runtime[] kinects = new Runtime[device.Count];
for( int i = 0; i < kinects.Length; i ++ )
    kinects[i] = new Runtime(i);

I każda tablica mikrofonowa za pomocą:

var source = new KinectAudioSource();
IEnumerable<AudioDeviceInfo> devices = source.FindCaptureDevices();
foreach( AudioDeviceInfo in device in devices)
{
    KinectAudioSource devSpecificSource = new KinectAudioSource();
    devSpecificSource.MicrophoneIndex = (short)device.DeviceIndex;
}

Ale nie mogę znaleźć sposobu, aby wiedzieć, że Runtime A odpowiada KinectAudioSource B. nie jest to wielki problem dla dwóch Kinectów, których używam (zgadnę tylko, który jest Który i przełączyć je, jeśli się mylą), ale gdy dostaniemy do czterech lub pięciu Kinectów, nie chcę robić żadnej kalibracji za każdym razem, gdy aplikacja działa. Rozważałem założenie, że obiekty Runtime i KinectAudioSource będą w tej samej kolejności (indeks Runtime 0 odpowiada pierwszemu AudioDeviceInfo w urządzeniach), ale wydaje się to ryzykowne.

Pytanie: czy istnieje sposób na dopasowanie obiektu Runtime do jego KinectAudioSource? Jeśli nie, to czy jest zagwarantowane, że będą w prawidłowa kolejność, więc mogę dopasować Runtime 0 z pierwszym indeksem mikrofonu KinectAudioSource w urządzeniach?

Aktualizacja: W końcu zatrzasnął moją twarz przed wymogiem mieszkania z pojedynczym gwintem WPF i wymogiem mieszkania z wieloma wątkami Kinect audio na tyle, aby oboje zachowali się razem. Problem polega na tym, że z tego, co wiem, kolejność obiektów Kinect Runtime i KinectAudioSources ustawia , a nie . Jestem w dość głośnym laboratorium (jestem jednym z. może 40 stażystów w pokój), więc trudno to przetestować, ale jestem dość pewien, że kolejność jest przełączana dla dwóch Kinectów, które podłączyłem. Mam dwa obiekty Runtime i dwa obiekty KinectAudioSource. Kiedy pierwszy KinectAudioSource zgłasza, że dźwięk dochodzi bezpośrednio przed nim, stoję przed Kinect powiązanym z drugim obiektem Runtime. Więc nie ma gwarancji, że ich rozkazy się ułożą. Więc teraz, aby powtórzyć pytanie: jak dopasować się do Obiekt KinectAudioSource z Nui.Obiekt Runtime? W tej chwili mam tylko dwa Kinekty podłączone, ale ponieważ cel jest cztery lub pięć.. Potrzebuję na to konkretnego sposobu.

Aktualizacja 2: Przyniosłem dwa Kinekty, które mam w pracy do domu. Trzy Kinekty, jeden komputer. Zabawne rzeczy (to był rzeczywiście ból, aby je wszystkie zainstalowane na raz, a jeden z kanałów wideo nie wydaje się działać, więc jestem z powrotem do 2 na razie). odpowiedź musefana dała mi nadzieję, że przegapiłem coś w audiodeviceinfo, co rzuciłoby nieco światła na ten problem, ale bez powodzenia. Znalazłem ciekawie wyglądające pole w obiektach Runtime o nazwie NuiCamera.Uniquedeviceinfo, ale nie mogę znaleźć żadnego związku między tym a niczym w AudioDeviceInfo.

Wyjście z tych pól, w nadziei, że Sherlock Holmes zobaczy wątek i zauważy połączenie:

Console.WriteLine("Nui{0}: {1}", i, nuis[i].NuiCamera.UniqueDeviceName);
//Nui0: USB\VID_0409&PID_005A\6&1F9D61BF&0&4
//Nui1: USB\VID_0409&PID_005A\6&356AC357&0&3

Console.WriteLine("AudioDeviceInfo{0}: {1}, {2}, {3}", audios.IndexOf(audio), device.DeviceID, device.DeviceIndex, device.DeviceName);
//AudioDeviceInfo0: {0.0.1.00000000}.{1945437e-2d55-45e5-82ba-fc3021441b17}, 0, Microphone Array (Kinect USB Audio)
//AudioDeviceInfo1: {0.0.1.00000000}.{6002e98f-2429-459a-8e82-9810330a8e25}, 1, Microphone Array (2- Kinect USB Audio)

Aktualizacja 3: Nie szukam technik kalibracji. Szukam sposobu na dopasowanie do Kinecta Kamera z układem mikrofonów w aplikacji w czasie wykonywania, bez konieczności wcześniejszej konfiguracji. Proszę przestać zamieszczać możliwe techniki kalibracji. Cały punkt wysyłania pytanie było znalezienie sposobu, aby uniknąć konieczności użytkownik zrobić skonfigurować.

UPDATE 4: WMI zdecydowanie wydaje się być drogą do zrobienia. Niestety, nie miałem zbyt wiele czasu, aby nad tym pracować, ponieważ walczyłem tylko o to, aby uzyskać 3 Kinects, aby grać ze sobą miło. Coś o hubach USB nie będących poradzisz sobie z przepustowością? Poinformowałem mojego szefa, że nie ma łatwego sposobu podłączenia 3 + Kinects do zwykłego komputera, a nie niebieskiego ekranu. W wolnym czasie mogę nad tym popracować, ale jeśli chodzi o pracę.. to raczej ślepy zaułek.

Dzięki za odpowiedzi chłopaki, przepraszam, że nie mogłem wrzucić działającego rozwiązania.

 28
Author: Coeffect, 2011-07-05

6 answers

API dostarczane przez Microsoft Research w rzeczywistości nie zapewnia tej możliwości. Kinect to zasadniczo wiele kamer, a układ mikrofonów z każdym czujnikiem ma unikalny sterownik, więc nie ma połączenia z fizycznym urządzeniem sprzętowym. Najlepszym sposobem, aby to osiągnąć, byłoby użycie Windows API zamiast tego, za pomocą WMI i wziąć identyfikator urządzenia, który otrzymujesz dla Kamery NUI i mikrofonów, i użyć WMI, aby znaleźć, do której magistrali USB są podłączone (ponieważ każdy sensor Kinect musi być włączony własnej magistrali) wtedy będziesz wiedział, które urządzenie pasuje do czego. Będzie to kosztowna operacja, więc polecam zrobić to przy uruchomieniu lub wykryciu urządzeń i zachować informacje utrzymywane do czasu, gdy wiesz, że konfiguracja sprzętowa ulegnie zmianie lub aplikacja zostanie zresetowana. Korzystanie z WMI przez. Net jest dość dobrze udokumentowane, ale tutaj jest jeden artykuł, który konkretnie mówi o urządzeniach USB przez WMI/. NET: http://www.developerfusion.com/article/84338/making-usb-c-friendly/.

 11
Author: LewisBenge,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-07-13 04:22:32

Mannimarco,

Jedynym łączem, które widzę jest to, że unikalna właściwość camera 's UniqueDeviceName jest równa 'device instance path'.

Robiąc małe rozeznanie w Menedżerze urządzeń na moim komputerze mogę stwierdzić, że ostatnie 2 cyfry na końcu unikalnej nazwy aparatu (0&3, 0&4) są wartościami zwiększającymi (na podstawie kontrolera + portu?).

Moja sugestia jest taka, aby posortować listę kamer na podstawie tych ostatnich cyfr i posortować audiodevices na ich właściwości DeviceID. W ten sposób przypuszczam, że po iteracji listy aparatów możesz użyć odpowiedniego indeksu na liście audiodevice, aby dopasować 2 razem.

Btw, to jest mój pierwszy post, więc proszę bądź delikatny, jeśli się mylę...

 3
Author: Tom Knapen,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-07-13 14:58:44

Przyjrzałem się dokumentacji SDK i nie jest to wielka w całej szczerości. Co więcej, nie mam żadnych urządzeń Kinect do testowania tego.

Pierwszą rzeczą jaką bym zrobił to stworzenie listy wyjściowej wszystkich użytecznych wartości właściwości dla każdego urządzenia, wtedy zacząłbym szukać dopasowań pomiędzy tymi dwoma, które wyglądają jakby mogły być użyte do linków. Dla każdego z nich znajdę, chciałbym przetestować, aby zobaczyć, czy to działa.

Więc miałbym prostą aplikację konsolową do wypisywania następujące wartości właściwości:

Dla Każdego AudioDeviceInfo

  • DeviceID = X
  • DeviceIndex = X
  • DeviceName = X

Dla Każdego KinectAudioSource

  • MicrophoneIndex = X

Dla Każdego Runtime

  • InstanceIndex = X

Następnie poszukaj dopasowania w wartościach. Nic więcej w SDK nie wydaje się naprawdę przydatne. Ale musi być wewnętrzna logika SDK, gdy zwraca tablice AudioDeviceInfo i Runtime.

Anyway, I hope you get it right somehow

 0
Author: musefan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-07-12 15:59:29

Pobierałbym strumień audio z nich wszystkich, a następnie porównywał poziomy głośności. Gdy już to masz, możesz określić" obiekt " lub osobę w przestrzeni kinects 3D, która faktycznie mówi.

Stamtąd należy określić, w których kamerach dany obiekt / osoba jest widoczna ...

Yeh to jest jeden złożony projekt ... kinect jest jednak całkiem zajebisty ... Niewiele wiem o API, ale czy nie daje odległości i takich ludzi?

Powodzenia :)

 0
Author: War,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-07-12 16:04:59

Po prostu skalibrowałbym kinecty jeden po drugim, zapisując unikalne pary identyfikatorów urządzenia (camera id, microphone id) do pliku. W aplikacji możesz użyć tego pliku podczas uruchamiania do synchronizacji instancji mircophone I instancji aparatu (np. utworzyć tabelę, która odnosi się do jednej instancji kamery do jednej instancji mikrofonu). Ponieważ kamera i mikrofon wewnątrz Kinecta prawdopodobnie mają własny interfejs USB ic każdy (podłączony przez interral usb hub), technicznie nie ma możliwości odnoszą się do dwóch bez uprzedniej kalibracji, ponieważ dwa identyfikatory urządzenia są prawdopodobnie całkowicie niepowiązane. Możesz również umieścić etykiety na jednostkach Kinect i odwołać się do tych etykiet w pliku inicjalizacyjnym.

 0
Author: trilion99,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-07-12 23:46:38

Brzmi ciekawie, może potrzebujesz "automatycznej kalibracji".

Może z "zdalnymi przełącznikami zasilania dla każdego połączenia usb" (karta io podłączona do linii zasilania usb). Możesz więc automatycznie włączać jeden Kinect po drugim i teraz wiesz, który mikrofon należy do której kamery.

Czy coś w tym stylu...

Pozdrawiam! Stefan

 0
Author: habakuk,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-07-13 14:11:25