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.