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

标签 python opencv rabbitmq

我在客户端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/

相关文章:

python - 两个数组的交集,保留较大数组中的顺序

python - 嵌套函数相等的解决方法

python - 具有边缘畸变和 1 个缺失角的方形检测

node.js - Rabbitmq 生产者 (symfony 3 ) 和消费者错误 ( NodeJs )

database - 高性能交易引擎应该同步保存到数据库吗?

python - 无法安装 chromedriver-binary

java - 无法获取 Runtime.getRuntime().exec(python script) 的输出;

python - OpenCV Python 中的 ESP32-CAM 流

java - 图像OpenCV的SVM预测

java - Spring RabbitMQ - xml配置 - 手动ack