2017-05-29 176 views
1

下面的代碼片段從ros訂戶節點,其中視頻圖像框架根據主題訂閱並顯示。根據我的要求,cv_ptr-> image需要被轉換爲C++字符串,以便我可以創建字節數組(矢量)。ROS cv_bridge ImagePtr C++字符串轉換

void imageCb(const sensor_msgs::ImageConstPtr& msg) 
{ 
    cv_bridge::CvImagePtr cv_ptr; 
    try 
    { 
     cv_ptr = cv_bridge::toCvCopy(msg, enc::BGR8); 
    } 
    catch (cv_bridge::Exception& e) 
    { 
     ROS_ERROR("cv_bridge exception: %s", e.what()); 
     return; 
    } 

    if (cv_ptr->image.rows > 60 && cv_ptr->image.cols > 60) 
     cv::circle(cv_ptr->image, cv::Point(50, 50), 10, CV_RGB(255,0,0)); 

    cv::imshow(WINDOW, cv_ptr->image); 
    cv::waitKey(3); 
} 

基本上我尋找API其將cv_ptr->圖像幀緩衝器中的C++串。經過基於訂閱主題圖像,我需要將相同的轉換中的字節數組,以便它可以在activemqcpp生產者被插入因爲另一端的activemqjava用戶期望在字節流格式中相同。下面

string img_string = (copy operation) cv_ptr->image;// Not sure how to copy this buffer in c++ string 

vector <unsigned char> vec(img_string.begin().img_string.end()); 

是類規範按cv_bridge.h文件。

class CvImage; 
typedef boost::shared_ptr<CvImage> CvImagePtr; 
typedef boost::shared_ptr<CvImage const> CvImageConstPtr; 

class CvImage 
{ 
public: 
std_msgs::Header header; 
std::string encoding;  
cv::Mat image;   
sensor_msgs::ImagePtr toImageMsg() const; 

    void toImageMsg(sensor_msgs::Image& ros_image) const; 

    typedef boost::shared_ptr<CvImage> Ptr; 
    typedef boost::shared_ptr<CvImage const> ConstPtr; 

}; 

任何人都可以建議如何在roscpp中實現相同?

回答

0

如此處指定http://docs.opencv.org/3.1.0/d3/d63/classcv_1_1Mat.html#a4d33bed1c850265370d2af0ff02e1564 OpenCV的Mat類已將圖像數據存儲爲無符號字符數組。

cv_ptr->image的類型已經是cv::Mat

所有你需要做訪問其內容像cv_ptr->image.data

+0

你的意思是說:CV ::墊圖像= cv_ptr->圖像;字符串mystring(image.begin (),image.end ());現在push_back向量中的字符串。 – user2907032

+0

這是一個常規數組(但不是一個字符串,每個char數組不是一個字符串!!),所以你可以直接訪問它的元素並從那裏初始化向量。 正如你所說cv :: Mat已經定義了開始和結束迭代器,你可以直接從cv :: Mat實例初始化一個向量,如: '''std :: vector my_vec(cv_ptr-> image .begin(),cv_ptr-> image.end());''' – Ongun

+0

它給編譯錯誤,因爲cv_ptr是一個boost shared_ptr,它沒有開始和結束的方法,所以我沒有任何選擇,除了分別創建字符串並在矢量內迭代。 – user2907032