问题1:
直接使用ros下usb_cam工具,
roslaunch usb_cam-test.launch
图像出现如下花屏:
查了一下说将摄像头的默认像素格式由原来的yuyv改为mjpeg格式:
进入功能包:
roscd uvc_camera
进入lanch文件夹,改:
<launch>
<node name="usb_cam" pkg="usb_cam" type="usb_cam_node" output="screen" >
<param name="video_device" value="/dev/video0" />
<param name="image_width" value="640" />
<param name="image_height" value="480" />
<param name="pixel_format" value="yuyv" />
<param name="camera_frame_id" value="usb_cam" />
<param name="io_method" value="mmap"/>
</node>
<node name="image_view" pkg="image_view" type="image_view" respawn="false" output="screen">
<remap from="image" to="/usb_cam/image_raw"/>
<param name="autosize" value="true" />
</node>
</launch>
问题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 参数的值来修复错误:
从:
<param name="pixel_format" value="mjpeg" />
到:
<param name="pixel_format" value="yuyv" />
那我岂不是又回到第一个问题了?
啊啊啊啊啊!
opencv读取视频正常
试了一下直接用opencv读取视频:正常
最后解决:
既然opencv能读到,
那我就先使用opencv读取图像
mkdir -p cvImage2ros/src
cd cvImage2ros/src
catkin_create_pkg cvImage2ros sensor_msgs cv_bridge roscpp std_msgs image_transport
cd ..
catkin_make
source ./devel/setup.bash
然后在src文件下新建文件cvImage2ros.cpp
#include <iostream>
#include <ros/ros.h>
#include <cv_bridge/cv_bridge.h>
#include <sensor_msgs/image_encodings.h>
#include <image_transport/image_transport.h>
#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/imgproc/imgproc.hpp>
#include <opencv2/videoio.hpp>
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