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

Revision history [back]

click to hide/show revision 1
initial version

So I have a quite similar solution that worked for me:

in the main.cpp file: void BallTrackingNode::mouseHandleStatic(int event, int x, int y, int flags, void* param ) { BallTrackingNode* thiz = static_cast<balltrackingnode*>(param); thiz->onMouse(event, x, y, flags); }

void BallTrackingNode::onMouse( int event, int x, int y, int flags)
{
    if (rect_done_)
      return;
    switch (event)
    {
    case cv::EVENT_MOUSEMOVE:
    {
      region_rect_.width = x - region_rect_.x;
      region_rect_.height = y - region_rect_.y;
    }
    break;
    case cv::EVENT_LBUTTONDOWN:
    {
      region_rect_ = cv::Rect(x, y, 0, 0);
      draw_box_ = true;
    }
    break;
    case cv::EVENT_LBUTTONUP:
    {
      draw_box_ = false;
      if (region_rect_.width < 0)
      {
        region_rect_.x += region_rect_.width;
        region_rect_.width *= -1;
      }
      if (region_rect_.height < 0)
      {
        region_rect_.y += region_rect_.height;
        region_rect_.height *= -1;
      }
      rect_done_ = true;
    }
    }
}

call it with

cv::setMouseCallback(select_cloud_area_window_name_, BallTrackingNode::mouseHandleStatic, (void*)this);

in the header:

public:
  static void mouseHandleStatic( int event, int x, int y, int flags, void* that );
  void onMouse( int event, int x, int y, int flags);

So I have a quite similar solution that worked for me:

in the main.cpp file: void BallTrackingNode::mouseHandleStatic(int event, int x, int y, int flags, void* param ) { BallTrackingNode* thiz = static_cast<balltrackingnode*>(param); thiz->onMouse(event, x, y, flags); }

void BallTrackingNode::onMouse( int event, int x, int y, int flags)
{
    if (rect_done_)
      return;
    switch (event)
    {
    case cv::EVENT_MOUSEMOVE:
    {
      region_rect_.width = x - region_rect_.x;
      region_rect_.height = y - region_rect_.y;
    }
    break;
    case cv::EVENT_LBUTTONDOWN:
    {
      region_rect_ = cv::Rect(x, y, 0, 0);
      draw_box_ = true;
    }
    break;
    case cv::EVENT_LBUTTONUP:
    {
      draw_box_ = false;
      if (region_rect_.width < 0)
      {
        region_rect_.x += region_rect_.width;
        region_rect_.width *= -1;
      }
      if (region_rect_.height < 0)
      {
        region_rect_.y += region_rect_.height;
        region_rect_.height *= -1;
      }
      rect_done_ = true;
    }
    }
}

call it with

cv::setMouseCallback(select_cloud_area_window_name_, BallTrackingNode::mouseHandleStatic, (void*)this);

in the header:

public:
  static void mouseHandleStatic( int event, int x, int y, int flags, void* that );
  void onMouse( int event, int x, int y, int flags);

So I have a quite similar solution that worked for me:

in the main.cpp file: file:

 void BallTrackingNode::mouseHandleStatic(int event, int x, int y, int flags, void* param )
    {
   {
     BallTrackingNode* thiz = static_cast<balltrackingnode*>(param);
   static_cast<BallTrackingNode*>(param);
     thiz->onMouse(event, x, y, flags);
    }

}


void BallTrackingNode::onMouse( int event, int x, int y, int flags)
{
    if (rect_done_)
      return;
    switch (event)
    {
    case cv::EVENT_MOUSEMOVE:
    {
      region_rect_.width = x - region_rect_.x;
      region_rect_.height = y - region_rect_.y;
    }
    break;
    case cv::EVENT_LBUTTONDOWN:
    {
      region_rect_ = cv::Rect(x, y, 0, 0);
      draw_box_ = true;
    }
    break;
    case cv::EVENT_LBUTTONUP:
    {
      draw_box_ = false;
      if (region_rect_.width < 0)
      {
        region_rect_.x += region_rect_.width;
        region_rect_.width *= -1;
      }
      if (region_rect_.height < 0)
      {
        region_rect_.y += region_rect_.height;
        region_rect_.height *= -1;
      }
      rect_done_ = true;
    }
    }
}

call it with

cv::setMouseCallback(select_cloud_area_window_name_, BallTrackingNode::mouseHandleStatic, (void*)this);

in the header:

public:
  static void mouseHandleStatic( int event, int x, int y, int flags, void* that );
  void onMouse( int event, int x, int y, int flags);