[R] Un "Kinect" en Autoit O_O

Aide et conseils concernant AutoIt et ses outils.
Règles du forum
.
Répondre
Avatar du membre
B0B
Niveau 3
Niveau 3
Messages : 34
Enregistré le : sam. 17 déc. 2011 16:35
Status : Hors ligne

[R] Un "Kinect" en Autoit O_O

#1

Message par B0B »

Ma question est simple: Peut on réussir à élaborer, en AutoIt, un programme qui permet de guider sa souris (ou autre) grâce à sa webcam? :shock:
Hardu hein!!?? :mrgreen:
J'ai déjà fais plusieurs tentatives avec des GetPixelColor et un laser rouge devant la webcam mais l’inconvénient c'est qu'il faut impérativement que la fenêtre de la webcam soit ouverte sur le bureau et cela limite donc les action envisageables... :?
TOUTES LES IDÉES SONT LES BIENVENUES!!!! :idea:
Merci d'avance!! :D
Modifié en dernier par B0B le dim. 19 févr. 2012 10:53, modifié 1 fois.
Avatar du membre
TT22
Membre émérite
Membre émérite
Messages : 1566
Enregistré le : lun. 18 avr. 2011 15:21
Localisation : La Quatrième Dimension
Status : Hors ligne

Re: [..] Un "Kinect" en Autoit O_O

#2

Message par TT22 »

Cordialement,
TT22
Avatar du membre
B0B
Niveau 3
Niveau 3
Messages : 34
Enregistré le : sam. 17 déc. 2011 16:35
Status : Hors ligne

Re: [..] Un "Kinect" en Autoit O_O

#3

Message par B0B »

Voilà!! (C'est en essayant ce logiciel que j'ai eu l'idée! ^^)
Mais je ne suis pas aussi ambitieux!! :P
Je pensait plus a un truck ou je pourrais commander à mon pc depuis mon canapé (ouuuuu le gros feignant!!!! :evil: => OUI, ET FIER DE L’ETRE!!! :mrgreen: ), et c'est pour cette raison que la détection d'un unique pixel comme celui de la lumière produite par un laser serait plus approprié! :mrgreen:
Avatar du membre
TT22
Membre émérite
Membre émérite
Messages : 1566
Enregistré le : lun. 18 avr. 2011 15:21
Localisation : La Quatrième Dimension
Status : Hors ligne

Re: [..] Un "Kinect" en Autoit O_O

#4

Message par TT22 »

Ok, tout d'abord, laisse moi te dire bonne chance :lol:

Sinon, pour récupérer l'image de la webcam, tu pourras peut-être trouver ton bonheur ici : http://autoitscript.fr/forum/viewtopic.php?f=3&t=8488
Et pour ton histoire de pixel, je pense qu'il faudra utiliser GDIPlus...
Cordialement,
TT22
Avatar du membre
Tlem
Site Admin
Site Admin
Messages : 11773
Enregistré le : ven. 20 juil. 2007 21:00
Localisation : Bordeaux
Status : Hors ligne

Re: [..] Un "Kinect" en Autoit O_O

#5

Message par Tlem »

B0B a écrit :commander à mon pc depuis mon canapé
Il existe déjà plusieurs solutions pour cela :
- Le moins cher sera une rallonge USB pour votre clavier ou alors le clavier sans fil avec pavé tactile par exemple.
- La télécommande infra-rouge ou RF.
- Pour les plus fortuné : la tablette ou le téléphone tactile (avec teamviewer par exemple).
- Le Kinect pour PC.
et les autre solutions plus ou moins onéreuses (que je n'ai pas cité) qui existe ou qui sont sur le point d'émerger. :D
Thierry

Rechercher sur le forum ----- Les règles du forum
Le "ça ne marche pas" est une conséquence commune découlant de beaucoup trop de raisons potentielles ...

Une idée ne peut pas appartenir à quelqu'un. (Albert Jacquard) tiré du documentaire "Copié n'est pas volé".
Avatar du membre
RL77LUC
Niveau 5
Niveau 5
Messages : 173
Enregistré le : mar. 21 sept. 2010 16:54
Status : Hors ligne

Re: [..] Un "Kinect" en Autoit O_O

#6

Message par RL77LUC »

C'est clair que même si je pense que c'est techniquement possible, c'est extrêmement compliqué et long, à mon avis. Surtout que je doute que les webcams apprécient les lasers rouges.

Il existe beaucoup de solutions plus adaptées :
- Kinect pour PC
- Smartphone Android/iOS/WinMobile ou WinPhone (Team Viewer, Remote Desktop, Ignition ...)
- Rallonge
- Autre langage

Donc je suis assez d'accord avec Tlem, même si l'idée était sympa, AutoIt n'est pas adapté, je le crains.
Avatar du membre
B0B
Niveau 3
Niveau 3
Messages : 34
Enregistré le : sam. 17 déc. 2011 16:35
Status : Hors ligne

Re: [..] Un "Kinect" en Autoit O_O

#7

Message par B0B »

Snif... :cry: :cry:
Je clos donc le sujet...

Mais j'y arriverai un jour!!!! :P
Avatar du membre
TT22
Membre émérite
Membre émérite
Messages : 1566
Enregistré le : lun. 18 avr. 2011 15:21
Localisation : La Quatrième Dimension
Status : Hors ligne

Re: [..] Un "Kinect" en Autoit O_O

#8

Message par TT22 »

B0B a écrit :Mais j'y arriverai un jour!!!! :P
Bonne chance, mais si tu arrive à le faire, dis le nous :wink:
Cordialement,
TT22
Avatar du membre
Yarillo
Niveau 5
Niveau 5
Messages : 109
Enregistré le : mer. 11 mai 2011 22:22
Status : Hors ligne

Re: [R] Un "Kinect" en Autoit O_O

#9

Message par Yarillo »

J'apporte ma touche personnelle ayant plus ou moins les mêmes vices que l'auteur du sujet, j'ai moi-même élaboré un quelque-chose pour effectuer quelques actions sur mon ordi à distance (Depuis mon lit en fait, je suis un littéraire qui aime la musique, mais j'ai cassé mon lecteur portable... Alors je fais avec les moyens du bord, bref !)

J'ai détourné un de mes appareils (Mon casque sans fil) wi-fi, bluetooth ou quoi que ce soit qu'il utilise qui envoie et réceptionne des données et dispose de boutons, puis de faire une sorte de "man in the middle"

En gros, sniffer tout ce que reçoit le casque et effectuer des actions en conséquence.
De mon côté, quand j'appuie sur le bouton pour monter le son et celui pour baisser le son en même temps, mon script éteint l'ordinateur. :wink:

Et même soyons fou, si le casque est (par exemple) équipé d'un micro, pourquoi pas une mini reconnaissance vocale ? Criez fort, il montera le son :lol:

J'ai utilisé ce code pour trouver les ID des boutons de mon casque :

Code : Tout sélectionner

#Include <Misc.au3>
$d = 0
$hex = ""
MsgBox(0, "Titre", "Prêt ?")
While 1
    $hex = Hex($d)
    If _IsPressed($hex) Then
        MsgBox(0, "Titre", "L'ID du bouton équivaut à "&$hex&".")
        Exit
    EndIf
    $d = $d+1
WEnd
 
Et celui-ci pour exécuter les actions

Code : Tout sélectionner

#Include <Misc.au3>

$hkey = InputBox("Titre", "Bouton à écouter 1")
$hkey2 = InputBox("Titre", "Bouton à écouter 2")

While 1
    Sleep(200)
    If _IsPressed($hkey) AND _IsPressed($hkey2) Then
        Beep(300, 3000) ;Me prévient que la commande a été bien prise en compte
        Sleep(7000) ;Me donne le temps d'éteindre mon casque (La batterie, tout ça, vous savez)
        Shutdown(64)
    EndIf
WEnd
 
J'espère ne pas avoir été trop long pour un truc aussi simple.
Que vive la fainéantise, salut !
Avatar du membre
Uranium
Niveau 5
Niveau 5
Messages : 143
Enregistré le : mer. 28 mars 2012 13:13
Status : Hors ligne

Re: [R] Un "Kinect" en Autoit O_O

#10

Message par Uranium »

Désolé du up !

Mais quelqu'un pourrait expliquer comment Yarillo a réussi à faire ça ?
Je l'ai mp , mais sa dernirèe visite date du Lun 05 Nov 2012 23:04 :/

Si quelqu'un peut m'aiguiller

Cordialement ,
« En mathématiques, “évident” est le mot le plus dangereux. »
handmusician
Niveau 1
Niveau 1
Messages : 9
Enregistré le : sam. 30 juil. 2016 23:27
Status : Hors ligne

Re: [R] Un "Kinect" en Autoit O_O

#11

Message par handmusician »

Bonjour !
Le sujet est vieux mais je sais comment récupérer les données de la Kinect (v1). Au cas où cela intéresserait toujours quelqu'un, je donne l'idée de base, ensuite il faut bidouiller avec les données pour manipuler la souris selon la taille de l'écran et de votre bras...

Tout d'abord il faut installer kinect SDK beta 2 (64 bits ou 32 selon l'OS), brancher la kinect avec l'adaptateur pour pc puis utiliser Glovepie 0.45.

Dans l'editeur Glovepie :

Code : Tout sélectionner


//taches a faire au moment du lancement du programme :
if starting then
	//fps du script (car glovepie est un programme qui execute les scripts infiniment en boucle)
	pie.framerate=60
	
	//variable string pour voir quand les données kinect sont mises a jour
	var.t2=""
endif


//variable string qui récupére les données de la kinect que vous voulez :
var.t=""

//on sépare chaque donnée par un espace vide ou autre délimiteur
//exemple les main gauche/droite par rapport aux épaules gauche/droite en x, y (hauteur) et z (profondeur) en mm :
var.t+=removeunits(player.left_arm_x in mm)+" "+removeunits(player.left_arm_y in mm)+" "+removeunits(player.left_arm_forward in mm)+" "
var.t+=removeunits(player.right_arm_x in mm)+" "+removeunits(player.right_arm_y in mm)+" "+removeunits(player.right_arm_forward in mm)+" "

//pour indiquer que toutes les données sont écrites dans le clipboard on ajoute # a la fin de la chaine :
var.t+="#"

//Pour envoyer les données a autoit on passe par le clipboard via la dll d'AutoItX3
//on écrit les données dans le clipboard seulement quand les données sont mises a jour (la kinect étant à 30 fps) et ainsi eviter de saturer le clipboard inutilement entre deux : 
if var.t!=var.t2 then AutoItX3.dll.AU3_ClipPut(str(var.t))
var.t2=var.t

// touche V pour activer/désactiver l'affichage du skeleton
if released(v) then
cam.pos = [0,0,-5]
cam.BgColour = 0x0020A0
cam.vFov = 47 degrees
cam.pitch = var.tilt degrees

obj0.size = [0.3,0.07,0.1]
obj0.pos = [0,0,0]
obj0.colour = [0,0,0]

obj1.size = [0.25,0.3,0.3]
obj1.pos = player1.head.pos

obj2.CubeSize = 10cm
obj2.pos = player1.neck.pos

obj3.CubeSize = 10cm
obj3.pos = player1.LeftHand.pos
obj3.colour = [1,0,0]

obj4.CubeSize = 10cm
obj4.pos = player1.RightHand.pos
obj4.colour = [0,1,1]

obj5.CubeSize = 10cm
obj5.pos = player1.LeftShoulder.pos
obj5.colour = [0.5,0,0]

obj6.CubeSize = 10cm
obj6.pos = player1.RightShoulder.pos
obj6.colour = [0,0.5,0.5]

obj7.CubeSize = 10cm
obj7.pos = player1.LeftHip.pos
obj7.colour = [0.5,0,0]

obj8.CubeSize = 10cm
obj8.pos = player1.RightHip.pos
obj8.colour = [0,0.5,0.5]

obj9.CubeSize = 10cm
obj9.pos = player1.LeftKnee.pos
obj9.colour = [0.5,0,0]

obj10.CubeSize = 10cm
obj10.pos = player1.RightKnee.pos
obj10.colour = [0,0.5,0.5]

obj11.CubeSize = 10cm
obj11.pos = player1.LeftFoot.pos
obj11.colour = [0.8,0,0]

obj12.CubeSize = 10cm
obj12.pos = player1.RightFoot.pos
obj12.colour = [0,0.8,0.8]

obj13.CubeSize = 10cm
obj13.pos = player1.LeftElbow.pos
obj13.colour = [0.5,0,0]

obj14.CubeSize = 10cm
obj14.pos = player1.RightElbow.pos
obj14.colour = [0,0.5,0.5]

obj15.CubeSize = 10cm
obj15.pos = player1.torso.pos

obj16.CubeSize = 10cm
obj16.pos = player1.hipcenter.pos

obj17.CubeSize = 10cm
obj17.pos = player1.LeftWrist.pos
obj17.colour = [0.5,0,0]

obj18.CubeSize = 10cm
obj18.pos = player1.RightWrist.pos
obj18.colour = [0,0.5,0.5]

obj19.CubeSize = 10cm
obj19.pos = player1.LeftAnkle.pos
obj19.colour = [0.5,0,0]

obj20.CubeSize = 10cm
obj20.pos = player1.RightAnkle.pos
obj20.colour = [0,0.5,0.5]

obj21.Size = [50cm,1cm,50cm]
obj21.pos = player1.floor.point
obj21.RotMat = player1.floor.rotmat
obj21.colour = [0,0.7,0]

endif


//pour changer l'angle de la kinect (-27 a 27), taper l'angle dans le champ texte qui apparait a coté du bouton Stop lorsque le programme est mis en route puis touche tab pour valider :
var.d=debug
if released(Tab) and abs(round(val(var.d)))<28 then kinect.SmoothPitch=round(val(var.d))

//touche e pour arrêter le script et quitter Glovepie
if e then exitPIE

//touche s pour arrêter le script
if s then exitprogram

//Glovepie ne répondant pas aux keystrokes d'Autoit, il faut passer par le titre de la fenêtre active (une GUI d'autoit par exemple) pour communiquer des données ou commandes, ici pour arreter le script et quitter glovepie :
if window.text="exitpie" then exitPIE


Dans le script Autoit :

;~ on definit l'array qui récupére les données de la kinect
dim $kinect[0]


;~ on peut éventuellement créer une GUI visible ou non pour communiquer des données ou commandes a glovepie :
$gui=guicreate("")


while 1

;~ on lit le clipboard et le stocke dans la variable $cp
$cp=clipget()

;~ on regarde si toutes les données de la kinect sont récupérées grace au délimiteur #
if stringinstr($cp,"#")>0 then

;~ on stocke chaque donnée dans un élément de l'array kinect (ici sans le compteur du nombre de données dans le 1er élément)
$kinect=stringsplit($cp," ",2)

#cs
Nous avons donc d'apres notre exemple de script Glovepie :
$kinect[0]=main gauche x
$kinect[1]=main gauche y
$kinect[2]=main gauche z
$kinect[3]=main droite x
$kinect[4]=main droite y
$kinect[5]=main droite z
#ce

;~ il reste a faire le script qui utilise les données !

#cs
pour bouger la souris quelque chose du genre (en limitant, par exemple, l'étendue du bras en x et y à 60cm et en utilisant @DesktopWidth=largeur de l'écran et @DesktopHeight=hauteur de l'écran)  :

if $kinect[3]>-300 and $kinect[3]<300 and $kinect[4]>-300 and $kinect[4]<300 then MouseMove(($kinect[3]+300)*@DesktopWidth/600,(300-$kinect[4])*@DesktopHeight/600,0)


pour gérer les clic on peut utiliser le bras gauche (ici clic gauche si on met le bras gauche devant, clic droit si le bras gauche est sur le côté gauche et double clic s'il est levé).
On doit utiliser des variables pour ne cliquer ou double cliquer qu'une seule fois quand le bras fait les actions :

if $kinect[2]>400 and $leftclic=0 then
mouseclick("left")
$leftclic=1
elseif $leftclic=1 and $kinect[2]<400 then
$leftclic=0
endif

if $kinect[0]<-400 and $rightclic=0 then
mouseclick("right")
$rightclic=1
elseif $rightclic=1 and $kinect[0]>-400 then
$rightclic=0
endif

if $kinect[1]>400 and $dbclic=0 then
mouseclick("left")
sleep(20)
mouseclick("left")
$dbclic=1
elseif $dbclic=1 and $kinect[1]<400 then
$dbclic=0
endif


éventuellement un geste pour sortir de la boucle while, ici les 2 bras en arrière :

if $kinect[2]<-300 and $kinect[5]<-300 then exitloop

#ce

endif

Wend

;~ eventuellement changer le titre de la GUI (qui communique a glovepie des commandes) pour quitter glovepie.
;~ Ensuite, on rend la GUI active
;~ et on attend 2 secondes de plus, avant que le script d'autoit s'arrête, afin d'être sûr que glovepie récupère la commande :
WinSetTitle ($gui,"","exitpie")
winactivate($gui)
sleep(2000)
 
Répondre