Skip to content

Commit df01ff2

Browse files
Nuzhny007Smorodov
authored andcommitted
Added LDES tracker (Smorodov#151)
* Fixed some compiler warnings * Added LDES tracking * All VOT trackers return RotatedRect * Update README * Temporary remove unworked LDES tracking * Added option to disable all GUI output * Fixed some warnings * Added LDES tracker with result as cv::RotatedRect
1 parent 8927d62 commit df01ff2

33 files changed

Lines changed: 1854 additions & 118 deletions

CMakeLists.txt

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,11 @@ set(LIBRARY_OUTPUT_PATH ${CMAKE_BINARY_DIR})
2626

2727
FIND_PACKAGE(OpenCV REQUIRED)
2828

29+
option(SILENT_WORK "Remove all imshow and waitKey functions?" OFF)
30+
if (SILENT_WORK)
31+
add_definitions(-DSILENT_WORK)
32+
endif(SILENT_WORK)
33+
2934
option(BUILD_EXAMPLES "Should compiled examples (motion detection, pedestrians, faces, DNNs etc)?" ON)
3035
if (BUILD_EXAMPLES)
3136
add_subdirectory(example)

README.md

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,7 @@
4242

4343
4.1. No search (tracking::TrackNone)
4444

45-
4.2. built-in DAT (tracking::TrackDAT) from [foolwood](https://github.com/foolwood/DAT) or STAPLE (tracking::TrackSTAPLE) from [xuduo35](https://github.com/xuduo35/STAPLE); KCF (tracking::TrackSTAPLE), MIL (tracking::TrackSTAPLE), MedianFlow (tracking::TrackSTAPLE), GOTURN (tracking::TrackSTAPLE), MOSSE (tracking::TrackSTAPLE) or CSRT (tracking::TrackSTAPLE) from [opencv_contrib](https://github.com/opencv/opencv_contrib/tree/master/modules/tracking)
45+
4.2. Built-in DAT (tracking::TrackDAT) from [foolwood](https://github.com/foolwood/DAT), STAPLE (tracking::TrackSTAPLE) from [xuduo35](https://github.com/xuduo35/STAPLE) or LDES (tracking::TrackLDES) from [yfji](https://github.com/yfji/LDESCpp); KCF (tracking::TrackSTAPLE), MIL (tracking::TrackSTAPLE), MedianFlow (tracking::TrackSTAPLE), GOTURN (tracking::TrackSTAPLE), MOSSE (tracking::TrackSTAPLE) or CSRT (tracking::TrackSTAPLE) from [opencv_contrib](https://github.com/opencv/opencv_contrib/tree/master/modules/tracking)
4646

4747
With this option the tracking can work match slower but more accuracy.
4848

@@ -145,6 +145,7 @@ This pipeline can used with slow but accuracy DNN and track objects in intermedi
145145
* GOTURN models: https://github.com/opencv/opencv_extra/tree/c4219d5eb3105ed8e634278fad312a1a8d2c182d/testdata/tracking
146146
* DAT tracker: https://github.com/foolwood/DAT
147147
* STAPLE tracker: https://github.com/xuduo35/STAPLE
148+
* LDES tracker: https://github.com/yfji/LDESCpp
148149

149150
#### License
150151
GNU GPLv3: http://www.gnu.org/licenses/gpl-3.0.txt

async_detector/AsyncDetector.cpp

Lines changed: 12 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -43,20 +43,20 @@ AsyncDetector::~AsyncDetector()
4343
///
4444
void AsyncDetector::Process()
4545
{
46-
int k = 0;
47-
4846
double freq = cv::getTickFrequency();
4947
int64 allTime = 0;
5048

5149
bool stopFlag = false;
5250

5351
std::thread thCapture(CaptureThread, m_inFile, m_startFrame, &m_fps, &m_framesQue, &stopFlag);
5452

53+
#ifndef SILENT_WORK
5554
cv::namedWindow("Video", cv::WINDOW_NORMAL | cv::WINDOW_KEEPRATIO);
56-
57-
cv::VideoWriter writer;
58-
5955
cv::waitKey(1);
56+
int k = 0;
57+
#endif
58+
59+
cv::VideoWriter writer;
6060

6161
int framesCounter = m_startFrame + 1;
6262

@@ -84,6 +84,7 @@ void AsyncDetector::Process()
8484
writer << processedFrame->m_frame;
8585
}
8686

87+
#ifndef SILENT_WORK
8788
cv::imshow("Video", processedFrame->m_frame);
8889

8990
int waitTime = std::max<int>(1, cvRound(1000 / m_fps - currTime));
@@ -92,6 +93,9 @@ void AsyncDetector::Process()
9293
{
9394
break;
9495
}
96+
#else
97+
std::this_thread::sleep_for(std::chrono::milliseconds(1));
98+
#endif
9599

96100
++framesCounter;
97101
if (m_endFrame && framesCounter > m_endFrame)
@@ -113,7 +117,9 @@ void AsyncDetector::Process()
113117
}
114118

115119
std::cout << "work time = " << (allTime / freq) << std::endl;
116-
cv::waitKey(m_finishDelay);
120+
#ifndef SILENT_WORK
121+
cv::waitKey(m_finishDelay);
122+
#endif
117123
}
118124

119125
///
@@ -197,7 +203,6 @@ void AsyncDetector::DrawData(frame_ptr frameInfo, int framesCounter, int currTim
197203
std::cout << "tracks = " << frameInfo->m_tracks.size() << ", time = " << currTime << std::endl;
198204
}
199205

200-
201206
for (const auto& track : frameInfo->m_tracks)
202207
{
203208
if (track.m_isStatic)

async_detector/main.cpp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,9 @@ int main(int argc, char** argv)
4242
AsyncDetector slow_detector(parser);
4343
slow_detector.Process();
4444

45+
#ifndef SILENT_WORK
4546
cv::destroyAllWindows();
47+
#endif
4648

4749
std::cout << "Correct exit" << std::endl;
4850
return 0;

cars_counting/CarsCounting.cpp

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,9 @@ void CarsCounting::Process()
4646
{
4747
cv::VideoWriter writer;
4848

49+
#ifndef SILENT_WORK
4950
cv::namedWindow("Video", cv::WINDOW_NORMAL | cv::WINDOW_KEEPRATIO);
51+
#endif
5052

5153
int k = 0;
5254

@@ -123,6 +125,7 @@ void CarsCounting::Process()
123125

124126
DrawData(colorFrame, framesCounter, currTime);
125127

128+
#ifndef SILENT_WORK
126129
cv::imshow("Video", colorFrame);
127130

128131
int waitTime = manualMode ? 0 : std::max<int>(1, cvRound(1000 / m_fps - currTime));
@@ -135,6 +138,9 @@ void CarsCounting::Process()
135138
{
136139
break;
137140
}
141+
#else
142+
std::this_thread::sleep_for(std::chrono::milliseconds(1));
143+
#endif
138144

139145
if (writer.isOpened())
140146
{
@@ -150,7 +156,9 @@ void CarsCounting::Process()
150156
}
151157

152158
std::cout << "work time = " << (allTime / freq) << std::endl;
153-
cv::waitKey(m_finishDelay);
159+
#ifndef SILENT_WORK
160+
cv::waitKey(m_finishDelay);
161+
#endif
154162
}
155163

156164
///

cars_counting/main.cpp

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,9 @@ int main(int argc, char** argv)
4545

4646
cars_counting.Process();
4747

48+
#ifndef SILENT_WORK
4849
cv::destroyAllWindows();
50+
#endif
51+
4952
return 0;
5053
}

example/MouseExample.h

Lines changed: 81 additions & 75 deletions
Original file line numberDiff line numberDiff line change
@@ -24,101 +24,107 @@ void mv_MouseCallback(int event, int x, int y, int /*flags*/, void* param)
2424
// ----------------------------------------------------------------------
2525
void MouseTracking(cv::CommandLineParser parser)
2626
{
27-
std::string outFile = parser.get<std::string>("out");
27+
std::string outFile = parser.get<std::string>("out");
2828

29-
cv::VideoWriter writer;
29+
cv::VideoWriter writer;
3030

31-
int k = 0;
32-
std::vector<cv::Scalar> colors = { cv::Scalar(255, 0, 0), cv::Scalar(0, 255, 0), cv::Scalar(0, 0, 255), cv::Scalar(255, 255, 0), cv::Scalar(0, 255, 255), cv::Scalar(255, 0, 255), cv::Scalar(255, 127, 255), cv::Scalar(127, 0, 255), cv::Scalar(127, 0, 127) };
33-
cv::namedWindow("Video");
34-
cv::Mat frame = cv::Mat(800, 800, CV_8UC3);
35-
36-
if (!writer.isOpened())
37-
{
38-
writer.open(outFile, cv::VideoWriter::fourcc('P', 'I', 'M', '1'), 20, frame.size(), true);
39-
}
40-
41-
// Set mouse callback
42-
cv::Point2f pointXY;
43-
cv::setMouseCallback("Video", mv_MouseCallback, (void*)&pointXY);
44-
45-
TrackerSettings settings;
46-
settings.m_distType = tracking::DistCenters;
47-
settings.m_kalmanType = tracking::KalmanLinear;
48-
settings.m_filterGoal = tracking::FilterCenter;
49-
settings.m_lostTrackType = tracking::TrackNone;
50-
settings.m_matchType = tracking::MatchHungrian;
51-
settings.m_dt = 0.2f;
52-
settings.m_accelNoiseMag = 0.5f;
53-
settings.m_distThres = 100.0f;
54-
settings.m_maximumAllowedSkippedFrames = 25;
55-
settings.m_maxTraceLength = 25;
56-
57-
CTracker tracker(settings);
58-
59-
track_t alpha = 0;
60-
cv::RNG rng;
61-
while (k != 27)
62-
{
63-
frame = cv::Scalar::all(0);
64-
65-
// Noise addition (measurements/detections simulation )
66-
float Xmeasured = pointXY.x + static_cast<float>(rng.gaussian(2.0));
67-
float Ymeasured = pointXY.y + static_cast<float>(rng.gaussian(2.0));
68-
69-
// Append circulating around mouse cv::Points (frequently intersecting)
70-
std::vector<Point_t> pts;
71-
pts.push_back(Point_t(Xmeasured + 100.0f*sin(-alpha), Ymeasured + 100.0f*cos(-alpha)));
72-
pts.push_back(Point_t(Xmeasured + 100.0f*sin(alpha), Ymeasured + 100.0f*cos(alpha)));
73-
pts.push_back(Point_t(Xmeasured + 100.0f*sin(alpha / 2.0f), Ymeasured + 100.0f*cos(alpha / 2.0f)));
74-
pts.push_back(Point_t(Xmeasured + 100.0f*sin(alpha / 3.0f), Ymeasured + 100.0f*cos(alpha / 1.0f)));
75-
alpha += 0.05f;
76-
77-
regions_t regions;
78-
for (auto p : pts)
79-
{
80-
regions.push_back(CRegion(cv::Rect(cvRound(p.x), cvRound(p.y), 1, 1)));
81-
}
31+
int k = 0;
32+
std::vector<cv::Scalar> colors = { cv::Scalar(255, 0, 0), cv::Scalar(0, 255, 0), cv::Scalar(0, 0, 255), cv::Scalar(255, 255, 0), cv::Scalar(0, 255, 255), cv::Scalar(255, 0, 255), cv::Scalar(255, 127, 255), cv::Scalar(127, 0, 255), cv::Scalar(127, 0, 127) };
8233

34+
#ifndef SILENT_WORK
35+
cv::namedWindow("Video");
36+
#endif
8337

84-
for (size_t i = 0; i < pts.size(); i++)
85-
{
38+
cv::Mat frame = cv::Mat(800, 800, CV_8UC3);
39+
40+
if (!writer.isOpened())
41+
{
42+
writer.open(outFile, cv::VideoWriter::fourcc('P', 'I', 'M', '1'), 20, frame.size(), true);
43+
}
44+
45+
// Set mouse callback
46+
cv::Point2f pointXY;
47+
cv::setMouseCallback("Video", mv_MouseCallback, (void*)&pointXY);
48+
49+
TrackerSettings settings;
50+
settings.m_distType = tracking::DistCenters;
51+
settings.m_kalmanType = tracking::KalmanLinear;
52+
settings.m_filterGoal = tracking::FilterCenter;
53+
settings.m_lostTrackType = tracking::TrackNone;
54+
settings.m_matchType = tracking::MatchHungrian;
55+
settings.m_dt = 0.2f;
56+
settings.m_accelNoiseMag = 0.5f;
57+
settings.m_distThres = 100.0f;
58+
settings.m_maximumAllowedSkippedFrames = 25;
59+
settings.m_maxTraceLength = 25;
60+
61+
CTracker tracker(settings);
62+
63+
track_t alpha = 0;
64+
cv::RNG rng;
65+
while (k != 27)
66+
{
67+
frame = cv::Scalar::all(0);
68+
69+
// Noise addition (measurements/detections simulation )
70+
float Xmeasured = pointXY.x + static_cast<float>(rng.gaussian(2.0));
71+
float Ymeasured = pointXY.y + static_cast<float>(rng.gaussian(2.0));
72+
73+
// Append circulating around mouse cv::Points (frequently intersecting)
74+
std::vector<Point_t> pts;
75+
pts.push_back(Point_t(Xmeasured + 100.0f*sin(-alpha), Ymeasured + 100.0f*cos(-alpha)));
76+
pts.push_back(Point_t(Xmeasured + 100.0f*sin(alpha), Ymeasured + 100.0f*cos(alpha)));
77+
pts.push_back(Point_t(Xmeasured + 100.0f*sin(alpha / 2.0f), Ymeasured + 100.0f*cos(alpha / 2.0f)));
78+
pts.push_back(Point_t(Xmeasured + 100.0f*sin(alpha / 3.0f), Ymeasured + 100.0f*cos(alpha / 1.0f)));
79+
alpha += 0.05f;
80+
81+
regions_t regions;
82+
for (auto p : pts)
83+
{
84+
regions.push_back(CRegion(cv::Rect(cvRound(p.x), cvRound(p.y), 1, 1)));
85+
}
86+
87+
88+
for (size_t i = 0; i < pts.size(); i++)
89+
{
8690
#if (CV_VERSION_MAJOR >= 4)
87-
cv::circle(frame, pts[i], 3, cv::Scalar(0, 255, 0), 1, cv::LINE_AA);
91+
cv::circle(frame, pts[i], 3, cv::Scalar(0, 255, 0), 1, cv::LINE_AA);
8892
#else
8993
cv::circle(frame, pts[i], 3, cv::Scalar(0, 255, 0), 1, CV_AA);
9094
#endif
91-
}
95+
}
9296

93-
tracker.Update(regions, cv::UMat(), 100);
97+
tracker.Update(regions, cv::UMat(), 100);
9498

9599
auto tracks = tracker.GetTracks();
96-
std::cout << tracks.size() << std::endl;
100+
std::cout << tracks.size() << std::endl;
97101

98-
for (size_t i = 0; i < tracks.size(); i++)
99-
{
100-
const auto& track = tracks[i];
102+
for (size_t i = 0; i < tracks.size(); i++)
103+
{
104+
const auto& track = tracks[i];
101105

102-
if (track.m_trace.size() > 1)
103-
{
104-
for (size_t j = 0; j < track.m_trace.size() - 1; j++)
105-
{
106+
if (track.m_trace.size() > 1)
107+
{
108+
for (size_t j = 0; j < track.m_trace.size() - 1; j++)
109+
{
106110
#if (CV_VERSION_MAJOR >= 4)
107-
cv::line(frame, track.m_trace[j], track.m_trace[j + 1], colors[i % colors.size()], 2, cv::LINE_AA);
111+
cv::line(frame, track.m_trace[j], track.m_trace[j + 1], colors[i % colors.size()], 2, cv::LINE_AA);
108112
#else
109113
cv::line(frame, track.m_trace[j], track.m_trace[j + 1], colors[i % colors.size()], 2, CV_AA);
110114
#endif
111-
}
112-
}
113-
}
115+
}
116+
}
117+
}
114118

115-
cv::imshow("Video", frame);
119+
if (writer.isOpened())
120+
{
121+
writer << frame;
122+
}
116123

117-
if (writer.isOpened())
118-
{
119-
writer << frame;
120-
}
124+
#ifndef SILENT_WORK
125+
cv::imshow("Video", frame);
121126

122127
k = cv::waitKey(10);
128+
#endif
123129
}
124130
}

example/VideoExample.cpp

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -104,15 +104,17 @@ void VideoExample::Process()
104104

105105
cv::VideoWriter writer;
106106

107+
#ifndef SILENT_WORK
107108
cv::namedWindow("Video", cv::WINDOW_NORMAL | cv::WINDOW_KEEPRATIO);
109+
bool manualMode = false;
110+
#endif
108111

109112
int k = 0;
110113

111114
double freq = cv::getTickFrequency();
112115

113116
int64 allTime = 0;
114117

115-
bool manualMode = false;
116118
int framesCounter = m_startFrame + 1;
117119

118120
std::this_thread::sleep_for(std::chrono::milliseconds(1000));
@@ -155,6 +157,7 @@ void VideoExample::Process()
155157

156158
DrawData(frameInfo.m_frame, framesCounter, currTime);
157159

160+
#ifndef SILENT_WORK
158161
cv::imshow("Video", frameInfo.m_frame);
159162

160163
int waitTime = manualMode ? 0 : std::max<int>(1, cvRound(1000 / m_fps - currTime));
@@ -163,6 +166,9 @@ void VideoExample::Process()
163166
{
164167
manualMode = !manualMode;
165168
}
169+
#else
170+
std::this_thread::sleep_for(std::chrono::milliseconds(1));
171+
#endif
166172

167173
if (writer.isOpened())
168174
{
@@ -187,7 +193,9 @@ void VideoExample::Process()
187193
}
188194

189195
LOG_TIME << "work time = " << (allTime / freq) << std::endl;
196+
#ifndef SILENT_WORK
190197
cv::waitKey(m_finishDelay);
198+
#endif
191199
}
192200

193201
///

example/main.cpp

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -98,7 +98,8 @@ int main(int argc, char** argv)
9898
break;
9999
}
100100

101-
101+
#ifndef SILENT_WORK
102102
cv::destroyAllWindows();
103+
#endif
103104
return 0;
104105
}

0 commit comments

Comments
 (0)