27 votes

Faire correspondre l'audio et la vidéo de Kinect

J'ai un projet portant sur la vidéoconférence à l'aide de la Kinect (ou, plus probablement, de quatre d'entre elles). Pour l'instant, ma société utilise des caméras très coûteuses pour nos salles de VTC. L'espoir est que, en utilisant quelques Kinect reliés ensemble, nous pouvons réduire les coûts. L'idée est d'en avoir quatre ou cinq qui couvrent un arc de 180 degrés, de sorte que les Kinects puissent voir l'ensemble de la pièce ou de la table (ce qui reste bien moins cher que nos caméras actuelles !). Les applications choisiraient un flux vidéo provenant d'un Kinect en fonction de la personne qui parle à la table. Le plan est parfait en théorie, mais j'ai rencontré un problème.

Pour autant que je sache, il n'y a aucun moyen de savoir quel tableau de microphones correspond à l'objet Kinect Runtime. Je peux obtenir un objet représentant chaque Kinect en utilisant :

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

Et tous les réseaux de microphones utilisés :

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

mais je ne trouve aucun moyen de savoir que le Runtime A correspond au KinectAudioSource B. Ce n'est pas un gros problème pour les deux Kinects que j'utilise (je vais juste deviner lequel est lequel, et les échanger s'ils sont faux), mais quand nous aurons quatre ou cinq Kinects, je ne veux pas avoir besoin de faire une sorte de calibration à chaque fois que l'application s'exécute. J'ai envisagé de supposer que les objets Runtime et KinectAudioSource seront dans le même ordre (l'index Runtime 0 correspond au premier AudioDeviceInfo dans les périphériques), mais cela semble risqué.

Donc, la question : y a-t-il un moyen de faire correspondre un objet Runtime avec son KinectAudioSource ? Sinon, est-il garanti qu'ils seront dans le bon ordre pour que je puisse faire correspondre le Runtime 0 avec le premier index de microphone KinectAudioSource dans les dispositifs ?

UPDATE : J'ai finalement réussi à me heurter aux exigences de WPF en matière d'appartement à fil unique et à celles de la Kinect audio en matière d'appartement à fils multiples pour que les deux se comportent ensemble. Le problème est que, pour autant que je puisse le dire, l'ordre des objets Kinect Runtime et KinectAudioSources ne sont pas compatibles. no en ligne. Je suis dans un laboratoire assez bruyant (je suis l'un des 40 stagiaires dans la pièce), il est donc difficile de tester, mais je suis presque certain que l'ordre est inversé pour les deux Kinect que j'ai branchés. J'ai deux objets Runtime et deux objets KinectAudioSource. Lorsque le premier KinectAudioSource signale qu'un son provient directement de devant lui, je me trouve en fait devant la Kinect associée au deuxième objet Runtime. Il n'y a donc aucune garantie que les ordres des deux seront alignés. Donc maintenant, pour répéter la question : comment faire correspondre l'objet KinectAudioSource avec l'objet Nui.Runtime ? Pour l'instant, je n'ai que deux Kinect branchés, mais comme l'objectif est de quatre ou cinq J'ai besoin d'un moyen concret de le faire.

UPDATE 2 : J'ai ramené à la maison les deux Kinect que j'ai au travail pour jouer avec. Trois Kinects, un ordinateur. C'est amusant (c'était en fait une douleur de les installer tous en même temps, et l'un des flux vidéo ne semble pas fonctionner, donc je suis de retour à 2 pour le moment). La réponse de musefan m'a fait espérer que j'avais manqué quelque chose dans les objets AudioDeviceInfo qui pourrait éclairer ce problème, mais pas de chance. J'ai trouvé un champ intéressant dans les objets Runtime appelé NuiCamera.UniqueDeviceName, mais je ne trouve aucun lien entre ce champ et quoi que ce soit dans AudioDeviceInfo.

La sortie de ces champs, dans l'espoir que Sherlock Holmes voit le fil et remarque une connexion :

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)

UPDATE 3 : Je ne cherche pas de techniques d'étalonnage. Je cherche un moyen de faire correspondre la caméra Kinect avec son réseau de microphones dans l'application au moment de l'exécution, sans qu'aucune configuration préalable ne soit nécessaire. Veuillez cesser de poster des techniques d'étalonnage possibles. L'objectif de cette question était de trouver un moyen d'éviter que l'utilisateur ait à effectuer une configuration.

UPDATE 4 : La WMI semble définitivement être la voie à suivre. Malheureusement, je n'ai pas eu beaucoup de temps pour travailler dessus, car je me suis battu pour que trois Kinects puissent jouer ensemble. Quelque chose à propos des hubs USB qui ne peuvent pas gérer la bande passante ? J'ai informé mon patron qu'il ne semble pas y avoir de moyen facile de connecter 3+ Kinects à un ordinateur ordinaire sans écran bleu. Je pourrais encore essayer de travailler sur ce sujet pendant mon temps libre, mais pour ce qui est du travail c'est plutôt une impasse.

Merci pour les réponses, désolé de ne pas avoir pu poster une solution fonctionnelle.

11voto

LewisBenge Points 2340

L'API fournie par Microsoft Research n'offre pas réellement cette possibilité. Kinect est essentiellement constitué de plusieurs caméras et d'un réseau de microphones, chaque capteur disposant d'une pile de pilotes unique, de sorte qu'il n'existe aucun lien avec le dispositif matériel physique. La meilleure façon d'y parvenir serait d'utiliser l'API Windows à la place, par le biais de WMI et de prendre les ID de périphérique que vous obtenez pour la caméra NUI, et les microphones, et d'utiliser WMI pour trouver à quel bus USB ils sont attachés (comme chaque capteur Kinect doit être sur son propre bus) alors vous saurez quel périphérique correspond à quoi. Cette opération étant coûteuse, je vous recommande de la faire au démarrage ou à la détection des appareils et de conserver les informations jusqu'à ce que vous sachiez que la configuration matérielle a changé ou que l'application est réinitialisée. L'utilisation de WMI via .NET est assez bien documentée, mais voici un article qui traite spécifiquement des périphériques USB via WMI/.NET : http://www.developerfusion.com/article/84338/making-usb-c-friendly/ .

3voto

Tom Knapen Points 1804

Mannimarco,

Le seul lien que je vois est que la propriété UniqueDeviceName d'une caméra est égale à son 'device instance path'.

En faisant une petite recherche dans le gestionnaire de périphériques de mon ordinateur, je peux dire que les deux derniers chiffres à la fin de UniqueDeviceName de la caméra (0&3, 0&4) sont des valeurs incrémentales (basées sur le contrôleur + le port ?).

Je vous suggère de trier votre liste de caméras en fonction de ces derniers chiffres, et de trier vos appareils auditifs en fonction de leur propriété DeviceID. De cette façon, je suppose que lorsque vous itérez sur votre liste de caméras, vous pouvez utiliser l'index correspondant dans la liste des appareils auditifs pour faire correspondre les deux.

C'est mon premier message, alors soyez indulgents si je me trompe...

0voto

musefan Points 23208

J'ai jeté un coup d'œil à la documentation du SDK et, en toute honnêteté, elle n'est pas géniale. De plus, je n'ai pas d'appareils Kinect pour le tester.

La première chose que je ferais serait de créer une liste de sortie de toutes les valeurs de propriétés utiles pour chaque appareil, puis je commencerais à chercher des correspondances entre les deux qui semblent pouvoir être utilisées pour des liens. Pour chaque correspondance que je trouverais, je testerais pour voir si elle fait l'affaire.

J'aurais donc une simple application console pour afficher les valeurs de propriété suivantes :

Pour chaque AudioDeviceInfo

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

Pour chaque KinectAudioSource

  • MicrophoneIndex = X

Pour chaque temps d'exécution

  • InstanceIndex = X

puis rechercher toute correspondance dans les valeurs. Rien d'autre dans le SDK ne semble vraiment utile. Mais il doit y avoir une logique interne au SDK lorsqu'il renvoie des tableaux de AudioDeviceInfo et Runtime.

Quoi qu'il en soit, j'espère que vous y arriverez d'une manière ou d'une autre.

0voto

Wardy Points 2289

J'obtiendrais le flux audio de chacun d'entre eux et je comparerais ensuite les niveaux de volume. Une fois que vous avez cela, vous pouvez déterminer l'"objet" ou la personne dans l'espace 3D de Kinects qui parle réellement.

A partir de là, vous devez déterminer dans quelles caméras cet objet / cette personne est visible ...

Oui, c'est un projet complexe... La Kinect est assez impressionnante cependant... Je ne connais pas bien l'API mais elle ne donne pas les distances et autres des personnes ?

bonne chance :)

0voto

trilion99 Points 21

Je me contenterais de calibrer les kinects un par un, en écrivant les paires d'identifiants uniques (id caméra, id microphone) dans un fichier. Dans votre application, vous pouvez ensuite utiliser ce fichier au moment du démarrage pour synchroniser les instances de microphones et les instances de caméras (c'est-à-dire créer une table qui relie une instance de caméra à une instance de microphone). Comme la caméra et le microphone à l'intérieur de la kinect ont probablement leur propre interface usb chacun (connecté via un hub usb interal), il n'y a techniquement aucun moyen de relier les deux sans calibration préalable, comme les deux identifiants de périphérique sont probablement complètement indépendants. Vous pouvez également mettre des étiquettes sur les unités Kinect et faire référence à ces étiquettes dans votre fichier d'initialisation.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X