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
ROS踩雷日志(一) usb_cam包显示warning “deprecated pixel format used”_第1张图片
下载并打开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

加入位置如下所示:
ROS踩雷日志(一) usb_cam包显示warning “deprecated pixel format used”_第2张图片
最后运行catkin_make -DCATKIN_WHITELIST_PACKAGES="usb_cam"编译,顺利通过。

测试摄像头:
ROS踩雷日志(一) usb_cam包显示warning “deprecated pixel format used”_第3张图片
完美!

你可能感兴趣的:(ROS)