为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

PHP
HUWWW 2023-11-09 14:54:45
我目前正在尝试编写一个 ROS 发布者/订阅者设置,该设置传递由 PIL 打开的图像二进制文件。由于操作限制,我希望不必使用 OpenCV,我想知道是否有办法这样做。这是我当前的代码:#!/usr/bin/env pythonimport rospyfrom PIL import Imagefrom sensor_msgs.msg import Image as sensorImagefrom rospy.numpy_msg import numpy_msgimport numpydef 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 连接发送原始二进制文件的转换方法/不同的消息类型?
查看完整描述

2 回答

?
互换的青春

TA贡献1797条经验 获得超6个赞

事实上:

#!/usr/bin/env python

import rospy

import urllib2  # for downloading an example image

from PIL import Image

from sensor_msgs.msg import Image as SensorImage

import numpy as np


if __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)


查看完整回答
反对 回复 2023-11-09
?
慕森卡

TA贡献1806条经验 获得超8个赞

我对 ROS 一无所知,但我经常使用 PIL,所以如果其他人知道得更好,请 ping 我,我会删除这个“最佳猜测”答案。

所以,似乎你需要从 .因此,您需要:PIL Image

  • 'header',

  • '高度',

  • '宽度',

  • '编码',

  • 'is_bigendian',

  • '步骤',

  • “数据”

因此,假设您这样做:

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

您应该能够使用:

  • 你需要解决的事情

  • im.heightPIL Image

  • im.widthPIL Image

  • 可能const std::string RGB8 = "rgb8"

  • 可能无关紧要,因为数据是 8 位的

  • 可能是因为它是每像素 RGB 3 个字节im.width * 3

  • np.array(im).tobytes()

在任何人标记这个答案之前,没有人说答案必须是完整的——它们可以“希望有帮助”

请注意,如果您的输入图像是PNG格式,则应检查,如果是(即调色板模式),请立即运行:im.mode"P"

im = im.convert('RGB')

以确保它是 3 通道 RGB。

请注意,如果输入图像为 PNG 格式且包含 Alpha 通道,则应将 to 和 set .encoding"rgba8"step = im.width * 4


查看完整回答
反对 回复 2023-11-09
  • 2 回答
  • 0 关注
  • 110 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信