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)
TA贡献1806条经验 获得超8个赞
我对 ROS 一无所知,但我经常使用 PIL,所以如果其他人知道得更好,请 ping 我,我会删除这个“最佳猜测”答案。
所以,似乎你需要从 .因此,您需要:PIL Image
'header',
'高度',
'宽度',
'编码',
'is_bigendian',
'步骤',
“数据”
因此,假设您这样做:
im = Image.open('test.jpg')
您应该能够使用:
你需要解决的事情
im.height
从PIL Image
im.width
从PIL 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
- 2 回答
- 0 关注
- 110 浏览
添加回答
举报