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相关推荐

  1. 【debug】UnboundLocalError local variable a referenced before assignment

    1)下面这种情况是不会报错的: >>> x = 10 >>> def bar(): ... print(x) >>> bar() 10 (2)但是 ...

  2. 【报错】UnboundLocalError: local variable ‘XXX‘ referenced before assignment解决办法

    参考这篇 https://blog.csdn.net/YZL40514131/article/details/122082820

  3. 【ROS系统】解决找不到用户工作空间下的程序包的问题——E:No such package

    [ROS系统]解决找不到用户工作空间下的程序包的问题--E:No such package 参考文章: (1)[ROS系统]解决找不到用户工作空间下的程序包的问题--E:No such package ...

  4. 【ROS基础】ROS_c++ 语法记录

    系列文章目录 [ROS基础]Linux 命令行 [ROS基础].launch 文件语法记录 [ROS基础]CMakeLists.txt 文件语法记录 [ROS基础]Package.xml 文件语法记录 ...

  5. 【ros学习】14.urdf、xacro机器人建模与rviz、gazebo仿真详解

    一.起因 学校的这学期课程是ros机器人开发实战,我们学习小组也要搞一个自己的机器人模型,我们组又叫葫芦组,所以我就做了个葫芦形状的机器人,虽说有点丑,本来想用maya建模再导入的,奈何不太懂maya ...

  6. 【ROS wiki】ros wiki中查阅常见的消息类型

    ROS wiki系列文章简介:ROS wiki系列文章是本人ROS专栏下的子专题.该系列文章主要用来介绍:ROS初学者如何利用好ROS官方提供的ROS wiki平台,来查询ROS资料,了解ROS包的功 ...

  7. 【ROS基础】Linux命令行

    系列文章目录 [ROS基础]Linux 命令行 [ROS基础].launch 文件语法记录 [ROS基础]CMakeLists.txt 文件语法记录 [ROS基础]Package.xml 文件语法记录 ...

  8. 【代码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 ...

  9. 【ros/ros2】LCN及ros2节点的LCN改写

    文章目录 序言 1. ros2两种节点类型 2. LCN是什么 3. LCN状态转换 4. LCN状态转换要做的事 5. LCN节点功能划分 6. ros2节点的LCN改写 6.1 CMakeList ...

最新文章

  1. java初始化实例化_Java对象的创建过程:类的初始化与实例化
  2. 单片机软件proteus的汉化步骤
  3. 圣诞节玩购目的地大比拼
  4. linux java ocr_Linux环境如何支持使用tess4j进行ORC
  5. Redis字符串操作
  6. SQL增删改查,基础
  7. HDU-2829 Lawrence (DP+四边形不等式优化)
  8. django models中批量导入数据
  9. 1.4 消息循环和回调函数
  10. RecordMyDesktop安装与使用
  11. mycat 分片规则
  12. 在Python中执行JavaScript代码并进行数据交换
  13. Mac翻译系列软件推荐三:Mate Translate for Mac多国语言翻译工具
  14. Window10笔记本电脑如何更改默认浏览器
  15. python opencv图像笔记
  16. 建Kangle+EasyPanel对接SWAP IDC虚拟主机自助开通完整教程
  17. 编译原理_P1003
  18. kali WEP 破解
  19. Frequent Itemset Mining 频繁项集查找
  20. [读书笔记]-《高能要事》-一次做好一件事

热门文章

  1. 04Hadoop中的setPartitionerClass/SortComparator/GroupingComparator问题
  2. maven+jenkins自动化构件
  3. 阅读总结:如何在生产中成功运用Docker
  4. [高中作文赏析]相约
  5. javase总结报告
  6. Android多媒体学习三:实现自己的Camera
  7. shd_config ssh设置(ssh客户端连接服务器断开)
  8. How Many Answers Are Wrong HDU - 3038(带权并查集)
  9. 安装Python3的工具包报Microsoft Visual C++ 14.0 is required的错误
  10. Scrapy中的yield使用