2015-11-19 3 views
3

Я использую передачу изображений 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 указывает на пустое изображение?

ответ

3

За this ROS wiki article, toCvShare() возвращает CvImageConstPtr, который является typedef для boost::shared_ptr<CvImage const>.

В случае:

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

.. Для boost::shared_ptr<CvImage const> возвращенный toCvShare() называется временный объект. В C++ временные объекты уничтожаются как последний шаг при оценке полного выражения, которое лексически содержит точку, в которой они были созданы (см. Раздел [class.temporary] спецификации C++). Таким образом, recivedRosImage является указателем на член image из const CvImage, который уничтожается в конце выражения присваивания, и ваша программа вызывает неопределенное поведение путем разыменования 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); 

Смотрите также § 1.5, примеры совместного использования данных изображения, из выше связанных вики статьи.

Смежные вопросы