ROS踩雷日志(一) usb_cam包显示warning “deprecated pixel format used”

1. 问题背景与描述

  想在ROS移动平台上运行简单的图像处理算法,但由于经济紧张,先在tb购买了一百多的usb摄像头做测试。按以往经验,使用官方的usb_cam包驱动摄像头,视频格式为MJPEG,图像能正常显示,但出现了以下warning:

[swscaler @ 0x28dace0] deprecated pixel format used, make sure you did set range correctly

  在程序运行中会在终端不断跳出且无法关闭,影响工程正常输出,对强迫症患者带来较大伤害。

2. 问题解决过程

  stackoverflow找到相似问题: swscaler warning : deprecated pixel format used
在这里插入图片描述
下载并打开usb_cam源码包,打开src目录下usb_cam.cpp文件,查找关键字sws_scale,定位至代码的第450行,看到了产生问题的函数:

sws_scale(video_sws_, avframe_camera_->data, avframe_camera_->linesize, 0, ysize, avframe_rgb_->data, avframe_rgb_->linesize);

再往上看,就是定义video_sws_的语句了:

video_sws_ = sws_getContext(xsize, ysize, avcodec_context_->pix_fmt, xsize, ysize, AV_PIX_FMT_RGB24, SWS_BILINEAR, NULL, NULL, NULL);

接下来就好办了,只要在以上函数运行前,将avcodec_context_->pix_fmt的内容更改即可。

最后,加入以下代码片段:

  {
    AVPixelFormat pixFormat;
    switch (avcodec_context_->pix_fmt) {
    case AV_PIX_FMT_YUVJ420P :
        pixFormat = AV_PIX_FMT_YUV420P;
        break;
    case AV_PIX_FMT_YUVJ422P  :
        pixFormat = AV_PIX_FMT_YUV422P;
        break;
    case AV_PIX_FMT_YUVJ444P   :
        pixFormat = AV_PIX_FMT_YUV444P;
        break;
    case AV_PIX_FMT_YUVJ440P :
        pixFormat = AV_PIX_FMT_YUV440P;
        break;
    default:
        pixFormat = avcodec_context_->pix_fmt;
        break;
    }
    avcodec_context_->pix_fmt = pixFormat;
  }//added by Wu Hangyu

加入位置如下所示:
在这里插入图片描述
最后运行catkin_make -DCATKIN_WHITELIST_PACKAGES="usb_cam"编译,顺利通过。

测试摄像头:
在这里插入图片描述
完美!

  • 4
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值