トピックに基づいてビデオ画像フレームを購読して表示するrosサブスクライバノードのコードスニペット以下。私の必要条件として、cv_ptr-> imageをC++文字列に変換してバイト配列(ベクトル)を作成できるようにする必要があります。ROS cv_bridge C++文字列でのImagePtr変換
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);
}
基本的に私は、トピックに基づいて画像をサブスクライブ.After C++文字列にcv_ptr->画像フレームバッファを変換APIを探しています、私はそれが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で同じことを達成する方法を提案できますか?
のようなその内容は、あなたが言うことを意味:CV ::マット・イメージ= cv_ptr->画像を。文字列mystring(image.begin()、image.end ());今度はベクトル内の文字列をpush_backします。 –
user2907032
これは通常の配列です(文字列ではなく、すべての文字配列は文字列ではありません!!)ので、その要素に直接アクセスしてそこからベクトルを初期化することができます。 cv :: Matは既にイテレータの開始と終了を定義しており、次のようにcv :: Matインスタンスからベクトルを直接初期化できます。 '' 'std :: vector my_vec(cv_ptr-> image .begin()、cv_ptr-> image.end()); '' ' –
Ongun
cv_ptrはboost_createであり、beginメソッドとendメソッドを持たないのでコンパイルエラーです。文字列を別々に作成し、ベクトル内で繰り返します。 – user2907032