====== 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|Streamer des images OpenCV avec v4l2-loopback]]** =====ZeroMQ===== **[[https://zeromq.org/|zeromq.org]]** (également écrit ØMQ, 0MQ ou ZMQ) est une bibliothèque de messagerie asynchrone haute performance * https://fr.wikipedia.org/wiki/ZeroMQ * https://en.wikipedia.org/wiki/ZeroMQ =====Ressources===== * **[[https://pyimagesearch.com/2019/04/15/live-video-streaming-over-network-with-opencv-and-imagezmq/|Live video streaming over network with OpenCV and ImageZMQ]]** FFMPEG ou GStreamer sont des options, mais c'est galère à implémenter. * **[[https://stackoverflow.com/questions/43817161/how-to-send-opencv-video-footage-over-zeromq-sockets|How to send OpenCV video footage over ZeroMQ sockets?]]** sur stackoverflow.com * https://zeromq.org/languages/python/ * [[https://github.com/jeffbass/imagezmq|Transporting OpenCV images]] =====Implémentation dans Pure Data===== * https://github.com/sansculotte/pd-zmq ====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) 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 ... 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 {{tag>zmc opencv pd pure-data pure_data python sb}}