【发布时间】:2019-10-24 02:39:15
【问题描述】:
我想实现可以通过 ZeroMQ 通信多个图像的程序。 我可以使用 OpenCV 在 C++ 上显示多个图像,但我无法以某种方式在 Python 上显示,尽管编译器没有输出错误。
如何将多个图像从 C++ 传递到 Python?
C++ 代码:
Mat img0;
Mat img1;
Mat img2;
img0 = imread("images.jpeg");
img1 = imread("images1.jpeg");
img2 = imread("image2.jpg");
if(img0.empty()) return -1;
if(img1.empty()) return -1;
if(img2.empty()) return -1;
ShowManyImages("IMAGE",3,img0,img1,img2);
// Let structure for zeroMQ
int32_t info[3];
info[0] = (int32_t)img0.rows;
info[1] = (int32_t)img0.cols;
info[2] = (int32_t)img0.type();
info[3] = (int32_t)img1.rows;
info[4] = (int32_t)img1.cols;
info[5] = (int32_t)img1.type();
info[6] = (int32_t)img2.rows;
info[7] = (int32_t)img2.cols;
info[8] = (int32_t)img2.type();
zmq::context_t context (1);
zmq::socket_t socket (context, ZMQ_REQ);
socket.connect ("tcp://localhost:5555");
for(i=0; i<9; i++ )
{
zmq::message_t msg0 ( (void*)&info[i], sizeof(int32_t), NULL );
socket.send(msg0, ZMQ_SNDMORE);
}
void* data0 = malloc(img0.total() * img0.elemSize());
memcpy(data0, img0.data, img0.total() * img0.elemSize());
zmq::message_t msg00(data0, img0.total() * img0.elemSize(), my_free, NULL);
socket.send(msg00);
void* data1 = malloc(img1.total() * img1.elemSize());
memcpy(data1, img1.data, img1.total() * img1.elemSize());
zmq::message_t msg11(data1, img1.total() * img1.elemSize(), my_free, NULL);
socket.send(msg11);
void* data2 = malloc(img2.total() * img2.elemSize());
memcpy(data2, img2.data, img2.total() * img2.elemSize());
zmq::message_t msg22(data2, img2.total() * img2.elemSize(), my_free, NULL);
socket.send(msg22);
Python 代码:
import zmq
import cv2
import struct
import numpy as np
# Connection String
conn_str = "tcp://*:5555"
# Open ZMQ Connection
ctx = zmq.Context()
sock = ctx.socket(zmq.REP)
sock.bind(conn_str)
while(True):
# Receve Data from C++ Program
byte_rows, byte_cols, byte_mat_type, data= sock.recv_multipart()
# Convert byte to integer
rows = struct.unpack('i', byte_rows)
cols = struct.unpack('i', byte_cols)
mat_type = struct.unpack('i', byte_mat_type)
if mat_type[0] == 0:
# Gray Scale
image = np.frombuffer(data, dtype=np.uint8).reshape((rows[0],cols[0]))
else:
# BGR Color
image = np.frombuffer(data, dtype=np.uint8).reshape((rows[0],cols[0],3))
cv2.imshow('Python',image)
cv2.waitKey()
此致,
【问题讨论】:
-
您能否发布您从已发布的 C++/python 分布式计算代码模型中在 python 端收到的确切值?
-
我从
REQ修改为XREQ。然后,我只能看到三个显示img0的窗口。但我想观看显示每张图片的每个窗口,例如img0,img1,img2。我认为这是sock.recv_multipart()发生的,因为c++ 程序发送每个图像信息,我将Python 程序从byte_rows, byte_cols, byte_mat_type, data= sock.recv_multipart()恢复到byte_rows0, byte_cols0, byte_mat_type0, byte_rows1, byte_cols1,byte_mat_type1, byte_rows2, byte_cols2, byte_mat_type2, data= sock.recv_multipart()。我该如何解决这个问题?