[RESOLU] Coordonnées dans une détection de mouvement

Les applications du Raspberry Pi en contrôle d'accès, alarme et vidéosurveillance

Modérateur : Francois

inthebelouze
Messages : 9
Enregistré le : lun. 5 janv. 2015 12:12

[RESOLU] Coordonnées dans une détection de mouvement

Message par inthebelouze » lun. 5 janv. 2015 23:59

Bonsoir à tous.
J'ai un mouton à 5 pattes à vous soumettre (un de plus dans la communauté).

Je dispose d'un pi B+ avec une caméra NoIR et une distri Raspbian. Je cherche à exécuter une détection de mouvement en tâche de fond (par exemple par "motion"), MAIS je ne cherche pas à diffuser en streaming (du moins, pas pour le moment). Je cherche à récupérer des coordonnées "globales" de la zone en mouvement sur l'ensemble de l'image.

Le projet final, c'est que je souhaite asservir une tourelle automatique à une reconnaissance de mouvement par camera, en somme, fabriquer une tourelle automatique de défense (je pratique l'airsoft, n'appelez pas le FBI ;). C'est ces fameuses coordonnées qui me servirons de mire de référence pour la visée.

Pour aller plus loin, je compte connecter mon raspi à un arduino qui s'occupera de contrôler les deux axes (horizontal et vertical) et la détente de tir.

Mais procédons par étape, je me concentre d'abord sur la détection de mouvement.

Je ne vous cache pas que c'est plus le défi de la fabrication de la tourelle que son utilisation qui me motive

Je suis tout ouïe à vos propositions, n’hésitez pas à me demander plus d'explication si je n'ai pas été clair.

Je ne savais pas si je devais poster dans cette rubrique ou dans la rubrique Robots, n'hésitez pas à déplacer mon post si besoin est.

Merci par avance
Modifié en dernier par inthebelouze le sam. 4 avr. 2015 12:17, modifié 1 fois.

Avatar du membre
vague nerd
Modérateur
Messages : 1473
Enregistré le : mar. 14 oct. 2014 11:42
Localisation : France !

Re: Coordonnées dans une détection de mouvement

Message par vague nerd » mar. 6 janv. 2015 10:28

Bonjour.

A la lecture rapide du man de motion, on trouve une option on_motion_detected. Les valeurs suivantes pourraient vous être utiles !
%K : X coordinate in pixels of the center point of motion. Origin is upper left corner.
%L : Y coordinate in pixels of the center point of motion. Origin is upper left corner and number is positive moving downwards (I may change this soon).
Cdt.
Cordialement,

Vague Nerd

inthebelouze
Messages : 9
Enregistré le : lun. 5 janv. 2015 12:12

Re: Coordonnées dans une détection de mouvement

Message par inthebelouze » mar. 6 janv. 2015 19:44

Bonsoir
Effectivement, je vient de regarder plus en détail le fichier motion.conf, et oui à priori motion est capable de renvoyer plusieurs informations (si je comprends tout bien), comme des coordonnées ou autres variables internes.
Je suis débutant sur debian et en prog en pyton. Je continu de gratter pour voir comment je peux maintenant récupérer ces données dans un programme.
Si quelqu'un à déjà fait ou à une idée sur la façon dont je doit m'y prendre, ça sera avec plaisir

Merci

inthebelouze
Messages : 9
Enregistré le : lun. 5 janv. 2015 12:12

Re: Coordonnées dans une détection de mouvement

Message par inthebelouze » jeu. 8 janv. 2015 20:05

Re-bonsoir à tous.

J'ai avancé sur mon sujet. dans le fichier config de motion, le paramètre "on_motion_detected" peut être suivi d'une commande (comme me l'a suggéré vague nerd). J'ai essayé "echo %K" et "echo %L", et ça marche très bien. motion me revoie dans la console (où je l'ai exécuté) une valeur seulement sur une détection de mouvement (en pixel, respectivement sur les X, puis sur les Y).

SAUF QUE imaginons que je fasse un script "coordonnées" qui serai exécute par motion avec les arguments %k et %L. Comment / où puis-je stocker ces coordonnées pour que je puisse les récupérées dans une autre processus (dans mon script "maitre".)

Je le répète, je débute en programmation python et sur un environnement linux

Merci pour votre aide

a bientôt

Korhm
Raspinaute
Messages : 232
Enregistré le : ven. 19 sept. 2014 08:13
Localisation : Toulouse

Re: Coordonnées dans une détection de mouvement

Message par Korhm » ven. 9 janv. 2015 07:33

Bonjour,

comment fonctionne ton script "maitre" ? Est-ce un processus qui tourne en permanence en fond, ou un script appelé dès que besoin ?

1. Si c'est le premier cas, je pense que le plus simple est d'utiliser les "named pipes".
C'est un peu compliqué à appréhender, mais en gros, c'est un fichier linux qui est lu en permanence par un processus (ici une boucle infinie dans ton script maitre), et qui en même peut peut-être écrit par un ou plusieurs autres processus.
Quand un processus écrit dans le fichier, il est immédiatement lu par le processus lecteur.
C'est parfait pour une communication unilatérale, et demande peu de ressources.
S'il faut une communication bilatérale, il me semble que les named pipes peuvent être aussi utilisés, mais personnellement je préfère utiliser un client/server tcp dans ce cas là.

2. Si c'est le deuxième cas, il suffirait juste d’appeler le script en question dans l'event généré par motion, et de lire les paramètres en entrées.[/list]

Je connais très mal le python, mais suivant ta réponse je pourrais peut-être déjà t'aider à définir les algorithmes.

inthebelouze
Messages : 9
Enregistré le : lun. 5 janv. 2015 12:12

Re: Coordonnées dans une détection de mouvement

Message par inthebelouze » lun. 12 janv. 2015 19:08

Bonjour,
Désolé pour l'absence, j’étais loin de toute civilisation ce weekend.

La structure de mon script maitre est le suivant :

Exécution du script maitre au démarrage de debian
>exécution de "motion" (motion -n -c fichier_de_config_perso.conf)
>attente de coordonnées dans une variable X et Y
>suite du programme, j'en suis pas encore là ;-)

...sachant que sur une détection, motion m’exécute un script qui est censé récupérer les variables internes de motion pour les rendre disponible à mon script maitre. C'est ce passage qui me bloque (les rendre disponible à mon script maitre).
Je vais chercher du côté des "named pipes" (je ne connais pas) mais vu la description que Korhm en fait, ça pourrais correspondre.

Je continu mon enquête, merci

inthebelouze
Messages : 9
Enregistré le : lun. 5 janv. 2015 12:12

Re: Coordonnées dans une détection de mouvement

Message par inthebelouze » lun. 12 janv. 2015 22:59

Bonsoir a tous,
bon, j'ai fouillé un petit peut partout, la solution du named pipe (unilatéral) me convient très bien. J'ai compris le principe sauf que je n'ai pas compris comme le mettre en œuvre.

Si quelqu'un à un exemple ou un tuto à m'indiquer pour me mettre sur la voie... parce que là, je sèche

Merci à tous

Avatar du membre
vague nerd
Modérateur
Messages : 1473
Enregistré le : mar. 14 oct. 2014 11:42
Localisation : France !

Re: Coordonnées dans une détection de mouvement

Message par vague nerd » mar. 13 janv. 2015 10:14

Bonjour.

Plutôt que de me lancer dans un long discourt incompréhensible, je tente une démo ! Commencez par jeter un oeuil au manuel de fifo (first in frist out).

Code : Tout sélectionner

man fifo
Démonstration !

Création du named pipe :

Code : Tout sélectionner

mkfifo fifo
Dans un premier terminal :

Code : Tout sélectionner

cat > fifo
Dans un second terminal :

Code : Tout sélectionner

cat fifo
Désormais, tapez quelque chose dans le premier terminal, et observez que cela est reproduit dans le second.
Remarquez aussi que si vous quittez le processus dans le premier terminal, cela rompt le pipe (processus quitté aussi dans le deuxième terminal).

N'hésitez pas à poser des questions !

Cdt.
Cordialement,

Vague Nerd

inthebelouze
Messages : 9
Enregistré le : lun. 5 janv. 2015 12:12

Re: Coordonnées dans une détection de mouvement

Message par inthebelouze » mar. 13 janv. 2015 20:06

Bonsoir,
C'est exactement ce que je cherche. J'essaye de l'adapter en python. J'ai déjà une bout de code prometteur (je pense) de mon script appelé par motion

Code : Tout sélectionner

#!/usr/bin/python
import os
fifo = 'coord'

# si le fichier coord n'existe pas
os.mkfifo(fifo)
descr = os.open(fifo, os.O_WRONLY)

#récupération des arguments du script, je l'ai vu qque part, mais je ne sais plus comment on fait. Pour l'exemple :
coord_x = 20
coord_y = 80

#c'est la que je doute
os.write(desc, str(coord_x))

#...et je doit quitter sans fermer le tunnel pour pouvoir re-causer dedans au prochain appel de mon script par motion

A la réflexion, je doit peut-être ouvrir mon tunnel par mon script maitre, ce qui permettrais de le laisser ouvert en continu.

de plus, dans mon 2eme script (pour le test)

Code : Tout sélectionner

import os

fifo = 'coord'
descr = os.open(fifo, os.O_WRONLY) #a ce moment, je débloque l'autre script

os.read(descr, xx) #(pour l'instant, xx = 10, j'ai pas encore ajuster) je récupère "b'20'". C'est que déjà, ça cause et c'est déjà pas mal
Je continu à chercher les pièces du puzzle sur le net... Suis-je dans la bonne direction ou je vais dans le mur ?

Merci à tous

Avatar du membre
vague nerd
Modérateur
Messages : 1473
Enregistré le : mar. 14 oct. 2014 11:42
Localisation : France !

Re: Coordonnées dans une détection de mouvement

Message par vague nerd » mar. 13 janv. 2015 21:17

Bonsoir.
#...et je doit quitter sans fermer le tunnel pour pouvoir re-causer dedans au prochain appel de mon script par motion
A la réflexion, je doit peut-être ouvrir mon tunnel par mon script maitre, ce qui permettrais de le laisser ouvert en continu.
La pille fifo n'a pas besoin d'être recrée. On la crée une bonne fois et c'est bon, non ? Une bonne raison de vouloir la recréer ?

Appelons le script appelé par motion l'"émetteur", et l'autre le "consommateur".
L’émetteur écrit comme bon lui semble dans le pipe, le consommateur fait une boucle sans fin de consommation (avec une temporisation pour ne pas surcharger le cpu).

Cordialement.
Cordialement,

Vague Nerd

Répondre

Retourner vers « Accès, alarme et vidéosurveillance »