Aller au contenu

Script python pour du "time-laps" avec différents logiciels d'acquisitions d'images


Messages recommandés

Posté (modifié)

Bonjour à toutes et à tous, pour faire tourner sur une "tinker-board", les logiciels comme "oacapture" ou "ccdciel", j'ai était confronté à un petit souci quand j'ai voulus faire un "time-laps", car tout les logiciels d'acquisition ne permettes pas de prendre une pose toutes les x secondes ou minutes avec un temps de pose plus court.

Alors n'y une n'y deux, un petit script python à lancer dans un terminal et c'est réglé (attention le script utilise le logiciel "xdotool", donc il faut l’installer au préalable).

 

Le script doit être utilisé avec une option obligatoire, exemple  -> timer_souris.py -timer=10

Dans ce cas un clic de souris est généré toute les 10 secondes, à l'endroit ou se trouve le curseur de souris.

Une deuxième option non obligatoire, "-force" quand à elle remet systématiquement le curseur de souris à une position précise avant de déclencher un clic.

Bien sur, il faut régler le logiciel d'acquisition pour qu'il ne prenne qu'une image à la fois avec un temps plus court que le delai, sinon le script il ne sert à rien.

 

Testé sous "nunux" sur PC et "tinker-board" (en local ou à distance) avec les logiciels et cam suivantes.

-  "oacapture" et "ccdciel" avec une qhyII-L.
- Avec "ccdciel" et "indi" avec un apn.

- Avec une veille dmk sur port" Firewire" que se soit avec "Coriander" ou "oacapture", mais seulement sur pc hein, car un port "Firewire" sur une "tinker-board" il n'y a pas, enfin si quelqu'un as une solution je suis preneur.

Mais en toute logique, ça doit fonctionner avec n'importe quel softs d'acquisitions et même sur des vidéos.

 

Comme "Oacapture" fait monter la température cpu d'une tinker-board à donf, pour éviter sa mort prématuré par échauffement, faire les 4 commandes suivantes dans un terminal pour limiter les GHz et donc la température du pauvre cpu.

sudo cpufreq-set -c 0 -d 0.408GHz -u 1.2GHz

sudo cpufreq-set -c 1 -d 0.408GHz -u 1.2GHz

sudo cpufreq-set -c 2 -d 0.408GHz -u 1.2GHz

sudo cpufreq-set -c 3 -d 0.408GHz -u 1.2GHz

Sur une autre machine "arm" que la "tinker-board", pour connaitre les fréquences à utiliser, un petit "cpufreq-info", est votre amis, il faut aussi trouver le moyen de connaitre la température du cpu (gkrllem, certaine version de htop, etc....).

 

Le script impose un temps minimum de 4 secondes entre deux clic, histoire d'avoir le temps d'aller sur la fenêtre du terminal pour arrêter le script, mais rien ne vous empêche de modifier le script pour avoir un délais plus court (mais attention à la crise de nerf, si le délais est trop court hein :be:).

 

Le petit script (à consommer sans modération)

Révélation

#!/usr/bin/python3
# -*- coding: utf-8 -*-

# timer_souris.py
# * 
# * Copyright 2019 <Alarcon Yves>.
# * 
# * This is free software; you can redistribute it and/or modify
# * it under the terms of the GNU General Public License as published by
# * the Free Software Foundation; either version 3, or (at your option)
# * any later version.
# * 
# * This software is distributed in the hope that it will be useful,
# * but WITHOUT ANY WARRANTY; without even the implied warranty of
# * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# * GNU General Public License for more details.
# * 
# * You should have received a copy of the GNU General Public License
# * along with this software; see the file COPYING.  If not, write to
# * the Free Software Foundation, Inc., 51 Franklin Street,
# * Boston, MA 02110-1301, USA.
# */
#
# Ce sripte utilise le logiciel xdotool et lance de façon répétitive
# un appuis du bouton de la souris dans une fenetre
#
# pour connaitre la position du bouton ou il faut appuyer
# on peut utiliser le logiciel xev
# plus nécéssaire car je sais gérer la position de la souris

# WID='xdotool search --title "oacapture" | head -1'
# xdotool windowfocus $WID
# xdotool mousemove 888 681
# xdotool click 1

import sys
import time
import threading
import subprocess

# les variables
temps = 10
force = 0
x_pos = 0
y_pos = 0
id_fe = 0

# on gerre les arguments du programme
def message(i):
	global temps
	global force
	#print (i)
	if (i[0] == '-'):
		if ('-h' in i):
			print ("************************************************************")
			print ("***                Aide de timer_souris                  ***")
			print ("************************************************************")
			print ("*")
			print ("*** timer_souris -timer=val [-force] [-h]")
			print ("*")
			print ("* La commande indispensable est:")
			print ("*  - \"-timer=val\" -> val est le temps en seconde (mini 4 s)")
			print ("*")
			print ("* La commande falcultative \"-force\"")
			print ("*    On force le curseur de souris")
			print	("     à revenir automatique sur la position choisie !")
			print ("*")
			print ("* Pour fonctionner, \"timer_souris\" à besoin du logiciel suivant:")
			print ("*  - \"xdotool\" (pour tout le traitement de la souris virtuelle)")
			print ("************************************************************")
			exit()
		# les commandes avec argument
		if ('=' in i):
			nb = (i.index('='))
			commande = "commande: ", i[:nb]
			valeur = (i[nb + 1:])
			if ('-timer' in commande):
				temps = int(valeur)
				if (temps < 4):
					temps = 4
		else:
			if ('-force' in i):
				force = 1
	else:
		nom_image = i
		
# on lance la routine de traitement des options
if (__name__ == '__main__'):
	if (len(sys.argv) > 1):
		i = 1
		while (i < len(sys.argv)):
			message(sys.argv[i])
			i += 1
	else:
		print ("\"timer_souris\" doit se lancer avec un argument")
		print ("Faire \"timer_souris -h\" pour l'aide")
		exit()

# On poursuit le programme

def r_inter():
	# cette fonction est appelé toutes les secondes par le timer
	global nb
	global t
	global temps
	global ch_1
	global ch_2
	global id_fe
	t += 1
	chaine = '  Appuis n°' + str(nb) + ', il reste ' + str(temps - t + 1) + ' / ' + str(temps) + ' avant le prochain clic ! '
	print (chaine, end='\r')
	if (t >= temps):
		if (id_fe != 0):
			subprocess.call(ch_1, shell=True)
			subprocess.call(ch_2, shell=True)
		subprocess.call('xdotool click 1', shell=True)
		nb += 1
		t = 0	

class Periodique(threading.Timer):
	def __init__(self, interval, callable, args=(), kwargs={}):
		self.callable = callable
		threading.Timer.__init__(self, interval, self._f, args, kwargs)

	def _f(self, *args, **kwargs):
		Periodique(self.interval, self.callable, args, kwargs).start()
		self.callable(*args, **kwargs)

# affichage en console
ch = ""
print ("")
print ("***********************************************************")
print ("**                     timer_souris                      **")
print ("***********************************************************")
print ("*                                                         *")
print ("*             10 secondes avant le premier clic,          *")
print ("*               placez le curseur de souris,              *")
print ("*                 sur le bouton à cliquer !               *")
print ("*                                                         *")
if (force == 1):
	print ("*          Mode \"-force\" choisi, la position est          *")
	print ("*          définitivement fixée passé le délai !          *")
	print ("*                                                         *")
nb = 9
while (nb > -1):
	print("*   -->",nb,"s",end='\r')
	time.sleep(1)
	nb -= 1
  
if (force == 1):
	p1 = subprocess.Popen(['xdotool', 'getmouselocation'], stdout = subprocess.PIPE)
	output = p1.communicate()[0]
	# on extrait les info de position du curseur
	caractere = ' '
	chaine = str(output)
	i = 1
	for ch in chaine.split(caractere):
		ch_1 = ch.split(":")
		if (i == 1):
			x_pos = int(ch_1[1])
		if (i == 2):
			y_pos = int(ch_1[1])
		if (i == 4):
			ch_2 = ch_1[1].split('\\n')
			id_fe = int(ch_2[0])		
		i += 1
	p1.stdout.close()
	
print ("*               Pour arreter timer_souris                 *")
print ("*            appuyer sur la touche \"Entrée\"               *")
print ("*                                                         *")
# mise en place des chaines de commande et des variables
ch_1 = 'xdotool windowfocus ' + str(id_fe)
ch_2 = 'xdotool mousemove ' + str(x_pos) + ' ' + str(y_pos)
nb = 1
t = temps # on iniialise t = temps pour activer le premier clic immédiatement
duree = 1
t2 =  Periodique(duree, r_inter)
t2.setDaemon(True)
t2.start()
a = input()
print ("***********************************************************")
# fin du programme

 

 

Pour toute remarque utile ou pas, un petit message dans cette discussion et si je peux je répondrais, mais je ne suis pas un gourou en "python", Voili-voila, c'est tout pour aujourd'hui.

Yves.

Modifié par Alarcon yves
  • 2 semaines plus tard...
  • En ligne récemment   0 membre est en ligne

    • Aucun utilisateur enregistré regarde cette page.
×
×
  • Créer...

Information importante

Nous avons placé des cookies sur votre appareil pour aider à améliorer ce site. Vous pouvez choisir d’ajuster vos paramètres de cookie, sinon nous supposerons que vous êtes d’accord pour continuer.