如何在没有OpenCV的情况下通过ROS发布PIL镜像二进制文件?

我目前正在尝试编写一个 ROS 发布者/订阅者设置,该设置传递由 PIL 打开的图像二进制文件。由于操作限制,我希望不必使用 OpenCV,我想知道是否有办法这样做。这是我当前的代码:


#!/usr/bin/env python

import rospy

from PIL import Image

from sensor_msgs.msg import Image as sensorImage

from rospy.numpy_msg import numpy_msg

import numpy


def talker():

    pub = rospy.Publisher('image_stream', numpy_msg(sensorImage), queue_size=10)

    rospy.init_node('image_publisher', anonymous=False)

    rate = rospy.Rate(0.5)

    while not rospy.is_shutdown():

        im = numpy.array(Image.open('test.jpg'))

        pub.publish(im)

        rate.sleep()


if __name__ == '__main__'

    try:

        talker()

    except ROSInterruptException:

        pass

在 pub.publish(im) 尝试时抛出:


TypeError: Invalid number of arguments, args should be ['header', 'height', 'width', 'encoding', 'is_bigendian', 'step', 'data'] args are (array([[[***array data here***]]], dtype=uint8),)

如何将图像转换为正确的形式,或者是否有支持仅通过 ROS 连接发送原始二进制文件的转换方法/不同的消息类型?


HUWWW
浏览 111回答 2
2回答

互换的青春

事实上:#!/usr/bin/env pythonimport rospyimport urllib2  # for downloading an example imagefrom PIL import Imagefrom sensor_msgs.msg import Image as SensorImageimport numpy as npif __name__ == '__main__':    pub = rospy.Publisher('/image', SensorImage, queue_size=10)    rospy.init_node('image_publisher')    im = Image.open(urllib2.urlopen('https://cdn.sstatic.net/Sites/stackoverflow/Img/apple-touch-icon.png'))    im = im.convert('RGB')    msg = SensorImage()    msg.header.stamp = rospy.Time.now()    msg.height = im.height    msg.width = im.width    msg.encoding = "rgb8"    msg.is_bigendian = False    msg.step = 3 * im.width    msg.data = np.array(im).tobytes()    pub.publish(msg)

慕森卡

我对 ROS 一无所知,但我经常使用 PIL,所以如果其他人知道得更好,请 ping 我,我会删除这个“最佳猜测”答案。所以,似乎你需要从 .因此,您需要:PIL Image'header','高度','宽度','编码','is_bigendian','步骤',“数据”因此,假设您这样做:im = Image.open('test.jpg')您应该能够使用:你需要解决的事情im.height从PIL Imageim.width从PIL Image可能const std::string RGB8 = "rgb8"可能无关紧要,因为数据是 8 位的可能是因为它是每像素 RGB 3 个字节im.width * 3np.array(im).tobytes()在任何人标记这个答案之前,没有人说答案必须是完整的——它们可以“希望有帮助”!请注意,如果您的输入图像是PNG格式,则应检查,如果是(即调色板模式),请立即运行:im.mode"P"im = im.convert('RGB')以确保它是 3 通道 RGB。请注意,如果输入图像为 PNG 格式且包含 Alpha 通道,则应将 to 和 set .encoding"rgba8"step = im.width * 4
打开App,查看更多内容
随时随地看视频慕课网APP