【ROS-Error】 Can‘t convert image: local variable ‘pil_mode‘ referenced before assignment
rqt_bag ***.bag 报错:
Can't convert image: local variable 'pil_mode' referenced before assignment
原因: 源于rqt_bag工具中存在bug,pil_mode 被定义为局部变量,但却在全局中被使用。
如何查找原因:
1. 首先查找rqt_bag: find / -name rqt_bag
/opt/ros/kinetic/lib/python2.7/dist-packages/rqt_bag
2. cd /opt/ros/kinetic/lib/python2.7/dist-packages/rqt_bag
3. 查找 pil_mode 变量:grep -rn pil_mode
rqt_bag_plugins/image_helper.py:57: pil_mode = 'RGB'
rqt_bag_plugins/image_helper.py:67: pil_mode = 'I;16'
rqt_bag_plugins/image_helper.py:73: pil_mode = 'F'
rqt_bag_plugins/image_helper.py:87: pil_mode, (img_msg.width, img_msg.height), img_msg.data, 'raw', mode, 0, 1)
rqt_bag_plugins/image_helper.py:90: if pil_mode == 'I;16':
4. 修改源码
修改前
def imgmsg_to_pil(img_msg, rgba=True):try:if img_msg._type == 'sensor_msgs/CompressedImage':pil_img = Image.open(StringIO(img_msg.data))if pil_img.mode != 'L':pil_img = pil_bgr2rgb(pil_img)else:pil_mode = 'RGB'alpha = Falseif img_msg.encoding == 'mono8':mode = 'L'elif img_msg.encoding == 'rgb8':mode = 'RGB'elif img_msg.encoding == 'bgr8':mode = 'BGR'elif img_msg.encoding in ['bayer_rggb8', 'bayer_bggr8', 'bayer_gbrg8', 'bayer_grbg8']:mode = 'L'elif img_msg.encoding in ['bayer_rggb16', 'bayer_bggr16', 'bayer_gbrg16', 'bayer_grbg16']:pil_mode = 'I;16'if img_msg.is_bigendian:mode='I;16B'else:mode='I;16L'elif img_msg.encoding == 'mono16' or img_msg.encoding == '16UC1':pil_mode = 'F'if img_msg.is_bigendian:mode = 'F;16B'else:mode = 'F;16'elif img_msg.encoding == 'rgba8':mode = 'BGR'alpha = Trueelif img_msg.encoding == 'bgra8':mode = 'RGB'alpha = Trueelse:raise Exception("Unsupported image format: %s" % img_msg.encoding)pil_img = Image.frombuffer(pil_mode, (img_msg.width, img_msg.height), img_msg.data, 'raw', mode, 0, 1)# 16 bits conversion to 8 bitsif pil_mode == 'I;16':pil_img = pil_img.convert('I').point(lambda i: i * (1. / 256.)).convert('L')if pil_img.mode == 'F':pil_img = pil_img.point(lambda i: i * (1. / 256.)).convert('L')pil_img = ImageOps.autocontrast(pil_img)if rgba and pil_img.mode != 'RGBA':pil_img = pil_img.convert('RGBA')return pil_imgexcept Exception as ex:print('Can\'t convert image: %s' % ex, file=sys.stderr)return None
修改后
def imgmsg_to_pil(img_msg, rgba=True):try:pil_mode = 'RGB'if img_msg._type == 'sensor_msgs/CompressedImage':pil_img = Image.open(StringIO(img_msg.data))if pil_img.mode != 'L':pil_img = pil_bgr2rgb(pil_img)else:alpha = Falseif img_msg.encoding == 'mono8':mode = 'L'elif img_msg.encoding == 'rgb8':mode = 'RGB'elif img_msg.encoding == 'bgr8':mode = 'BGR'elif img_msg.encoding in ['bayer_rggb8', 'bayer_bggr8', 'bayer_gbrg8', 'bayer_grbg8']:mode = 'L'elif img_msg.encoding in ['bayer_rggb16', 'bayer_bggr16', 'bayer_gbrg16', 'bayer_grbg16']:pil_mode = 'I;16'if img_msg.is_bigendian:mode='I;16B'else:mode='I;16L'elif img_msg.encoding == 'mono16' or img_msg.encoding == '16UC1':pil_mode = 'F'if img_msg.is_bigendian:mode = 'F;16B'else:mode = 'F;16'elif img_msg.encoding == 'rgba8':mode = 'BGR'alpha = Trueelif img_msg.encoding == 'bgra8':mode = 'RGB'alpha = Trueelse:raise Exception("Unsupported image format: %s" % img_msg.encoding)pil_img = Image.frombuffer(pil_mode, (img_msg.width, img_msg.height), img_msg.data, 'raw', mode, 0, 1)# 16 bits conversion to 8 bitsif pil_mode == 'I;16':pil_img = pil_img.convert('I').point(lambda i: i * (1. / 256.)).convert('L')if pil_img.mode == 'F':pil_img = pil_img.point(lambda i: i * (1. / 256.)).convert('L')pil_img = ImageOps.autocontrast(pil_img)if rgba and pil_img.mode != 'RGBA':pil_img = pil_img.convert('RGBA')return pil_imgexcept Exception as ex:print('Can\'t convert image: %s' % ex, file=sys.stderr)return None
【ROS-Error】 Can‘t convert image: local variable ‘pil_mode‘ referenced before assignment相关推荐
- 【debug】UnboundLocalError local variable a referenced before assignment
1)下面这种情况是不会报错的: >>> x = 10 >>> def bar(): ... print(x) >>> bar() 10 (2)但是 ...
- 【报错】UnboundLocalError: local variable ‘XXX‘ referenced before assignment解决办法
参考这篇 https://blog.csdn.net/YZL40514131/article/details/122082820
- 【ROS系统】解决找不到用户工作空间下的程序包的问题——E:No such package
[ROS系统]解决找不到用户工作空间下的程序包的问题--E:No such package 参考文章: (1)[ROS系统]解决找不到用户工作空间下的程序包的问题--E:No such package ...
- 【ROS基础】ROS_c++ 语法记录
系列文章目录 [ROS基础]Linux 命令行 [ROS基础].launch 文件语法记录 [ROS基础]CMakeLists.txt 文件语法记录 [ROS基础]Package.xml 文件语法记录 ...
- 【ros学习】14.urdf、xacro机器人建模与rviz、gazebo仿真详解
一.起因 学校的这学期课程是ros机器人开发实战,我们学习小组也要搞一个自己的机器人模型,我们组又叫葫芦组,所以我就做了个葫芦形状的机器人,虽说有点丑,本来想用maya建模再导入的,奈何不太懂maya ...
- 【ROS wiki】ros wiki中查阅常见的消息类型
ROS wiki系列文章简介:ROS wiki系列文章是本人ROS专栏下的子专题.该系列文章主要用来介绍:ROS初学者如何利用好ROS官方提供的ROS wiki平台,来查询ROS资料,了解ROS包的功 ...
- 【ROS基础】Linux命令行
系列文章目录 [ROS基础]Linux 命令行 [ROS基础].launch 文件语法记录 [ROS基础]CMakeLists.txt 文件语法记录 [ROS基础]Package.xml 文件语法记录 ...
- 【代码error】RuntimeError: 1only batches of spatial targets supported (3D tensors) but got targets of si
[代码error]RuntimeError: 1only batches of spatial targets supported (3D tensors) but got targets of si ...
- 【ros/ros2】LCN及ros2节点的LCN改写
文章目录 序言 1. ros2两种节点类型 2. LCN是什么 3. LCN状态转换 4. LCN状态转换要做的事 5. LCN节点功能划分 6. ros2节点的LCN改写 6.1 CMakeList ...
最新文章
- java初始化实例化_Java对象的创建过程:类的初始化与实例化
- 单片机软件proteus的汉化步骤
- 圣诞节玩购目的地大比拼
- linux java ocr_Linux环境如何支持使用tess4j进行ORC
- Redis字符串操作
- SQL增删改查,基础
- HDU-2829 Lawrence (DP+四边形不等式优化)
- django models中批量导入数据
- 1.4 消息循环和回调函数
- RecordMyDesktop安装与使用
- mycat 分片规则
- 在Python中执行JavaScript代码并进行数据交换
- Mac翻译系列软件推荐三:Mate Translate for Mac多国语言翻译工具
- Window10笔记本电脑如何更改默认浏览器
- python opencv图像笔记
- 建Kangle+EasyPanel对接SWAP IDC虚拟主机自助开通完整教程
- 编译原理_P1003
- kali WEP 破解
- Frequent Itemset Mining 频繁项集查找
- [读书笔记]-《高能要事》-一次做好一件事
热门文章
- 04Hadoop中的setPartitionerClass/SortComparator/GroupingComparator问题
- maven+jenkins自动化构件
- 阅读总结:如何在生产中成功运用Docker
- [高中作文赏析]相约
- javase总结报告
- Android多媒体学习三:实现自己的Camera
- shd_config ssh设置(ssh客户端连接服务器断开)
- How Many Answers Are Wrong HDU - 3038(带权并查集)
- 安装Python3的工具包报Microsoft Visual C++ 14.0 is required的错误
- Scrapy中的yield使用