NimbRo ROS Soccer Package
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Macros Groups Pages
LineSegmentTester.hpp
1 //LineSegmentTester.hpp
2 // Created on: Jun 1, 2015
3 // Author: Hafez Farazi <farazi@ais.uni-bonn.de>
4 #pragma once
5 #include <opencv2/opencv.hpp>
6 #include <vector>
7 #include <vision_module/Tools/LineSegment.hpp>
8 #include <vision_module/Tools/General.hpp>
9 
10 using namespace std;
11 using namespace cv;
12 
13 void CallBackFunc(int event, int x, int y, int flags, void* userdata);
20 {
21 public:
22  Mat Image;
23  Vector<LineSegment> Lines;
24  string name;
25  int innerIndex, totalIndex;
26  bool enable;
27  Point p1;
28  size_t Max;
29 public:
30  inline LineSegmentTester(Size box, size_t _max = 2, string _name =
31  "LineSegmentTester") :
32  name(_name), innerIndex(0), totalIndex(0), enable(false), Max(_max)
33  {
34  Image = Mat::zeros(box, CV_8UC3);
35  namedWindow(name, 1);
36  //set the callback function for any mouse event
37  setMouseCallback(name, CallBackFunc, this);
38  }
39  inline bool IsReady(size_t count)
40  {
41  return Lines.size() >= count;
42  }
43  inline bool IsReady()
44  {
45  return Lines.size() >= Max;
46  }
47  inline void Show(int wait = 1)
48  {
49  for (size_t i = 0; i < Lines.size(); i++)
50  {
51  line(Image, Lines[i].P1, Lines[i].P2, redColor(), 1);
52  }
53  if (innerIndex == 1)
54  {
55  circle(Image, p1, 2, yellowColor(), 2);
56  }
57  imshow(name, Image);
58  waitKey(wait);
59  Image = Mat::zeros(Image.size(), CV_8UC3);
60  }
61 };
62 
63 void CallBackFunc(int event, int x, int y, int flags, void* userdata)
64 {
65  LineSegmentTester* data = reinterpret_cast<LineSegmentTester*>(userdata);
66  if (event == EVENT_LBUTTONDOWN)
67  {
68  if (data->innerIndex == 1 && data->Lines.size()<data->Max)
69  {
70  data->Lines.push_back(LineSegment(data->p1, Point(x, y)));
71  }
72  data->enable = true;
73  }
74  else if (event == EVENT_RBUTTONDOWN)
75  {
76  data->innerIndex=0;
77  if (data->Lines.size() > 0)
78  {
79  data->Lines.pop_back();
80  }
81  }
82  else if (event == EVENT_MBUTTONDOWN)
83  {
84  data->Lines.clear();
85  data->innerIndex=0;
86  }
87  else if (event == EVENT_LBUTTONUP)
88  {
89  data->enable = false;
90  if (data->innerIndex == 0)
91  {
92  data->p1 = Point(x, y);
93  }
94  if (data->innerIndex == 1)
95  {
96  data->Lines[data->Lines.size() - 1].P1 = data->p1;
97  data->Lines[data->Lines.size() - 1].P2 = Point(x, y);
98  }
99  data->innerIndex++;
100  if (data->innerIndex > 1)
101  data->innerIndex = 0;
102  }
103  else if (event == EVENT_MOUSEMOVE)
104  {
105  if (data->enable)
106  {
107  if (data->innerIndex == 0)
108  {
109  data->p1 = Point(x, y);
110  }
111  if (data->innerIndex == 1)
112  {
113  data->Lines[data->Lines.size() - 1].P1 = data->p1;
114  data->Lines[data->Lines.size() - 1].P2 = Point(x, y);
115  }
116  }
117  }
118 }
A class representing line segments.
Definition: LineSegment.hpp:17
A class for visualize and test linesegments.
Definition: LineSegmentTester.hpp:19