forked from Smorodov/Multitarget-tracker
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathMouseExample.h
129 lines (105 loc) · 3.71 KB
/
MouseExample.h
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
#pragma once
#include "Ctracker.h"
#include <iostream>
#include <vector>
//------------------------------------------------------------------------
// Mouse callbacks
//------------------------------------------------------------------------
void mv_MouseCallback(int event, int x, int y, int /*flags*/, void* param)
{
if (event == cv::EVENT_MOUSEMOVE)
{
cv::Point2f* p = (cv::Point2f*)param;
if (p)
{
p->x = static_cast<float>(x);
p->y = static_cast<float>(y);
}
}
}
// ----------------------------------------------------------------------
void MouseTracking(cv::CommandLineParser parser)
{
std::string outFile = parser.get<std::string>("out");
cv::VideoWriter writer;
int k = 0;
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) };
#ifndef SILENT_WORK
cv::namedWindow("Video");
#endif
cv::Mat frame = cv::Mat(800, 800, CV_8UC3);
if (!writer.isOpened())
{
writer.open(outFile, cv::VideoWriter::fourcc('P', 'I', 'M', '1'), 20, frame.size(), true);
}
// Set mouse callback
cv::Point2f pointXY;
cv::setMouseCallback("Video", mv_MouseCallback, (void*)&pointXY);
TrackerSettings settings;
settings.SetDistance(tracking::DistCenters);
settings.m_kalmanType = tracking::KalmanLinear;
settings.m_filterGoal = tracking::FilterCenter;
settings.m_lostTrackType = tracking::TrackNone;
settings.m_matchType = tracking::MatchHungrian;
settings.m_dt = 0.2f;
settings.m_accelNoiseMag = 0.5f;
settings.m_distThres = 0.8f;
settings.m_minAreaRadiusPix = frame.rows / 20.f;
settings.m_maximumAllowedSkippedFrames = 25;
settings.m_maxTraceLength = 25;
std::unique_ptr<BaseTracker> tracker = BaseTracker::CreateTracker(settings);
track_t alpha = 0;
cv::RNG rng;
while (k != 27)
{
frame = cv::Scalar::all(0);
// Noise addition (measurements/detections simulation )
float Xmeasured = pointXY.x + static_cast<float>(rng.gaussian(2.0));
float Ymeasured = pointXY.y + static_cast<float>(rng.gaussian(2.0));
// Append circulating around mouse cv::Points (frequently intersecting)
std::vector<Point_t> pts;
pts.emplace_back(Xmeasured + 100.0f*sin(-alpha), Ymeasured + 100.0f*cos(-alpha));
pts.emplace_back(Xmeasured + 100.0f*sin(alpha), Ymeasured + 100.0f*cos(alpha));
pts.emplace_back(Xmeasured + 100.0f*sin(alpha / 2.0f), Ymeasured + 100.0f*cos(alpha / 2.0f));
pts.emplace_back(Xmeasured + 100.0f*sin(alpha / 3.0f), Ymeasured + 100.0f*cos(alpha / 1.0f));
alpha += 0.05f;
regions_t regions;
for (auto p : pts)
{
regions.push_back(CRegion(cv::Rect(cvRound(p.x), cvRound(p.y), 1, 1)));
}
for (size_t i = 0; i < pts.size(); i++)
{
#if (CV_VERSION_MAJOR >= 4)
cv::circle(frame, pts[i], 3, cv::Scalar(0, 255, 0), 1, cv::LINE_AA);
#else
cv::circle(frame, pts[i], 3, cv::Scalar(0, 255, 0), 1, CV_AA);
#endif
}
tracker->Update(regions, cv::UMat(), 100);
std::vector<TrackingObject> tracks;
tracker->GetTracks(tracks);
std::cout << tracks.size() << std::endl;
for (size_t i = 0; i < tracks.size(); i++)
{
const auto& track = tracks[i];
if (track.m_trace.size() > 1)
{
for (size_t j = 0; j < track.m_trace.size() - 1; j++)
{
#if (CV_VERSION_MAJOR >= 4)
cv::line(frame, track.m_trace[j], track.m_trace[j + 1], colors[i % colors.size()], 2, cv::LINE_AA);
#else
cv::line(frame, track.m_trace[j], track.m_trace[j + 1], colors[i % colors.size()], 2, CV_AA);
#endif
}
}
}
if (writer.isOpened())
writer << frame;
#ifndef SILENT_WORK
cv::imshow("Video", frame);
k = cv::waitKey(10);
#endif
}
}