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"
编译,顺利通过。
测试摄像头:
完美!