Table des matières
Streaming over network with OpenCV et ZeroMQ
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
zeromq.org (également écrit ØMQ, 0MQ ou ZMQ) est une bibliothèque de messagerie asynchrone haute performance
Ressources
- Live video streaming over network with OpenCV and ImageZMQ FFMPEG ou GStreamer sont des options, mais c'est galère à implémenter.
- How to send OpenCV video footage over ZeroMQ sockets? sur stackoverflow.com
Implémentation dans Pure Data
Installation de puredata
sudo apt install multimedia-puredata libzmq3-dev
Compilation du patch zmq
git clone git@github.com:sansculotte/pd-zmq.git cd pd-zmq make
Utilisation des scripts fournis
Ç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 …
Installation du module python
Dans un environnement virtuel python (3.9)
- requirements.txt
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
Lancement d'un script
cd /le/dossier/de/votre/projet ./mon_env/bin/python3 sender_cam.py # sender_cam.py est le script ci_dessous
Sender avec python et receive dans pd
Bon, là je suis nul en pd !
Exemples
- Exemples inspirés de: https://github.com/jeffbass/imagezmq/tree/master/examples
Caméra
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 …
- sender_cam.py
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
- receiver_cam.py
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