ROS Resources: Documentation | Support | Discussion Forum | Index | Service Status | Q&A answers.ros.org |
![]() | 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);
![]() | 2 | No.2 Revision |
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);
![]() | 3 | No.3 Revision |
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);