Comment Userful aide les organisations à intégrer les caméras thermiques - Partie 2
Le premier fournisseur d'AV as a Service (AVaaS)
Dans la première partie de ce blog, nous avons décrit comment les caméras thermiques et autres nouvelles technologies deviendront une seconde nature dans le monde post-COVID. Pour cette partie, nous allons présenter un exemple de configuration.
Nous avons utilisé un serveur de gestion vidéo (VMS) avec une plateforme logicielle qui s'intègre aux caméras de centaines de fournisseurs différents, y compris les caméras prenant en charge l'analyse et/ou l'imagerie thermique. Les utilisateurs peuvent configurer des événements dans la plate-forme VMS ou dans le moteur de règles d'une caméra intelligente. Ces événements peuvent être des déclencheurs de distance d'objet (c'est-à-dire la détection d'objets séparés par une distance inférieure à 1,5 mètre), des déclencheurs de comptage d'objets (c'est-à-dire la détection d'un certain nombre de visiteurs dans un lieu) ou des déclencheurs de température (c'est-à-dire la détection d'objets dont la température est supérieure à 38 degrés centigrades).
Chacun de ces événements peut déclencher un appel HTTP à l'API Userful, permettant au serveur Userful de modifier automatiquement le contenu d'un mur vidéo, d'un écran individuel ou d'un groupe d'écrans. Le déploiement est simple comme bonjour. Il ne faut que trois étapes :
- Configurez les événements sur le moteur d'analyse intégré à la caméra ou sur la plateforme logicielle VMS.
- Configurer un écouteur HTTP ; pour surveiller les appels HTTP entrants provenant de capteurs externes.
- Configurez un commutateur de sources ; un ensemble d'instructions logicielles pour l'API Userful concernant le contenu à afficher sur les différents écrans en fonction du déclencheur externe. Il peut s'agir d'avertissements textuels, d'une vidéo d'instruction, de flux de caméras en direct, d'une diapositive Powerpoint ou de tout autre type de contenu que le client décide d'afficher.
Le résultat final (en utilisant Python) contient 26 lignes de code dans l'application principale :
si __name__ == '__main__' :
# Lier la socket au port
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
adresse_serveur = ('192.168.1.100', 8081)
print ('starting up on %s port %s' % server_address)
sock.bind(adresse_serveur)
# Écoute les connexions entrantes
sock.listen(1)
while True :
# Attend une connexion provenant d'un capteur externe
print ('waiting for a connection')
connexion, adresse_client = sock.accept()
essayer :
print ('connection from', client_address)
# Recevoir les données en petits morceaux et les lire
while True :
données = connexion.recv(512)
if données :
# extraire les données provenant de l'appel HTTP de Camera.
camera = extract(data)
# Connectez-vous au serveur Userful pour récupérer le cookie d'authentification.
session_header = login()
# Déterminez ce qui est en cours de lecture sur les écrans
current_source = is_playing(session_header, 'Shop-Floor')
# changer le contenu sur les écrans vers une source préconfigurée (dans
# cet exemple, un message d'avertissement HTML
switch_source(session_header, 'shop-Floor', 'HTML Warning')
# attendez 5 secondes
time.sleep(5)
# Retournez au contenu qui était diffusé à l'origine
switch_source(session_header, 'Shop-Floor', current_source)
#delete_source(session_header, 'PIP_Dynamic')
time.sleep(5)
break
autre :
print (sys.stderr, 'no more data from', client_address)
pause
enfin :
# Nettoyer la connexion
connexion.close()
Nous allons donc parcourir ce projet étape par étape.
Étape 1 : Configuration des événements sur la caméraera ou VMS
Dans cet exemple, nous utilisons le moteur d'analyse intégré de notre plateforme VMS tierce qui reçoit et enregistre les flux de plusieurs caméras. Les administrateurs peuvent configurer différents événements dans le moteur de règles des caméras... Il peut s'agir d'un déclencheur de mouvement ou d'un déclencheur d'analyse par lequel le logiciel VMS analyse les flux vidéo entrants et détecte les événements pour chaque caméra, par exemple :
- Une personne qui entre dans une zone spécifique de la fenêtre enregistrée.
- Une personne traversant une ligne virtuelle de A -> B (compteur de visiteurs)
- Une personne traversant une ligne virtuelle de B -> A (compteur de visiteurs)
- Une personne ayant une température corporelle élevée (> 38 degrés)
Chaque événement a un appel à l'action ; par exemple, une demande HTTP à notre auditeur web à 192.168.1.100:8081 avec un message contenant le nom de la caméra et la qualification de l'événement. Un exemple de règle d'événement est présenté dans l'image ci-dessous.
Étape 2 : le récepteur HTTP
Un serveur web HTTP est un simple processus qui s'exécute sur votre machine et qui fait exactement deux choses :
- Écoute les requêtes http entrantes sur une adresse de socket TCP spécifique (adresse IP et numéro de port).
- Gère cette requête et agit lorsqu'un message est reçu sur l'adresse de la socket.
In this example; our listener is listening to port 8081 on it's external Ethernet interface on IP address 192.168.1.100. If incoming connections are detected, the data received in the HTTP message is collected and processed under a <call to action> routine. This is the routine of instructing the Userful server what to do. Enter your text here ...
# Lier la socket au port
import socket
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
adresse_serveur = ('192.168.1.100', 8081)
print ('starting up on %s port %s' % server_address)
sock.bind(adresse_serveur)
# Écoute les connexions entrantes
sock.listen(1)
while True :
# Attend une connexion provenant d'un capteur externe
print ('waiting for a connection')
connexion, adresse_client = sock.accept()
essayer :
print ('connection from', client_address)
# Recevoir les données en petits morceaux et les lire
while True :
données = connexion.recv(512)
si données :
else :
print (sys.stderr, 'no more data from', client_address)
break
enfin :
# Nettoyer la connexion
connexion.close()
Avant de basculer notre source sur les écrans, nous vérifions quelle source est actuellement en cours de lecture dans une zone (c'est-à-dire un groupe d'écrans). De cette façon, nous pouvons revenir au contenu original une fois qu'un événement est passé. Le code ci-dessous détectera le nom de la source en cours de lecture (c'est-à-dire le nom du lecteur de signalisation, ou autre). En appelant cette fonction, nous transmettons notre cookie d'authentification et le nom de la zone.
def is_playing (session_header, zone) :
get_url = api_url_base + '/api/zones/byname/' + zone
response = requests.get(url=get_url, headers=session_header)
si response.status_code == 200 :
data = response.content
dict = json.loads(data)
sourceID = dict['playingSourceId']
sourceName = get_source_info(session_header,sourceID)
print(sourceName, 'is playing')
autre :
print (response.status_code)
return sourceName
def get_source_info (session_header, sourceID) :
get_url = api_url_base + '/api/sources/' + sourceID
response = requests.get(url=get_url, headers=session_header)
si response.status_code == 200 :
data = response.content
dict = json.loads(data)
sinon
print (response.status_code)
return dict['sourceName']
Maintenant que nous avons déterminé le nom de la source en cours de lecture, nous pouvons changer la source pour cette zone :
def switch_source(session_header, zone_name, source_name) :
post_url = api_url_base + '/api/zones/byname/' + zone_name + '/switch?destinationSourceName=' + source_name
response = requests.put(url=post_url, headers=session_header)
valeur = Faux
si response.status_code == 200 :
data = response.content
value = json.loads(data)["isPlaying"]
print('Source Switched')
else :
print (response.status_code)
retourner la valeur
And that is it…. The <CALL TO ACTION> in our HTTP Listener becomes: (1) retrieve the AUTH cookie for the Userful Server, (2) Detect current source playing in a particular zone, (3) Switch the content on the displays to a 'HTML Warning' message stored on the local server (4) Pause for some time, (5) Switch back to the original source.
# se connecter au Userful Server pour récupérer le cookie d'authentification
session_header = login()
# Déterminez ce qui est en cours de lecture sur les écrans
source = is_playing(session_header, 'Zone-3')
# changer le contenu sur les écrans vers une source préconfigurée (dans cet exemple un message d'avertissement HTML)
switch_source(session_header, 'Zone-3', 'HTML Warning')
# attendez 5 secondes
time.sleep(5)
# basculez à nouveau vers le contenu qui était initialement en cours de lecture
switch_source(session_header, 'Zone-3', source)
#delete_source(session_header, 'PIP_Dynamic')
time.sleep(5)
pause
Nous pouvons développer ce script en examinant les données reçues dans l'appel HTTP provenant de la caméra ou de la plate-forme VMS. Ces données peuvent contenir des informations sur la caméra et/ou la source de déclenchement et ces informations peuvent être utilisées pour afficher différents types de contenu. Pensez aux flux de caméras en direct ou - si la caméra compte les personnes - à l'affichage du nombre de clients présents dans le magasin et du nombre de clients supplémentaires pouvant entrer dans le magasin.
Grâce à la simplicité de l'API-REST, les clients et les intégrateurs de systèmes peuvent déployer des solutions simples pour certaines fonctions techniquement étonnantes. Il n'est pas nécessaire de recourir à des solutions ponctuelles provenant de différents fournisseurs. Un peu d'imagination combinée à des compétences limitées en codage peut vous mener loin. J'espère que nous avons suscité votre intérêt et je me réjouis de participer à d'autres échanges d'idées et d'exemples.
Userful
Le premier fournisseur d'AV as a Service (AVaaS)