====== 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}}