ROS关于cv_brige的使用

ROS关于cv_brige的使用


最近想使用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可以有选择的对颜色和深度信息进行转化。为了使用指定的特征编码,就有下面集中的编码形式:

mono8: CV_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;
};

zhuanzhai: https://www.cnblogs.com/li-yao7758258/p/6637079.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值