Z = Zero
M = Messaging
Q = Queuing
Pas de latence, peu ce consommation CPU, en python super facile à implémenter
mais pas de réception dans VLC et Pure Data.
Utiliser Streamer des images OpenCV avec v4l2-loopback
zeromq.org (également écrit ØMQ, 0MQ ou ZMQ) est une bibliothèque de messagerie asynchrone haute performance
sudo apt install multimedia-puredata libzmq3-dev
git clone git@github.com:sansculotte/pd-zmq.git cd pd-zmq make
Ça envoie et reçoit des int/string, mais pas d'images !
Extrait de https://github.com/sansculotte/pd-zmq/blob/master/TODO
LATER * proper architecture workflows ** multiconnects/multicast (pgm?) * complex objects ** [zmf_router] -- [broker] as abstraction? ** [zmf_dealer] -/ ** [zmf_pair] * implement streams to send audio blocks ** binary modes * send/receive modes ** binary (for audio/video frames) ** string (for communication w external programs)
Le paquet de la première image est reçu, mais il ne passe passe rien ensuite …
Dans un environnement virtuel python (3.9)
opencv-python imagezmq
sudo apt install python3-pip python3 -m pip install --upgrade pip sudo apt install python3-venv cd /le/dossier/de/votre/projet python3 -m venv mon_env source mon_env/bin/activate python3 -m pip install -r requirements.txt ou python3 -m pip install opencv-python imagezmq
cd /le/dossier/de/votre/projet ./mon_env/bin/python3 sender_cam.py # sender_cam.py est le script ci_dessous
Bon, là je suis nul en pd !
Le principe est simple, sender envoie “image”, c'est une image en np.array
Cet array peut être définit par ce que vous voulez.
Les exemples utilisent souvent imutils, qui est une surcouche en python sur OpenCV, et qui a quelques bugs. On peut s'en passer facilement, il suffit de lire la doc OpenCV, par exemple pour retailler les images, les convertir en jpg etc …
import time import imagezmq import cv2 sender = imagezmq.ImageSender(connect_to='tcp://127.0.0.1:5555') my_name = "moi" cap = cv2.VideoCapture(2) time.sleep(2.0) while 1: # image peut venir de n'importe quoi ! # ici, c'est pour une caméra ret, image = cap.read() if ret: cv2.imshow("moi", image) sender.send_image(my_name, image) print("send:", image.shape) if cv2.waitKey(10) == 27: break
import cv2 import imagezmq image_hub = imagezmq.ImageHub() while 1: your_name, image = image_hub.recv_image() print(your_name, image.shape) cv2.imshow(your_name, image) image_hub.send_reply(b'OK') if cv2.waitKey(10) == 27: break