最近想使用OpenCV 和ROS实现点云的拼接,实现三维重建,那么在学习了kinect的基本的使用方法以后我们知道,直接使用ROS 的包即可得到点云,深度图,rgb图等信息,

roslaunch openni_launch openni.launch(深度图彩色图,还有点云都获取了)

rosrun openni_camera openni_node   (深度图与彩色图)

那么实现点云的拼接就需要使用cv_bridge把ROS 的数据格式转为Opencv可以使用的数据格式。即是一个提供ROS和OpenCV库提供之间的接口的开发包。

(1) 将ROS图像信息转换为OpenCV图像

cvbridge定义了一个opencv图像cvimage的类型、包含了编码和ROS的信息头。cvimage包含准确的信息sensor_msgs /image,因此我们可以将两种数据类型进行转换。cvimage类格式:

namespace cv_bridge {

class CvImage
{
public:
std_msgs::Header header;
std::string encoding;
cv::Mat image;
}; typedef boost::shared_ptr<CvImage> CvImagePtr;
typedef boost::shared_ptr<CvImage const> CvImageConstPtr; }

当要把一个ROS 的sensor_msgs /image 信息转化为一cvimage,cvbridge有两个不同的使用情况:

(1)如果要修改某一位的数据。我们必须复制ROS信息数据的作为副本。

(2)不修改数据。可以安全地共享的ROS信息,而不是复制的数据。

cvbridge转换为CvImage提供了以下功能:

// Case 1: Always copy, returning a mutable CvImage
CvImagePtr toCvCopy(const sensor_msgs::ImageConstPtr& source,
const std::string& encoding = std::string());
CvImagePtr toCvCopy(const sensor_msgs::Image& source,
const std::string& encoding = std::string()); // Case 2: Share if possible, returning a const CvImage
CvImageConstPtr toCvShare(const sensor_msgs::ImageConstPtr& source,
const std::string& encoding = std::string());
CvImageConstPtr toCvShare(const sensor_msgs::Image& source,
const boost::shared_ptr<void const>& tracked_object,
const std::string& encoding = std::string());

输入是图像消息指针,以及可选的编码参数。编码是指cvimage的类型。

tocvcopy复制从ROS消息的图像数据,可以自由修改返回的cvimage。即使当源和目的编码匹配。

tocvshare将避免复制,在ROS的消息数据把指针返回的 cv::mat,,如果源和目的编码匹配。只要你保持一份返回的cvimage,ROS的消息数据将不会释放。如果编码不匹配时,它将分配一个新的缓冲区,执行转换。将不得修改返回的cvimage,因为它可能与ROS的图像信息共享数据,这反过来又可能与其他回调函数共享。注:对tocvshare二次过载更方便,转换当一个指针指向其他信息类型(如stereo_msgs / disparityimage)包含一个sensor_msgs /image。

如果没有编码(或更确切地说,空字符串),则目标图像编码将与图像消息编码相同。在这种情况下tocvshare保证不复制图像数据。图像编码可以是以下任何一个opencv图像编码:

  • 8UC[1-4]
  • 8SC[1-4]
  • 16UC[1-4]
  • 16SC[1-4]
  • 32SC[1-4]
  • 32FC[1-4]
  • 64FC[1-4]

介绍集中cvbridge 中常见的数据编码的形式,cv_bridge可以有选择的对颜色和深度信息进行转化。为了使用指定的特征编码,就有下面集中的编码形式:

mono8CV_8UC1, 灰度图像

mono16: CV_16UC1,16位灰度图像

bgr8: CV_8UC3,带有颜色信息并且颜色的顺序是BGR顺序

rgb8: CV_8UC3,带有颜色信息并且颜色的顺序是RGB顺序

bgra8: CV_8UC4, BGR的彩色图像,并且带alpha通道

rgba8: CV_8UC4,CV,RGB彩色图像,并且带alpha通道

注:这其中mono8和bgr8两种图像编码格式是大多数OpenCV的编码格式。

Finally, CvBridge will recognize Bayer pattern encodings as having OpenCV type 8UC1 (8-bit unsigned, one channel). It will not perform conversions to or from Bayer pattern; in a typical ROS system, this is done instead by image_proc. CvBridge recognizes the following Bayer encodings:

  • bayer_rggb8

  • bayer_bggr8

  • bayer_gbrg8

  • bayer_grbg8

1.把Opencv图像转换为ROS图像格式

To convert a CvImage into a ROS image message, use one the toImageMsg() member function:

class CvImage
{
sensor_msgs::ImagePtr toImageMsg() const; // Overload mainly intended for aggregate messages that contain
// a sensor_msgs::Image as a member.
void toImageMsg(sensor_msgs::Image& ros_image) const;
};

举个例子

首先要在创建的包CMakeLists.txt里添加依赖包。分别如下:

sensor_msgs
cv_bridge
roscpp
std_msgs
image_transport                        

在src文件下建立一个cv_ros_beginner.cpp文件文件内容如下

#include <ros/ros.h>               //ros 的头文件
#include <image_transport/image_transport.h> //image_transport
#include <cv_bridge/cv_bridge.h> //cv_bridge
#include <sensor_msgs/image_encodings.h> //图像编码格式
#include <opencv2/imgproc/imgproc.hpp> //图像处理
#include <opencv2/highgui/highgui.hpp> //opencv GUI static const std::string OPENCV_WINDOW = "Image window"; //申明一个GUI 的显示的字符串 class ImageConverter //申明一个图像转换的类
{
ros::NodeHandle nh_; //实例化一个节点
image_transport::ImageTransport it_;
image_transport::Subscriber image_sub_; //订阅节点
image_transport::Publisher image_pub_; //发布节点 public:
ImageConverter()
: it_(nh_)
{
// Subscrive to input video feed and publish output video feed
image_sub_ = it_.subscribe("/rgb/image_raw", , &ImageConverter::imageCb, this);
image_pub_ = it_.advertise("/image_converter/output_video", ); cv::namedWindow(OPENCV_WINDOW);
} ~ImageConverter()
{
cv::destroyWindow(OPENCV_WINDOW);
} void imageCb(const sensor_msgs::ImageConstPtr& msg) //回调函数
{
cv_bridge::CvImagePtr cv_ptr; //申明一个CvImagePtr
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;
}
//转化为opencv的格式之后就可以对图像进行操作了
// Draw an example circle on the video stream
if (cv_ptr->image.rows > && cv_ptr->image.cols > )
cv::circle(cv_ptr->image, cv::Point(, ), , CV_RGB(,,)); //画圆 // Update GUI Window
cv::imshow(OPENCV_WINDOW, cv_ptr->image);
cv::waitKey(); // Output modified video stream
image_pub_.publish(cv_ptr->toImageMsg());
}
}; int main(int argc, char** argv)
{
ros::init(argc, argv, "image_converter");
ImageConverter ic;
ros::spin();
return ;
}

然后在CMakeLists.txt添加,

add_executable(cv_ros_beginner src/cv_ros_beginner.cpp)
 target_link_libraries(cv_ros_beginner
   ${catkin_LIBRARIES}
 )

返回catin_ws 下catkin_make即可生成可执行文件

那么我们在查看结果的时候就是要把

image_sub_ = it_.subscribe("/rgb/image_raw", 1, &ImageConverter::imageCb, this);

把订阅的节点换成之前我们需要订阅的节点即可实现    在订阅的图像上画一个小圆圈,并且可视化出来。

(小技巧记录:如果你的工作空间下包很多,每次都使用catkin_make的话效率十分低下,因为这种编译方法会编译工作空间下的所有的包,特别是我们在调试程序是会经常修改CMakeLists.txt文件里的内容,这样每次都会要编译整个工作空间,那么所以我们可以使用ROS的catkin_Make的功能编译一个或者多个包,具体的命令是:catkin_make -DCATKIN_WHITELIST_PACKAGES=" 你的包名"),例如:catkin_make -DCATKIN_WHITELIST_PACKAGES="ros_slam"

如果需要编译两个或者多个只需要中间加分号即可catkin_make -DCATKIN_WHITELIST_PACKAGES="ros_slam;cv_bridge",

只是搬运以下官网的程序,当然你可以实现更多的处理

那么有关于ROS以及PCL的使用的兴趣者扫描二维码关注一起与我交流分享

ROS关于cv_brige的使用的更多相关文章

  1. 阿里云VPS服务器,ROS内网穿透

    Aliyun Windows Server 2008 R2中建立vpn服务器,ros中使用pptp拨号连接 2.在Aliyun服务器中,修改hosts,将内网分配的ip映射到指定的域名,在Aliyun ...

  2. QT下调试基于ros的catkin项目

    1.首先告诉qt ros的搜索路径,通过修改qt creator 桌面启动程序来实现 sudo    gedit ~/.local/share/applications/DigiaQtOpenSour ...

  3. ROS学习(三)—— ROS文件系统

    一.预备工作 使用ros0tutorials程序包,先下载: sudo apt-get install ros-<distro>-ros-tutorials 其中<distro> ...

  4. ROS学习(二)—— 配置ROS环境

    一.管理环境 p { margin-bottom: 0.25cm; line-height: 120% } a:link { } 如果你在查找和使用ROS软件包方面遇到了问题,请确保你已经正确配置了脚 ...

  5. ROS学习(一)—— 环境搭建

    一.配置Ubuntu软件仓库且选择ROS正确版本 二.添加source.list sudo sh -c 'echo "deb http://packages.ros.org/ros/ubun ...

  6. [ROS] Studying Guidance

    Reference: https://www.zhihu.com/question/35788789 安装指南:http://wiki.ros.org/indigo/Installation/Ubun ...

  7. ros::spin() 和 ros::spinOnce() 区别及详解

    版权声明:本文为博主原创文章,转载请标明出处: http://www.cnblogs.com/liu-fa/p/5925381.html 博主提示:本文基于ROS Kinetic Kame,如有更(g ...

  8. Learning Roadmap of Robotic Operating System (ROS)

    ROS Wiki: http://wiki.ros.org/ Robots Using ROS Textbooks: A Gentle Introduction to ROS Learning ROS ...

  9. k-develop 在ros上面的应用

    sudo apt-get install kdevelop 根据wiki上面的ros 章节中,关于kdevelop的介绍,配置好环境即可. 导入工程时,选中src/src下面的章节,不过,需要注意去掉 ...

随机推荐

  1. Matlab 2016b 正式版下载

    Matlab 2016b  正式版下载 这两天为完成最优化大作业,zyy又开始鼓捣matlab了.之前我装的是matlab 2013a,发现不支持求解整数规划,遂更新了一下. 下载地址 链接:http ...

  2. Win7/Win8.1右键菜单技巧:应用程序任意加

    对于Win7.Win8.1老用户来说,日常使用中离不开双击各类第三方应用程序,尤其是常用的记事本.QQ聊天.关机.一键截图等程序,这时我们不妨将这些“右键菜单”,轻松实现一键开启QQ.截图或者关机等功 ...

  3. PHP mysqli方式连接类

    分享一个PHP以mysqli方式连接类完整代码实例,有关mysqli用法实例. 一个在PHP中以mysqli方式连接数据库的一个数据库类实例,该数据库类是从一个PHP的CMS中整理出来的,可实现PHP ...

  4. Java泛型经典文章收集

    https://blog.csdn.net/s10461/article/details/53941091 Java泛型详解(从基础到入门)https://blog.csdn.net/jeffleo/ ...

  5. (原创)发布一个C++版本的ORM库SmartDB(一)

    先简单说说ORM的优点: 提高开发效率,减少重复劳动,只和业务实体打交道,由业务实体自动生成sql语句,不用手写sql语句. 简单易用, 可维护性好. 隔离数据源,使得我们更换数据源时不用修改代码. ...

  6. vue实现点击区域外部的区域,关闭该区域

    var _this = this; document.addEventListener('click',function(e){ console.log(_this.$refs.configforms ...

  7. jquery的extend函数

    var extend = (function () { var isObjFunc = function (name) {//返回的是一个函数 var toString = Object.protot ...

  8. Android.mk高级写法

    转:http://blog.csdn.net/langresser_king/article/details/8275291 原本只是想记录一些常用的使用技巧,但是越写越得意(>_<),忍 ...

  9. js使用正则表达式实现文本框只能输入数字和小数点

    第一种情况:且限制小数点前最大3位数,小数点后最大3为三位 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN& ...

  10. js实现文本框文本域光标处插入图片文本的插件(并且光标在插入内容的内容后显示)

    js: /******************************************* * * 插入光标处的插件 * @authors Du xin li * @update    2015 ...