使用Ros传输帧

时间:2015-11-19 15:10:43

标签: c++ opencv ros

我正在使用ros图像传输来接收和显示图像。在我的回调功能中,我有以下几行

const cv::Mat *recivedRosImage;
recivedRosImage= &(cv_bridge::toCvShare(msg, "bgr8")->image);
cv::imshow("view", *recivedRosImage);// this doesn't work
//cv::imshow("view", cv_bridge::toCvShare(msg, "bgr8")->image); this   works

recivedRosImage指向空图像的原因是什么?

1 个答案:

答案 0 :(得分:3)

根据this ROS wiki articletoCvShare()会返回CvImageConstPtr,这是boost::shared_ptr<CvImage const>的typedef。

以下情况:

recivedRosImage = &(cv_bridge::toCvShare(msg, "bgr8")->image);

.. boost::shared_ptr<CvImage const>返回的toCvShare()称为临时对象。在C ++中,临时对象作为评估完整表达式的最后一步被销毁,该表达式在词法上包含它们的创建点(参见C ++规范的[class.temporary]部分)。因此,recivedRosImage是指向image的{​​{1}}成员的指针,该成员在赋值表达式的末尾被销毁,并且您的程序通过解除引用const CvImage来调用未定义的行为在下一行。

相比之下,这行代码:

recivedRosImage

..有效,因为临时cv::imshow("view", cv_bridge::toCvShare(msg, "bgr8")->image); 对象的生命周期延伸到CvImageConstPtr调用。

解决问题的一种方法是抓住临时cv::imshow()对象,如下所示:

CvImageConstPtr

另请参阅上面链接的wiki文章的第1.5节“共享图像数据的示例”。

相关问题