6 #include "unordered_map"
7 #include "unordered_set"
9 static const auto lineColor = cv::Scalar(200, 0, 200);
29 std::unordered_set<featureIdType> newTrackedIDs;
30 for(
auto& currentFeature : features) {
31 auto currentID = currentFeature.id;
32 newTrackedIDs.insert(currentID);
39 path.push_back(currentFeature.position);
45 std::unordered_set<featureIdType> featuresToRemove;
47 if(!newTrackedIDs.count(oldId)) {
48 featuresToRemove.insert(oldId);
52 for(
auto&
id : featuresToRemove) {
63 std::deque<dai::Point2f>& path = featurePath.second;
65 for(j = 0; j < path.size() - 1; j++) {
66 auto src = cv::Point(path[j].x, path[j].y);
67 auto dst = cv::Point(path[j + 1].x, path[j + 1].y);
68 cv::line(img, src, dst,
lineColor, 1, cv::LINE_AA, 0);
101 xoutPassthroughFrameLeft->setStreamName(
"passthroughFrameLeft");
102 xoutTrackedFeaturesLeft->
setStreamName(
"trackedFeaturesLeft");
103 xoutPassthroughFrameRight->
setStreamName(
"passthroughFrameRight");
104 xoutTrackedFeaturesRight->
setStreamName(
"trackedFeaturesRight");
105 xinTrackedFeaturesConfig->
setStreamName(
"trackedFeaturesConfig");
109 monoLeft->setCamera(
"left");
114 monoLeft->out.link(featureTrackerLeft->inputImage);
115 featureTrackerLeft->passthroughInputImage.link(xoutPassthroughFrameLeft->input);
116 featureTrackerLeft->outputFeatures.link(xoutTrackedFeaturesLeft->
input);
117 xinTrackedFeaturesConfig->out.link(featureTrackerLeft->inputConfig);
122 xinTrackedFeaturesConfig->out.link(featureTrackerRight->
inputConfig);
127 auto numMemorySlices = 2;
128 featureTrackerLeft->setHardwareResources(numShaves, numMemorySlices);
133 printf(
"Press 's' to switch between Lucas-Kanade optical flow and hardware accelerated motion estimation! \n");
139 auto passthroughImageLeftQueue = device.
getOutputQueue(
"passthroughFrameLeft", 8,
false);
140 auto outputFeaturesLeftQueue = device.
getOutputQueue(
"trackedFeaturesLeft", 8,
false);
141 auto passthroughImageRightQueue = device.
getOutputQueue(
"passthroughFrameRight", 8,
false);
142 auto outputFeaturesRightQueue = device.
getOutputQueue(
"trackedFeaturesRight", 8,
false);
144 auto inputFeatureTrackerConfigQueue = device.
getInputQueue(
"trackedFeaturesConfig");
146 const auto leftWindowName =
"left";
147 auto leftFeatureDrawer =
FeatureTrackerDrawer(
"Feature tracking duration (frames)", leftWindowName);
149 const auto rightWindowName =
"right";
150 auto rightFeatureDrawer =
FeatureTrackerDrawer(
"Feature tracking duration (frames)", rightWindowName);
153 auto inPassthroughFrameLeft = passthroughImageLeftQueue->get<
dai::ImgFrame>();
154 cv::Mat passthroughFrameLeft = inPassthroughFrameLeft->
getFrame();
156 cv::cvtColor(passthroughFrameLeft, leftFrame, cv::COLOR_GRAY2BGR);
158 auto inPassthroughFrameRight = passthroughImageRightQueue->get<
dai::ImgFrame>();
159 cv::Mat passthroughFrameRight = inPassthroughFrameRight->
getFrame();
161 cv::cvtColor(passthroughFrameRight, rightFrame, cv::COLOR_GRAY2BGR);
163 auto trackedFeaturesLeft = outputFeaturesLeftQueue->get<
dai::TrackedFeatures>()->trackedFeatures;
164 leftFeatureDrawer.trackFeaturePath(trackedFeaturesLeft);
165 leftFeatureDrawer.drawFeatures(leftFrame);
167 auto trackedFeaturesRight = outputFeaturesRightQueue->get<
dai::TrackedFeatures>()->trackedFeatures;
168 rightFeatureDrawer.trackFeaturePath(trackedFeaturesRight);
169 rightFeatureDrawer.drawFeatures(rightFrame);
172 cv::imshow(leftWindowName, leftFrame);
173 cv::imshow(rightWindowName, rightFrame);
175 int key = cv::waitKey(1);
178 }
else if(key ==
's') {
181 printf(
"Switching to hardware accelerated motion estimation \n");
184 printf(
"Switching to Lucas-Kanade optical flow \n");
187 cfg.set(featureTrackerConfig);
188 inputFeatureTrackerConfigQueue->send(cfg);