Python 如何在C+中使用ZeroMQ通信多个映像+;?

Python 如何在C+中使用ZeroMQ通信多个映像+;?,python,c++,opencv,zeromq,Python,C++,Opencv,Zeromq,我想实现的程序,可以通过ZeroMQ通信多个图像。 我可以使用OpenCV在C++上显示多个图像,但是我不能在Python上显示,虽然编译器没有输出错误。 如何将多个图像从C++传递到Python?< /P> C++代码: matimg0; Mat-img1; Mat-img2; img0=imread(“images.jpeg”); img1=imread(“images1.jpeg”); img2=imread(“image2.jpg”); if(img0.empty())返回-1; if(

我想实现的程序,可以通过ZeroMQ通信多个图像。 我可以使用OpenCV在C++上显示多个图像,但是我不能在Python上显示,虽然编译器没有输出错误。 <>如何将多个图像从C++传递到Python?< /P> C++代码:

matimg0;
Mat-img1;
Mat-img2;
img0=imread(“images.jpeg”);
img1=imread(“images1.jpeg”);
img2=imread(“image2.jpg”);
if(img0.empty())返回-1;
if(img1.empty())返回-1;
if(img2.empty())返回-1;
显示许多图像(“图像”,3,img0,img1,img2);
//zeroMQ的Let结构
国际信息[3];
信息[0]=(int32_t)img0.rows;
信息[1]=(int32_t)img0.cols;
info[2]=(int32_t)img0.type();
信息[3]=(int32_t)img1.rows;
info[4]=(int32_t)img1.cols;
info[5]=(int32_t)img1.type();
信息[6]=(int32_t)img2.rows;
信息[7]=(int32_t)img2.cols;
info[8]=(int32_t)img2.type();
zmq::context\u t context(1);
套接字(上下文,zmq_-REQ);
socket.connect(“tcp://localhost:5555");
对于(i=0;i
<> >强> q>强>:如何将多个图像从C++传递到Python?< /P>
上面的代码使用可伸缩的正式通信模式原型,但它不尝试向任何已交付的
REQ
-est发送和
-ly

如果不尝试
.send()
a
REP
-ly,则
REQ
-端将永远无法发送任何下一条消息

如果这是您第一次使用ZeroMQ
在这里,您可以先看一下“”,然后再深入了解更多细节


解决方案 尝试使用一个不需要响应的推/拉原型

接下来,试着决定,仅仅用第一个图像发送所有元数据是否是一个合理稳健的假设(我更愿意使用
struct.pack()/struct.unpack()
兼容的BLOB和所有
byte\u行、byte\u cols、byte\u mat\u类型、每个人中的数据、单帧、琐碎的消息负载映射进行组合)

Python端只需一步读取一个单帧BLOB,如果需要,可以测试签名,
.unpack()
了解图像大小的前几个字节,
.unpack()
图像数据的“rest”就完成了。这不是很可爱吗

还需要注意的是,并非所有平台都共享相同类型的Endian(因此,最好使用显式字节顺序将c端代码设计为“网络”-Endian顺序:o)为了安全起见,如果托管设备/平台进一步发展,下一次可能会有不同的端点。显式排序就是相同的显式排序,正如您的代码从第1天开始就坚持使用的那样)


我明白了。所以你说我必须用推拉对吗?但是我在C++中从ZMQJEQ到ZMQXXRQ,从ZMQ.ReP到Python中的ZMQ.XReq都修改了程序。然后,我可以用python观看三个窗口,但只显示img0。我知道发生这种情况是因为sock.recv_multipart()。但我不知道如何修改它。我还应该使用推/拉方式实施吗用户36327 7小时前

不,我没有告诉任何人必须使用
PUSH/PULL
,这是一个家伙的建议,他从v2.1开始使用ZeroMQ+

XREQ/XREP
有效地缩短了理论上无限的REQ.send()s-REP.recv()s-REP.send()s-REQ.recv()s-REQ…-REP…-REP…-REQ…-REQ…-
[…无限期或死锁,以先到者为准]

问题在于期望事情一定会发生,而事实上不需要像预期的那样发生:

MASK        = 'Python: The Image#{0:} was decoded to be {1:}'
order_ORDER = 0
while( True ):  # THIS WILL RUN FOREVER, WON'T IT?
    #####################################################################################
    order_ORDER += 1
    #####################################################################################
    ( byte_rows,                                  # EXPECTS ALL THIS TO .recv() EACH TIME
      byte_cols,                                  # EXPECTS ALL THIS TO .recv() EACH TIME
      byte_mat_type,                              # EXPECTS ALL THIS TO .recv() EACH TIME
      data                                        # EXPECTS ALL THIS TO .recv() EACH TIME
      )           =  sock.recv_multipart()        # in Data from C++ Program
    #####################################################################################
    rows     = struct.unpack( 'i', byte_rows)     # EXPECTS THIS TO BE CORRECT  EACH TIME
    cols     = struct.unpack( 'i', byte_cols)     # EXPECTS THIS TO BE CORRECT  EACH TIME
    mat_type = struct.unpack( 'i', byte_mat_type) # EXPECTS THIS TO BE CORRECT  EACH TIME
    #####################################################################################
    if mat_type[0] == 0:                          # IF mat_type[0] WAS == 0 ?in 2nd, 3rd?
        # # # # # # # # # # # # # # # Gray Scale: # IF mat_type[0] WAS == 0 ?in 2nd, 3rd?
        image = np.frombuffer( data,
                               dtype = np.uint8
                               ).reshape( ( rows[0],
                                            cols[0]
                                            )
                                          )
        print "IMAGE WAS of TYPE == ZERO, HAVING SHAPE OF: ", image.shape, image.dtype
        imgType = 'Grayscale'
    else:                                         # IF mat_type[0] WAS != 0 ?in 2nd, 3rd?
        # # # # # # # # # # # # # # # # BGR Color # IF mat_type[0] WAS != 0 ?in 2nd, 3rd?
        image = np.frombuffer( data,
                               dtype = np.uint8
                               ).reshape( ( rows[0],
                                            cols[0],
                                            3
                                            )
                                          )
        print "IMAGE WAS of TYPE != ZERO, HAVING SHAPE OF: ", image.shape, image.dtype
        imgType = 'Blue-Green-Red'
    ###################################################################################
    cv2.imshow( MASK.format( imgType, order_ORDER ), image )
    cv2.waitKey()
    ###################################################################################
    #   LOOP AGAIN
    ###################################################################################
<> >强> q>强>:如何将多个图像从C++传递到Python?< /P> 上面的代码使用可伸缩的正式通信模式原型,但它不尝试向任何已交付的
REQ
-est发送和
-ly

如果不尝试
.send()
a
REP
-ly,则
REQ
-端将永远无法发送任何下一条消息

如果这是您第一次使用ZeroMQ
在这里,您可以先看一下“”,然后再深入了解更多细节


解决方案 尝试使用一个不需要响应的推/拉原型

接下来,试着决定,仅仅用第一个图像发送所有元数据是否是一个合理稳健的假设(我更愿意使用
struct.pack()/struct.unpack()
兼容的BLOB和所有
byte\u行、byte\u cols、byte\u mat\u类型、每个人中的数据、单帧、琐碎的消息负载映射进行组合)

Python端只需一步读取一个单帧BLOB,如果需要,可以测试签名,
.unpack()
前导的几个字节来了解图像大小,
.unpack()
使用图像数据的“rest”就完成了。这不是很可爱吗

还需要注意的是,并非所有平台都共享相同类型的尾端(因此最好将c端代码设计为显式字节排序到“网络”-尾端排序:o),只是为了安全起见,如果托管设备/平台进一步发展,下一次可能会有不同的尾端。显式排序就是相同的显式排序,因为您的代码从第1天开始就坚持使用)


我明白了。所以你说我必须用推拉对吗?但是我在C++中从ZMQJEQ到ZMQXXRQ,从ZMQ.ReP到Python中的ZMQ.XReq都修改了程序。然后,我可以用python观看三个窗口,但只显示img0。我知道这是因为sock.recv_multipart()。但我不知道