gpt4 book ai didi

python - 如何通过RabbitMQ发送OpenCV帧以由服务器上的OpenCV处理

转载 作者:行者123 更新时间:2023-12-02 16:23:43 25 4
gpt4 key购买 nike

我在客户端PC上有一个Python应用程序,可以使用OpenCV测试其运动。我想将通过RabbitMQ捕获的OpenCV帧发送到服务器,以便服务器可以测试帧中是否有人。
我通过将帧转换为jpg,对jpg进行base64编码,通过队列发送以及在另一端进行base64解码然后保存文件来使其工作。然后可以在服务器上查看jpg。然后,我可以使用cv2.imread('captured.jpg')将jpg加载到服务器上的OpenCV中,并测试一个人的存在。
现在,我想避免将jpg保存到磁盘并将其重新加载到服务器上的Python中。但是我似乎无法将消息队列正文内容加载到OpenCV中。下面是发送内容的客户端代码,然后是发送内容的服务器代码(减去分析框架的detectorAPI函数)。

retval, image = camera.read()
retval, buffer = cv2.imencode('.jpg', image)
jpgb64 = base64.b64encode(buffer)
properties = pika.BasicProperties(app_id='motion', content_type='image/jpg', reply_to=self.ENVIRON["clientName"])
connection = pika.BlockingConnection(self.parameters )
channel = connection.channel()
channel.basic_publish(exchange='', routing_key='Central', body=jpgb64, properties=properties)
connection.close()



def callback(ch, method, properties, body):
imgbin = base64.b64decode(body)
with open('captured.jpg', 'wb') as f_output:
f_output.write(imgbin)
frame = cv2.imread('captured.jpg')
dt = detector.detectorAPI()
result = dt.objectCount(frame)
print(result)
我试过不在客户端上转换为jpg,而只是发送转换为base64的OpenCV帧。但是,然后在服务器上对其进行解码之后,我无法使OpenCV将其识别为“帧”。我假设OpenCV帧是一种特殊的数据类型,而我最终得到的是二进制对象,这是不一样的。但这仅是一个猜测,无论如何我都不知道如何解决。
如何从客户端发送捕获的OpenCV帧,以便服务器上的OpenCV能够像在服务器本身上捕获的帧一样对其进行处理?

最佳答案

我不使用RabbitMQ,但是我相信您可以发送二进制数据,所以我不知道您为什么对数据进行base64编码以发送数据并在接收端进行解码。您应该能够发送从buffer返回的cv2.imencode(),它将更快,更简单。
在接收端,您可以将接收到的消息转换为Numpy数组,然后解码回原始帧,而无需像下面这样进入磁盘:

# Convert received message into Numpy array
jpg = np.frombuffer(RECEIVEDMESSAGE, dtype=np.uint8)

# JPEG-decode back into original frame - which is actually a Numpy array
im = cv2.imdecode(jpg, cv2.IMREAD_UNCHANGED)

关于python - 如何通过RabbitMQ发送OpenCV帧以由服务器上的OpenCV处理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62912300/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com