问题1:
直接使用ros下usb_cam工具,
roslaunch usb_cam-test.launch
图像看起来模糊如下:
查了一下说将摄像头的默认像素格式由原来的yuyv改为mjpeg格式:
进入功能包:
roscd uvc_camera
进入lanch文件夹,改:
问题2:
像素格式由原来的yuyv改为mjpeg格式后,
运行报错outbuf size mismatch. pic_size: 345600 bufsize: 614400
然后看一下报错内容,大致意思就是,outbuf 大小不匹配。pic_size:3110400 bufsize:4147200
并且得到的是一个黑屏,rostopic 输出全为零
参考https://github.com/ros-drivers/usb_cam/issues/35,说
通过更改 usb_cam_node 的 pixel_format 参数的值来修复错误:
From:
arrive:
那么我回到第一个问题了吗?
啊啊啊啊啊啊!
opencv读取视频正常
试了一下直接用opencv读取视频:正常
最终解决方案:
既然opencv能读到,
那我就先使用opencv读取图像
mkdir -p cvImage2ros/src
cd cvImage2ros/src
catkin_create_pkg rosopencv sensor_msgs cv_bridge roscpp std_msgs image_transport
cd ..
catkin_make
source ./devel/setup.bash
然后在src文件下新建文件cvImage2ros.cpp
#include
#include
#include
#include
#include
#include
#include
#include
#include
int main(int argc, char** argv)
{
ros::init(argc, argv, "imageGet_node");
ros::NodeHandle nh;
image_transport::ImageTransport it(nh);
image_transport::Publisher image_pub = it.advertise("/cameraImage", 1);
ros::Rate loop_rate(200);
cv::Mat imageRaw;
cv::VideoCapture capture(0);
if(capture.isOpened() == 0)
{
std::cout << "Read camera failed!" << std::endl;
return -1;
}
while(nh.ok())
{
capture.read(imageRaw);
cv::imshow("veiwer", imageRaw);
sensor_msgs::ImagePtr msg = cv_bridge::CvImage(std_msgs::Header(), "bgr8", imageRaw).toImageMsg();
image_pub.publish(msg);
ros::spinOnce();
loop_rate.sleep();
if(cv::waitKey(2) >= 0)
break;
}
}
最后在CMakeLists.txt最下面添加:
find_package(OpenCV REQUIRED)
include_directories(${OpenCV_INCLUDE_DIRS})
add_executable(cvImage2ros src/cvImage2ros.cpp)
target_link_libraries(cvImage2ros ${catkin_LIBRARIES} ${OpenCV_LIBS})
然后编译,运行
rosrun cvImage2ros cvImage2ros
发布/cameraImage话题,
其他说明:
参考linux系统下 USB 摄像头1080分辨率采集帧率低问题的解决方法
安装一个 v4l2-ctrl工具:
sudo apt install v4l-utils
查看摄像机支持的视频参数:
sudo v4l2-ctl --all --list-formats-ext
Pixel Format 是视频的格式,Size是视频分辨率,Interval是支持帧率。
通常的USB摄像头,对高清视频,如1080P,在YUYV格式下,都支持不到25-30帧,一般在3-5帧,原因可能是考虑USB的传输速度;
同时,摄像头一般会提供MJPEG的压缩视频格式,因此在使用USB摄像头进行1080分辨率的采集时,需要指定视频格式为MJPEG
文章出处登录后可见!