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