一、工具
ubuntu18.04
ROS+opencv2
编译器:Visual Studio Code
二、原理
图像信息
ROS数据形式:sensor_msgs::Image
OpenCV数据形式:cv:Mat
通过cv_bridge()函数进行ROS向opencv转换
cv_bridge是在ROS图像消息和OpenCV图像之间进行转换的一个功能包。
ros->opencv
cv_ptr = cv_bridge::toCvCopy(msg, sensor_msgs::image_encodings::BGR8);
可以在回调函数里进行转换
cv_bridge::CvImagePtr cv_ptr;
try
{
cv_ptr = cv_bridge::toCvCopy(msg, sensor_msgs::image_encodings::BGR8);
}
catch (cv_bridge::Exception& e)
{
ROS_ERROR("cv_bridge exception: %s", e.what());
return;
}
将ROS图像消息转换在OpenCV中使用,可以进行图像处理和opencv操作。
opencv->ros
使用toImageMsg()成员函数
try
{
msg = cv_bridge::CvImage(std_msgs::Header(), "bgr8", frame).toImageMsg();
}
catch (cv_bridge::Exception& e)
{
ROS_ERROR("cv_bridge exception:%s",e.what());
}
驱动相机
通过opencv直接打开相机0,vieo_device为video0
VideoCapture cap(video_device); //dev/video0
if(!cap.isOpened())
{
ROS_ERROR("Can not opencv video device\n");
return 1;
}
话题发布
ROS中标准的消息订阅和发布方式为
ros::NodeHandle nh;
ros::Subscriber sub = nh.subscribe("topic", 1, Callback);
ros::Publisher pub = nh.advertise<sensor_msgs::Image>("topic", 1);
只会发布单一话题
使用image_transport进行发布话题
ros::NodeHandle nh;
image_transport::ImageTransport it(nh);
image_transport::Subscriber sub = it.subscribe("topic", 1, Callback);
image_transport::Publisher pub = it.advertise("topic", 1);
这种方式会发布一系列话题
然后将转换后的图像发布即可
三、使用
在摄像头画面加一个圆并发布出去
通过rqt_image_view查看话题
这里只进行简单的使用,后续可以通过opencv进行颜色识别,轮廓识别等等,以及人脸数字识别,将所有的opencv项目通过ROS包装起来。
这里附上源码链接
https://github.com/jiezz12/Opencv_ros.githttps://github.com/jiezz12/Opencv_ros.git
参考:
http://wiki.ros.org/image_transport
https://my.oschina.net/u/4273421/blog/3587403