使用ros转帧

Using Ros to transfer frames

我正在使用 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 指向空图片是什么原因?

Per this ROS wiki article, toCvShare() returns a CvImageConstPtr 这是 boost::shared_ptr<CvImage const>.

的类型定义

如果是:

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

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

相比之下,这行代码:

cv::imshow("view", cv_bridge::toCvShare(msg, "bgr8")->image);

.. 之所以有效,是因为临时 CvImageConstPtr 对象的生命周期延长到 cv::imshow() 调用。

解决问题的一种方法是像这样保持临时 CvImageConstPtr 对象:

CvImageConstPtr sharedCvImage = cv_bridge::toCvShare(msg, "bgr8");
cv::imshow("view", sharedCvImage->image);

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