我正在使用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指向空图像的原因是什么?
答案 0 :(得分:3)
根据this ROS wiki article,toCvShare()
会返回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节“共享图像数据的示例”。