kinect + office365 : un bon geste en faveur de votre si !
TRANSCRIPT
Kinect + Office365 : Un
bon geste en faveur de
votre SI !Mardi 7 févrierJulien LO PRESTISamuel BLANCHARDFabrice BARBIN
Samuel BLANCHARD
Au niveau communautaire
Rédacteur/Modérateur chez
Développez
Rédacteur pour Programmez!
Fondateur Club SP et .NET Ouest
Créateur d’applications Windows
Phone
Outil : isoStoreSpy
Apps: Wario’s Jewels, Sonic’s
Jewels
Au niveau professionnel
Responsable Développement &
Innovation chez Naviso
(www.naviso.fr)
A remplacer
par une
photo
Julien LO PRESTI
Au niveau communautaire
Contributeur Club SP et .NET Ouest
MSP
Développement Apps WP7
Don du sang, IC12, Flickr Explorer
Au niveau professionnel
Etudiant SUPINFO Rennes
Stagiaire chez SYNERGIZ
A remplacer
par une
photo
Fabrice BARBIN
Au niveau communautaire
Fondateur Club SP et .NET Ouest
MVP SharePoint Workspace
Fondateur de la Communauté
SPW
Auteur d’un ouvrage dédié à SPW
Contributeur Club SharePoint FR
(UGSF)
Au niveau professionnel
Dirigeant de SYNERGIZ, centre de
compétences et de R&D sur
technologies Microsoft
(www.synergiz.com)
A remplacer
par une
photo
Kinect + Office365 : Quel usage en entreprise ?
Kinect
Comment ça marche ?
Du code et de la démo…
Zoom : Création d’un Framework Kinect
Office365
Comment ça marche ?
Du code et de la démo
Démonstration du cas d’usage complet
Quizz et Goodies !
Contenu de cette session
De nombreuses suggestions !
Kinect + Office 365
Quel usage en entreprise ?
Minority Reports – Droits réservés - http://fr.wikipedia.org/wiki/Minority_Report
Via une « borne » placée dans un endroit public
Pilotée par le geste via Kinect
Dont le contenu et les fonctionnalités reposent sur Office365
Kinect + Office 365 : Cas
d’usage
Communication interne(Information, sensibilisation, culture
d’entreprise, management)
Accueil d’un visiteur(Information, recherche de personnes, …)
Les contraintes spécifiques du projet
Kinect + Office 365 : Cas
d’usage
Environnement sonore
Public non formé
Données
« impersonnelles »
Kinect : Comment ca marche ?
Contenu (de la « V1 »)
Un projecteur infrarouge
Une caméra infrarouge
Une caméra vidéo
Des micros
Une motorisation
Principe
Reconnaissance de la profondeur et suivi de « joueurs »
Reconnaissance de 20 points par squelette
Reconnaissance vocale
Possibilité (par code) de détecter des postures et des gestes
En savoir+ : http://fr.wikipedia.org/wiki/Kinect
Code : Une souris dans la
Kinect ?
// on parcourt tous les squelettes disponiblesforeach (SkeletonData skeleton in skeletonFrame.Skeletons){
// Le squelette est-il bien repéré ?if (skeleton.TrackingState == SkeletonTrackingState.Tracked){
// on prend la main droiteJoint jointHandRight = skeleton.Joints[JointID.HandRight];
// Qualité trop médiocre on passe son tour // (main non affectée par son environnement)if (jointHandRight.Position.W < 0.8f)
continue;
// on en a trouvé une main ! joie !return jointHandRight.Position;
}}
Une position pour la souris
Code : Une souris dans la
Kinect ?
// Affichage du curseurfloat x, y;
// Normalisation dans un range de 0 à 1kinect.SkeletonEngine.SkeletonToDepthImage(hand.Value.Position, out x, out y);
double winX = this.ActualWidth * (double)x;double winY = this.ActualHeight * (double)y;
// deplacement par RenderTransform (Translation) this.TranslateCursor.X = winX;this.TranslateCursor.Y = winY;
Affichage du curseur
De la souris aux contrôles :
solution 2
Contrôle 2
Contrôle 1
Curseur
• Position Curseur
• InputHitTest
• Ancetre IKinectCursorControl
Contrôle
Enfant
Code : Des events pour un
contrôleDependencyObject control = this.InputHitTest(point) as DependencyObject;var kinectControl = control as IKinectControl;// on cherche si un papa n'est pas un KinectControlwhile (kinectControl == null && control != null) {
control = VisualTreeHelper.GetParent(control);kinectControl = control as IKinectControl;
}if (this.LastKinectControl != kinectControl) {
// on quitte l'ancien control !if (this.LastKinectControl != null) {
this.LastKinectControl.OnKinectLeave();}
this.LastKinectControl = kinectControl;if (kinectControl != null) {
// on entre pour la première fois !kinectControl.OnKinectEnter();
}}if( kinectControl != null ){
// on se deplace car on est déjà rentrékinectControl.OnKinectMove(point);
}
Code : Détection de posture
// on recherche le point de l'épaulePoint epaule = e.GetSkeletonPositionsWithoutDepth(this)[JointID.ShoulderLeft];
// puis la mainPoint main = e.GetHandPositionWithoutDepth(this);
// Obtenir l'angle entre deux points grace à pythagore ! AB2=AC2+BC2double angleInRadian = KinectDevice.GetAngle(main, epaule, AngleUnity.Radian);double angleInDegree = KinectDevice.RadianToDegree(angleInRadian);
this.Line.X1 = epaule.X;this.Line.Y1 = epaule.Y;this.Line.X2 = main.X;this.Line.Y2 = main.Y;
// Detection : verifier que l'angle est bien de 140° à + ou - 10° prèsif (KinectDevice.IsAngleInRange(angleInDegree, 140, 10)){
this.Line.Stroke = new SolidColorBrush(Colors.Red);}Else {
this.Line.Stroke = new SolidColorBrush(Colors.White);}this.TextAngle.Text = ((int)angleInDegree).ToString() + "°";
CODE & DEMO
Authentification
Exploitation du projet CodePlex de Wictor Wilén (MVP SharePoint)http://www.wictorwilen.se/
Code : Authentification
//Helper pour injecter le cookie avec le COM SPMsOnlineClaimsHelper claimsHelper = new MsOnlineClaimsHelper(siteUrl, login, password);
context = new ClientContext(siteUrl);context.ExecutingWebRequest += claimsHelper.clientContext_ExecutingWebRequest;
//Webclient injectant le cookievar wb = new ClaimsWebClient(new Uri(this.SiteUrl, UriKind.Absolute), this.Login, this.Password);
//Parse document apres le downloadwb.DownloadDataCompleted += (s, args) =>{
...}
Code : Liste SharePoint
//Creation url liste SPstring url = this.CreateSharepointListUrl( listId, subUrl, viewId );
//Webclient avec injection du cookievar wb = new ClaimsWebClient(new Uri(this.SiteUrl, UriKind.Absolute), this.Login, this.Password);
//Parse document apres le downloadwb.DownloadDataCompleted += (s, args) =>{
var result = new SharepointListResultEventArgs<T>(){ Cancelled = args.Cancelled, Error = args.Error };
if (args.Cancelled == false && args.Error == null){
byte[] data = args.Result;
result.Result = ParseDocument<T>(data);}
};
Code : Lync
//ConnectionService.SignIn("login", "mdp",
() =>{
//Obtention des contacts de l’utilisateurforeach (var contact in Service.GetContacts()){
...}
});
service = new LyncService();//Evènements sur le début et fin de la conversationservice.ConversationStarted += new EventHandler(service_ConversationStarted);service.ConversationStopped += new EventHandler(service_ConversationStopped);
Personne personne = this.ContactView.DataContext as Personne;//Début de la conversationservice.StartConversation(personne.Email);
Kinect
Oui : Bonne réponse aux attentes
Mais :
Ergonomie des applications à ré-imaginer
Nécessité d’un framework (Dev Haut Niveau)
Office365
Oui : Solution pérenne, bien outillée pour répondre aux besoins
Mais :
Disponibilité des données à optimiser (Cache)
Lync : Nécessité d’avoir le client installé
Kinect+Office365, en entreprise ?
Oui : Concept démontré
Mais : Nécessité d’éprouver dans « la vraie vie »
Conclusion
Jusqu'à 10 fois plus de
performance pour Sharepoint et
Exchange!
Jeudi 9 Février | 14h30-15h30
Tout ce que vous avez toujours
voulu savoir sur Office 365!
Mercredi 8 Février | 14h30-15h30
La gouvernance du Cloud : Retour
d'expériences des clients Office
365
Mercredi 8 Février | 13h00-14h00
Merci de votre attention
Autres sessions sur Office365
Au coeur d'un projet Kinect
innovant
Mardi 7 Février | 16h00-17h00
La kinect à l'écoute des nouveaux
usages métiers et interactions
avec les solutions Microsoft
Mercredi 8 Février | 14h30-15h30
Applications robotiques avec
Kinect et Robotics Dev Studio
Mercredi 8 Février | 13h00-14h00
Kinect Effect - user experience
revolution
Mardi 7 Février | 13h00-14h00
Tout sur Microsoft Speech
Mercr. 8 Février | 17h30-18h30
Jeux multi-écrans : envolez-
vous avec Kinect, Silverlight et
WP7
Mardi 7 Février | 13h00-14h00
…
Merci de votre attention
Autres sessions sur KINECT
Merci de votre attention
Quizz
Questions ? ?
Fabrice [email protected]
Julien LO [email protected]
Samuel [email protected]