ROS Resources: Documentation | Support | Discussion Forum | Index | Service Status | ros @ Robotics Stack Exchange
Ask Your Question
0

return an array from a function member of a class

asked 2013-03-06 04:02:54 -0500

mateo_7_7 gravatar image

updated 2014-01-28 17:15:33 -0500

ngrennan gravatar image

I'm using ROS and OpenCV in C++ environment in order to acquire a video (gray-scale) from a ROS node, convert the data through cv_bridge (in order to elaborate it through OpenCV), extract some data and publish them on a topic as ROS messages.

My problem is that I don't know how to send the array frame to the main function in order to elaborate it! I cannot elaborate out of it, because I need to distinguish between different data of different frames. This is my code:

#include <ros/ros.h>
#include <image_transport/image_transport.h>
#include <cv_bridge/cv_bridge.h>
#include <sensor_msgs/image_encodings.h>
#include <opencv2/imgproc/imgproc.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <vector>
#include "rd_ctrl/proc_data.h"
#include <cv.h>

using namespace std;
namespace enc = sensor_msgs::image_encodings;


rd_ctrl::proc_data points;

ros::Publisher data_pub_; 

static const char WINDOW[] = "Image window";

class ImageConverter
{
  ros::NodeHandle nh_;
  image_transport::ImageTransport it_;
  image_transport::Subscriber image_sub_;
  image_transport::Publisher image_pub_;

public:
  ImageConverter()
    : it_(nh_)
  {
    image_pub_ = it_.advertise("out", 1);
    image_sub_ = it_.subscribe("/vrep/visionSensorData", 1, &ImageConverter::imageCb, this);


    cv::namedWindow(WINDOW);
  }

  ~ImageConverter()
  {
    cv::destroyWindow(WINDOW);
  }

  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;
    }

 CvMat frame= cv_ptr->image;     //definition of "frame"
cvSmooth(&frame, &frame, CV_MEDIAN);
 cvThreshold(&frame, &frame,200, 255,CV_THRESH_BINARY);

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

    image_pub_.publish(cv_ptr->toImageMsg());
  }
};


int main(int argc, char** argv)
{
  ros::init(argc, argv, "image_proc");
  ImageConverter ic;
ros::NodeHandle n;

//....elaboration of "frame" and production of the data "points"

data_pub_.publish(points);

data_pub_ = n.advertise<rd_ctrl::proc_data>("/data_im", 1);

 ros::spin();
  return 0;
}

I hope that the question is clear enough. Can you help me please?

edit retag flag offensive close merge delete

1 Answer

Sort by ยป oldest newest most voted
2

answered 2013-03-06 04:07:12 -0500

dornhege gravatar image

You should do the publishing after you processed the data, i.e. in your example in the image callback. There is no real need to get that back to the main function.

edit flag offensive delete link more

Comments

ok, in my example i do the publishing after the processing (don't i?) pub i can do that because i suppose that i can use the variable "frame" in main funct. how can i do the same thing out of main?

mateo_7_7 gravatar image mateo_7_7  ( 2013-03-06 04:51:09 -0500 )edit

in addition, if i should, for example, make a matching between 2 consecutive frames or extract the absolute first frame, how could i do?

mateo_7_7 gravatar image mateo_7_7  ( 2013-03-06 04:52:08 -0500 )edit

Which publishing? You have two publishers. The data_pub_ doesn't make sense right now. It's publishing before being advertised and also before you spin. The image_pub_ can work like this.

dornhege gravatar image dornhege  ( 2013-03-06 05:09:46 -0500 )edit

in fact "image_pub_" works, i'm talking about "data_pub_"...i don't know how handle it in order to, other example, publish the value of all border pixel of the image..

mateo_7_7 gravatar image mateo_7_7  ( 2013-03-06 05:28:19 -0500 )edit
1

You should advertise and publish at the same locations like you did the image pub.

dornhege gravatar image dornhege  ( 2013-03-06 06:35:15 -0500 )edit

ok, but I think that in this way the problem of the extraction of the first frame or the matching between 2 consecutive frames remains

mateo_7_7 gravatar image mateo_7_7  ( 2013-03-06 23:34:11 -0500 )edit

If you want to do something in relation to two image messages, you'll have to store the previous frame somewhere. In your class seems reasonable.

dornhege gravatar image dornhege  ( 2013-03-06 23:41:53 -0500 )edit

Question Tools

Stats

Asked: 2013-03-06 04:02:54 -0500

Seen: 377 times

Last updated: Mar 06 '13