NVIDIA DeepStream SDK API Reference

9.2 Release
sources/libs/nvmultiobjecttracker/include/modules/VisualTracker/vizOutput.hpp
Go to the documentation of this file.
1 /*
2  * SPDX-FileCopyrightText: Copyright (c) 2021-2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
3  * SPDX-License-Identifier: Apache-2.0
4  *
5  * Licensed under the Apache License, Version 2.0 (the "License");
6  * you may not use this file except in compliance with the License.
7  * You may obtain a copy of the License at
8  *
9  * http://www.apache.org/licenses/LICENSE-2.0
10  *
11  * Unless required by applicable law or agreed to in writing, software
12  * distributed under the License is distributed on an "AS IS" BASIS,
13  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14  * See the License for the specific language governing permissions and
15  * limitations under the License.
16  */
17 
18 #ifndef VISUALTRACKERLIB_VIZOUTPUT_HPP_
19 #define VISUALTRACKERLIB_VIZOUTPUT_HPP_
20 
21 #include <memory>
22 #include <deque>
23 #include <map>
24 #include <iostream>
25 #include <iomanip>
26 #include <opencv2/core/core.hpp>
27 #include <opencv2/imgproc/imgproc.hpp>
28 #include <opencv2/highgui/highgui.hpp>
29 #include <opencv2/imgcodecs/imgcodecs.hpp>
30 #include <opencv2/core/eigen.hpp>
31 #include "modules/utility/FrameOutput.hpp"
32 #include "modules/NvMultiObjectTracker/NvTrackedObject.hpp"
33 #include "modules/VisualTracker/VisualTracker.hpp"
34 #include "modules/VisualTracker/DCFTracker.hpp"
35 
37 {
40 };
41 
44 {
46  struct WriteBuffer_t
47  {
48  const cv::Mat img;
49  const uint frameNum;
50  const uint outputDirectoryKey;
51  const std::string subFolderName;
52  const std::string fileNamePrefix;
53 
62  WriteBuffer_t(
63  const cv::Mat &img_, uint frameNum_, uint outputDirectoryKey_,
64  const std::string &subFolderName_, const std::string &fileNamePrefix_
65  )
66  : img(img_), frameNum(frameNum_), outputDirectoryKey(outputDirectoryKey_),
67  subFolderName(subFolderName_), fileNamePrefix(fileNamePrefix_)
68  {
69  }
70 
74  WriteBuffer_t(const WriteBuffer_t&) = default;
75 
79  WriteBuffer_t& operator=(const WriteBuffer_t&) = default;
80 
84  WriteBuffer_t(WriteBuffer_t&&) noexcept = default;
85 
89  WriteBuffer_t& operator=(WriteBuffer_t&&) noexcept = default;
90  };
91 
92 protected:
95  const std::shared_ptr<NvTrackedObjectManager> m_targets;
96 
97  // [Configuration parameters]
98  const int m_displayWidth = 1920;
99  const int m_srcImgWH = 240;
100  const int m_featImgWH = 160;
101  std::map<uint32_t, std::deque<WriteBuffer_t>> m_writeBuffer;
102  std::map<NvMOTStreamId, uint64_t> m_lastFrameMatchedInTrajectoryArchive;
103  std::map<NvMOTStreamId, cv::Mat> m_lastFrames;
104 
105 public:
111  TrackerVizOutput(VisualTracker *visTracker, const std::shared_ptr<NvTrackedObjectManager> targets)
112  : m_visualTracker(visTracker), m_targets(targets)
113  {
114  }
115 
121  TrackerVizOutput(DCFTracker *dcfTracker, const std::shared_ptr<NvTrackedObjectManager> targets)
122  : m_dcfTracker(dcfTracker), m_targets(targets)
123  {
124  }
125 
128 
134  cv::Mat make_dist_colors(unsigned nb)
135  {
137  float step = 180.0f / nb;
138  std::vector<int> hues(nb);
140  for (size_t i = 0; i < nb; i++) {
141  hues[i] = i * step;
142  }
144  std::random_device rd;
145  std::mt19937 g(1);
146  std::shuffle(hues.begin(), hues.end(), g);
149  cv::Mat hsv(1, nb, CV_8UC3, cv::Scalar(0, 255, 255));
150  for (size_t i = 0; i < nb; i++) {
151  auto &color = hsv.at<cv::Vec3b>(0, i);
152  color[0] = hues[i];
153  }
154  cv::Mat rgb;
155  cv::cvtColor(hsv, rgb, cv::COLOR_HSV2BGR);
156  return rgb;
157  }
158 
163  void writeBirdsEyeView(const uint outputDirectoryKey = 0)
164  {
166  std::map<NvMOTStreamId, cv::Mat> framesBgr;
168  static std::map<NvMOTStreamId, cv::Rect> worldMapRegions;
170  std::map<NvMOTStreamId, cv::Point2d> worldMapsScale;
171  const float worldMapMargin = 40;
172  cv::Point frameSize;
173  if(m_visualTracker)
175  frameSize = cv::Point(
177  );
178  else
180  frameSize = cv::Point(
182  );
183 
184  const std::map<NvMOTStreamId, std::shared_ptr<NvTrackedObjectList>>& targetLists = m_targets->getTrackedObjectsInUseList();
185 
187  for(auto it = targetLists.begin(); it != targetLists.end(); ++it)
188  {
189  const NvMOTStreamId &videoStreamID = it->first;
190 
191  if(m_targets->m_objModelProjectors.find(videoStreamID) == m_targets->m_objModelProjectors.end()
192  || !m_targets->m_objModelProjectors.at(videoStreamID)->isInitialized())
193  {
194  continue;
195  }
196 
197  framesBgr[videoStreamID] = cv::Mat::zeros(frameSize,CV_8UC3);
198 
199  if(worldMapRegions.find(videoStreamID) == worldMapRegions.end())
200  {
201  worldMapRegions[videoStreamID] = cv::Rect(0,0,0,0);
202  }
203 
204  cv::Rect &worldMapRegion = worldMapRegions[videoStreamID];
205 
206  if(targetLists.find(videoStreamID) != targetLists.end())
207  {
208  const NvTrackedObjectList &targetList = *targetLists.at(videoStreamID);
209 
210  if(targetList.size() > 0)
211  {
212  for(auto targetIt = targetList.begin(); targetIt != targetList.end(); ++targetIt)
213  {
214  std::shared_ptr<NvTrackedObject> tracker = targetIt->second;
215 
216  const std::list<TargetInfo> trajectory = tracker->getTrajectoryBuffer();
217 
218  if(trajectory.size() == 0)
219  {
220  continue;
221  }
222 
224  {
225  auto pt = trajectory.rbegin();
226 
227  if(!((*pt).trackerState == TRACKER_STATE::ACTIVE
228  || ((*pt).trackerState == TRACKER_STATE::TENTATIVE && (*pt).matchedDetObjInfo != nullptr)))
229  {
230  continue;
231  }
232  }
233 
234  for(auto pt = trajectory.begin(); pt != trajectory.end(); ++pt)
235  {
236  cv::Rect2f tBbox = CV_FUNCS::convertMotRect2f2CvRect2f((*pt).tBbox);
237  cv::Point bboxCenter = (tBbox.tl()+tBbox.br())*0.5;
238  Eigen::Vector2d eigenVector = m_targets->m_objModelProjectors.at(videoStreamID)->getWorldFeetPtOnGroundFromCamWaistPt(Eigen::Vector2d(bboxCenter.x, bboxCenter.y), (*pt).classId);
239  cv::Point2d pt_world_feet(eigenVector(0), eigenVector(1));
240 
243  if(worldMapRegion.width == 0 || worldMapRegion.x > pt_world_feet.x-worldMapMargin)
244  {
245  worldMapRegion.x = pt_world_feet.x-worldMapMargin;
246  }
247  if(worldMapRegion.width == 0 || worldMapRegion.x+worldMapRegion.width < pt_world_feet.x+worldMapMargin)
248  {
249  worldMapRegion.width = pt_world_feet.x+worldMapMargin-worldMapRegion.x;
250  }
251  if(worldMapRegion.height == 0 || worldMapRegion.y > pt_world_feet.y-worldMapMargin)
252  {
253  worldMapRegion.y = pt_world_feet.y-worldMapMargin;
254  }
255  if(worldMapRegion.height == 0 || worldMapRegion.y+worldMapRegion.height < pt_world_feet.y+worldMapMargin)
256  {
257  worldMapRegion.height = pt_world_feet.y+worldMapMargin-worldMapRegion.y;
258  }
259 
260  }
261  }
262  }
263  }
264 
265  const double mapWidth = std::max(worldMapRegion.width, worldMapRegion.height);
266 
267  worldMapsScale[videoStreamID] = cv::Point2d(frameSize.x/mapWidth, frameSize.y/mapWidth);
268 
269  }
270 
272  const int radius = 3;
273 
275  for(auto it = targetLists.begin(); it != targetLists.end(); ++it)
276  {
277  const NvMOTStreamId &videoStreamID = it->first;
278 
279  if(worldMapRegions.find(videoStreamID) == worldMapRegions.end()
280  || framesBgr.find(videoStreamID) == framesBgr.end()
281  || worldMapsScale.find(videoStreamID) == worldMapsScale.end())
282  continue;
283 
284  const cv::Rect worldMapRegion = worldMapRegions.at(videoStreamID);
285  const cv::Point2d worldMapScale = worldMapsScale.at(videoStreamID);
286  const cv::Point2d mapCenter(
287  worldMapRegion.x+worldMapRegion.width/2, worldMapRegion.y+worldMapRegion.height/2
288  );
289  cv::Mat frame = framesBgr.at(videoStreamID);
290  const double mapWidth = std::max(worldMapRegion.width, worldMapRegion.height);
291 
292  if(targetLists.find(videoStreamID) != targetLists.end())
293  {
294  const NvTrackedObjectList &targetList = *targetLists.at(videoStreamID);
295 
296  if(targetList.size() > 0)
297  {
299  int frameNum = targetList.begin()->second->getTargetInfo().frameNum;
300  cv::putText(
301  frame, std::string("Frame: " + std::to_string(frameNum)),
302  cv::Point(10,30), cv::FONT_HERSHEY_SIMPLEX, 0.7, cv::Scalar(0,0,255), 2, 8
303  );
304 
305  for(auto targetIt = targetList.begin(); targetIt != targetList.end(); ++targetIt)
306  {
307  std::shared_ptr<NvTrackedObject> tracker = targetIt->second;
308 
309  const std::list<TargetInfo> trajectory_ = tracker->getTrajectoryBuffer();
310  std::list<TargetInfo> trajectory = trajectory_;
311 
312  if(trajectory.size() == 0)
313  {
314  continue;
315  }
316 
318  {
319  auto pt = trajectory.rbegin();
320 
321  if(!((*pt).trackerState == TRACKER_STATE::ACTIVE
322  || ((*pt).trackerState == TRACKER_STATE::TENTATIVE && (*pt).matchedDetObjInfo != nullptr)))
323  {
324  continue;
325  }
326  }
327 
328  uint32_t targetID = tracker->getTargetID();
329  uint32_t targetAge = tracker->getAge();
330  cv::Rect2f lastBbox = CV_FUNCS::convertMotRect2f2CvRect2f(trajectory.rbegin()->tBbox);
331  cv::Point bboxCenter_last = (lastBbox.tl()+lastBbox.br())*0.5;
332  Eigen::Vector2d eigenVector = m_targets->m_objModelProjectors.at(videoStreamID)->getWorldFeetPtOnGroundFromCamWaistPt(Eigen::Vector2d(bboxCenter_last.x, bboxCenter_last.y), tracker->getClassId());
333  cv::Point2d pt_world_feet_last(eigenVector(0), eigenVector(1));
334  cv::Point pt_map_last_(
335  (pt_world_feet_last.x-mapCenter.x+mapWidth/2)*worldMapScale.x,
336  (pt_world_feet_last.y-mapCenter.y+mapWidth/2)*worldMapScale.y
337  );
338 
341  cv::Point pt_map_last(frameSize.x - pt_map_last_.x, frameSize.y - pt_map_last_.y);
342 
343  const cv::Scalar targetColor = tracker->getColor();
344 
345  uint i=0;
346  for(auto pt = trajectory.begin(); pt != trajectory.end(); ++pt, ++i)
347  {
348  cv::Rect2f tBbox = CV_FUNCS::convertMotRect2f2CvRect2f((*pt).tBbox);
349  cv::Point bboxCenter = (tBbox.tl()+tBbox.br())*0.5;
350  Eigen::Vector2d eigenVector = m_targets->m_objModelProjectors.at(videoStreamID)->getWorldFeetPtOnGroundFromCamWaistPt(Eigen::Vector2d(bboxCenter.x, bboxCenter.y), (*pt).classId);
351  cv::Point2d pt_world_feet(eigenVector(0), eigenVector(1));
352  cv::Point pt_map_(
353  (pt_world_feet.x-mapCenter.x+mapWidth/2)*worldMapScale.x,
354  (pt_world_feet.y-mapCenter.y+mapWidth/2)*worldMapScale.y
355  );
356 
359  cv::Point pt_map(frameSize.x - pt_map_.x, frameSize.y - pt_map_.y);
360 
361  float fading = std::max((float)0, (i*1.5f)/((float)trajectory.size()-1));
362  cv::Scalar color = targetColor*fading + cv::Scalar(100,100,100)*(1.f - fading);
363 
364  if(!((*pt).trackerState == TRACKER_STATE::ACTIVE
365  || ((*pt).trackerState == TRACKER_STATE::TENTATIVE && (*pt).matchedDetObjInfo != nullptr)))
366  {
367  color = cv::Scalar(50,50,50);
368  }
369 
370  if(std::next(pt) == trajectory.end())
371  {
373  cv::circle(frame, pt_map, radius, color, -1);
374  cv::circle(frame, pt_map, radius+2, CV_RGB(255,0,0), 2);
375  }
376  else
377  {
378  cv::circle(frame, pt_map, radius, color, -1);
379  }
380 
382  std::string label = std::to_string(targetID) + "(" + std::to_string(targetAge) + ")";
383  cv::putText(
384  frame, label, pt_map_last + cv::Point(5,-5),
385  cv::FONT_HERSHEY_SIMPLEX, 0.6, targetColor, 2, 8
386  );
387  }
388  }
389 
390  std::ostringstream imgName;
391 
392  imgName << "BirdsEye_StreamID[" << std::hex << videoStreamID << "]";
393  imgName << "_Frame[" << std::dec << std::setfill('0') << std::setw(10) << frameNum << "]";
394 
395  writeImageOutput(frame, imgName.str(), outputDirectoryKey);
396  }
397  }
398  }
399  }
400 
405  void writeAllTrajectoriesOnEveryFrame(const uint outputDirectoryKey = 0)
406  {
407  bool showRecentTrajectory = true;
408  bool showCurrentDetBbox = true;
409  bool showCurrentTargetBbox = true;
410  bool showPrediction = false;
411  bool showPredictionUncertainty = false;
412 
413  bool showHumanModelCylinder = true;
414  bool showTrajectoryOnFeet = true;
415  bool showPeerTrajectory = true;
416 
419  std::map<NvMOTStreamId, cv::Mat> srcImgFramesBgr;
420 
422  if(m_visualTracker)
423  srcImgFramesBgr = m_visualTracker->getSrcImagesAtHost();
424  else
425  srcImgFramesBgr = m_dcfTracker->getSrcImagesAtHost();
426 
427  if(srcImgFramesBgr.size() == 0)
428  {
429  CLOG(std::string( "!!![WARNING] No video stream exist in srcImgFramesBgr" ).c_str());
430 
431  return;
432  }
433 
434  const std::map<NvMOTStreamId, std::shared_ptr<NvTrackedObjectList>>& targetLists = m_targets->getTrackedObjectsInUseList();
435 
437  for(auto it = srcImgFramesBgr.begin(); it != srcImgFramesBgr.end(); ++it)
438  {
439  const NvMOTStreamId &videoStreamID = it->first;
440 
441  if(targetLists.find(videoStreamID) == targetLists.end())
442  continue;
443 
444  cv::Mat frame = it->second.clone();
445 
446  const NvTrackedObjectList &targetList = *targetLists.at(videoStreamID);
447 
448  if(targetList.size() == 0)
449  continue;
450 
452  int frameNum = targetList.begin()->second->getTargetInfo().frameNum;
453  cv::putText(
454  frame, std::string("Frame: " + std::to_string(frameNum)),
455  cv::Point(10,30), cv::FONT_HERSHEY_SIMPLEX, 0.7, cv::Scalar(0,0,255), 2, 8
456  );
457 
458  std::map<TargetId, cv::Scalar> targetColorList;
459  for(auto targetIt = targetList.begin(); targetIt != targetList.end(); ++targetIt)
460  {
461  std::shared_ptr<NvTrackedObject> target = targetIt->second;
462  targetColorList[target->getTargetID()] = target->getColor();
464  if(showRecentTrajectory)
465  {
467  target, frame, showCurrentDetBbox, showCurrentTargetBbox,
468  showPrediction, showPredictionUncertainty, showTrajectoryOnFeet
469  );
470  }
471 
473  if(showHumanModelCylinder
474  && m_targets->m_objModelProjectors.find(videoStreamID) != m_targets->m_objModelProjectors.end()
475  && m_targets->m_objModelProjectors.at(videoStreamID)->isInitialized())
476  {
477  drawProjectedTargetModel(target, frame);
478  }
479  }
480 
481  if (showPeerTrajectory)
482  {
483  const PeerTargetDB peerTargetDB = m_targets->getPeerTargets(videoStreamID);
484  drawProjectedPeerTrajectory(peerTargetDB, frame, videoStreamID, frameNum, targetColorList);
485  }
486 
487  std::ostringstream imgName;
488 
489  imgName << "TrajPerFrame_StreamID[" << std::hex << videoStreamID << "]";
490  imgName << "_Frame[" << std::dec << std::setfill('0') << std::setw(10) << frameNum << "]";
491 
492  writeImageOutput(frame, imgName.str(), outputDirectoryKey);
493  }
494  }
495 
500  void writeEachCompletedTrajectory(const uint outputDirectoryKey = 0)
501  {
504  std::map<NvMOTStreamId, cv::Mat> srcImgFramesBgr;
505 
507  if(m_visualTracker)
508  srcImgFramesBgr = m_visualTracker->getSrcImagesAtHost();
509  else
510  srcImgFramesBgr = m_dcfTracker->getSrcImagesAtHost();
511 
512  if(srcImgFramesBgr.size() == 0)
513  {
514  CLOG(std::string( "!!![WARNING] No video stream exist in srcImgFramesBgr" ).c_str());
515 
516  return;
517  }
518 
520  for(auto it = srcImgFramesBgr.begin(); it != srcImgFramesBgr.end(); ++it)
521  {
522  const NvMOTStreamId &videoStreamID = it->first;
523 
524  m_lastFrames[videoStreamID] = it->second.clone();
525  }
526 
528  for(auto it = m_lastFrames.begin(); it != m_lastFrames.end(); ++it)
529  {
530  const NvMOTStreamId &videoStreamID = it->first;
531 
532  if(m_targets->m_trajectoryManager->m_trajectoryArchive.find(videoStreamID) == m_targets->m_trajectoryManager->m_trajectoryArchive.end())
533  continue;
534 
536  for(auto trajIt = m_targets->m_trajectoryManager->m_trajectoryArchive.at(videoStreamID)->begin(); trajIt != m_targets->m_trajectoryManager->m_trajectoryArchive.at(videoStreamID)->end(); ++trajIt)
537  {
538  const uint64_t targetId = trajIt->first & 0x0000ffff;
539  const std::list<TargetInfo> &tracklet = trajIt->second.tracklet;
540  bool &isVisualized = trajIt->second.isVisualized;
541 
542  if(!isVisualized)
543  {
544  cv::Mat frame = it->second.clone();
545 
547  drawFullTrajectory(targetId, tracklet, frame);
548 
549  std::ostringstream imgName;
550 
551  imgName << "CompletedTraj_StreamID[" << std::hex << videoStreamID << "]";
552  imgName << "_TargetID[" << std::dec << targetId << "]_Frame[" << tracklet.begin()->frameNum
553  << "->"<< tracklet.rbegin()->frameNum << "]";
554 
555  writeImageOutput(frame, imgName.str(), outputDirectoryKey);
556 
557  std::cout << "[VizOutput] Wrote archived tracklet of TargetID[" << targetId << "]" << std::endl;
558 
559  isVisualized = true;
560  }
561  }
562  }
563  }
564 
569  void writeSrcImagePatchesWithCorrResp(const uint outputDirectoryKey = 0)
570  {
572  std::map<NvMOTStreamId, std::map<uint, cv::Mat > > srcImgPatches;
573  std::vector<cv::Mat> corrRespMats;
574  int m_vizDebugStreamId;
575  if(m_visualTracker)
576  {
577  srcImgPatches = m_visualTracker->m_featureExtractor.getSrcImgPatches();
578  corrRespMats = m_visualTracker->fetchBatchDataToHost_perObj(m_visualTracker->m_corrResponses_d);
579  m_vizDebugStreamId = m_visualTracker->m_params.m_vizDebugStreamId;
580  }
581  else
582  {
583  srcImgPatches = m_dcfTracker->getImagePatches2Host_OCV_batch();
584  corrRespMats = m_dcfTracker->fetchBatchDataToHost_perObj(m_dcfTracker->m_corrResponses_d);
585  m_vizDebugStreamId = m_dcfTracker->m_params.m_vizDebugStreamId;
586  }
587 
588  for(auto it = m_targets->getTrackedObjectsInUseList().begin(); it != m_targets->getTrackedObjectsInUseList().end(); ++it)
589  {
590  NvMOTStreamId streamId = it->first;
591 
592  if(m_vizDebugStreamId < 0 || m_vizDebugStreamId == (int)(streamId>>32))
593  {
594  for(auto jt = it->second->begin(); jt != it->second->end(); ++jt)
595  {
596  uint trackerInd = jt->first;
597 
599  streamId, trackerInd, outputDirectoryKey, srcImgPatches[streamId][trackerInd].clone(),
600  prepareCorrelationResponseImg(streamId, trackerInd, corrRespMats, cv::Size(m_srcImgWH,m_srcImgWH))
601  );
602  }
603  }
604  }
605  }
606 
611  void writeSrcImagePatchesWithMaskFilter(const uint outputDirectoryKey = 0)
612  {
614  std::map<NvMOTStreamId, std::map<uint, cv::Mat > > srcImgPatches;
615  std::vector<cv::Mat> maskMats;
616  int m_vizDebugStreamId;
617  if(m_visualTracker)
618  {
619  srcImgPatches = m_visualTracker->m_featureExtractor.getSrcImgPatches();
620  maskMats = m_visualTracker->fetchBatchDataToHost_perObj(m_visualTracker->m_maskingSegWindow4Model, true);
621  m_vizDebugStreamId = m_visualTracker->m_params.m_vizDebugStreamId;
622  }
623  else
624  {
625  std::cout << "Mask visualization is not supported for VPI NvDCF yet" << std::endl;
626  return;
627  }
628 
629  for(auto it = m_targets->getTrackedObjectsInUseList().begin(); it != m_targets->getTrackedObjectsInUseList().end(); ++it)
630  {
631  NvMOTStreamId streamId = it->first;
632 
633  if(m_vizDebugStreamId < 0 || m_vizDebugStreamId == (int)(streamId>>32))
634  {
635  for(auto jt = it->second->begin(); jt != it->second->end(); ++jt)
636  {
637  uint trackerInd = jt->first;
638 
640  streamId, trackerInd, outputDirectoryKey, srcImgPatches[streamId][trackerInd].clone(),
641  prepareMaskFilterImg(streamId, trackerInd, maskMats, cv::Size(m_srcImgWH,m_srcImgWH))
642  );
643  }
644  }
645  }
646  }
647 
648 protected:
649 
659  const NvMOTStreamId streamId_, const int trackerInd,
660  const uint outputDirectoryKey, cv::Mat srcImgPatch, cv::Mat corrRespMat
661  )
662  {
663  const std::shared_ptr<NvTrackedObject> target = m_targets->getTrackedObjectsInUseList(streamId_).at(trackerInd);
664 
665  if( target->getTrackerState() == TRACKER_STATE::EMPTY)
666  return;
667 
668  int frameNum = target->getTargetInfo().frameNum;
669  int streamId = streamId_ >> 32;
670 
671  assert(srcImgPatch.size().width > 0 && srcImgPatch.size().height > 0);
672 
674  {
675  cvtColor(srcImgPatch, srcImgPatch, cv::COLOR_RGBA2BGR);
676  }
677  cv::resize(srcImgPatch, srcImgPatch, cv::Size(m_srcImgWH,m_srcImgWH));
678 
679  assert(srcImgPatch.type() == corrRespMat.type());
680 
682  cv::Mat fusedImg(cv::Size(m_srcImgWH*2,m_srcImgWH), srcImgPatch.type());
683  srcImgPatch.copyTo(fusedImg(cv::Rect(0,0,m_srcImgWH,m_srcImgWH)));
684  corrRespMat.copyTo(fusedImg(cv::Rect(m_srcImgWH,0,m_srcImgWH,m_srcImgWH)));
685 
688  target, fusedImg, frameNum, outputDirectoryKey,
689  std::string("Stream_" + std::to_string((int)streamId)), "CorrResp_"
690  );
691 
693  writeFromWriteBuffer(target);
694  }
695 
705  const NvMOTStreamId streamId_, const int trackerInd,
706  const uint outputDirectoryKey, cv::Mat srcImgPatch, cv::Mat maskMat
707  )
708  {
709  const std::shared_ptr<NvTrackedObject> target = m_targets->getTrackedObjectsInUseList(streamId_).at(trackerInd);
710 
711  if( target->getTrackerState() == TRACKER_STATE::EMPTY)
712  return;
713 
714  int frameNum = target->getTargetInfo().frameNum;
715  int streamId = streamId_ >> 32;
716 
717  assert(srcImgPatch.size().width > 0 && srcImgPatch.size().height > 0);
718 
720  {
721  cvtColor(srcImgPatch, srcImgPatch, cv::COLOR_RGBA2BGR);
722  }
723  cv::resize(srcImgPatch, srcImgPatch, cv::Size(m_srcImgWH,m_srcImgWH));
724 
725  assert(srcImgPatch.type() == maskMat.type());
726 
728  cv::Mat fusedImg(cv::Size(m_srcImgWH*2,m_srcImgWH), srcImgPatch.type());
729  srcImgPatch.copyTo(fusedImg(cv::Rect(0,0,m_srcImgWH,m_srcImgWH)));
730  maskMat.copyTo(fusedImg(cv::Rect(m_srcImgWH,0,m_srcImgWH,m_srcImgWH)));
731 
734  target, fusedImg, frameNum, outputDirectoryKey,
735  std::string("Stream_" + std::to_string((int)streamId)), "mask_"
736  );
737 
739  writeFromWriteBuffer(target);
740  }
741 
752  const std::shared_ptr<NvTrackedObject> target, const cv::Mat &img, const uint frameNum,
753  const uint outputDirectoryKey, const std::string subFolderName, const std::string fileNamePrefix = ""
754  )
755  {
756  const uint targetInd = target->getTargetInd();
757  const uint32_t targetAge = target->getAge();
758 
760  if(targetAge == 1)
761  m_writeBuffer[targetInd].clear();
762 
763  WriteBuffer_t buf(img, frameNum, outputDirectoryKey, subFolderName, fileNamePrefix);
764 
765  m_writeBuffer[targetInd].push_back(std::move(buf));
766  }
767 
772  void writeFromWriteBuffer(const std::shared_ptr<NvTrackedObject> target)
773  {
774  if(target->getTrackerState() == TRACKER_STATE::ACTIVE
775  || target->getTrackerState() == TRACKER_STATE::INACTIVE
776  )
777  {
778  const uint targetInd = target->getTargetInd();
779  uint64_t targetID = target->getTargetID();
780 
781  if(m_writeBuffer[targetInd].size() > 0)
782  {
783  for(auto it = m_writeBuffer[targetInd].begin(); it != m_writeBuffer[targetInd].end(); ++it)
784  {
785  const WriteBuffer_t &buf = *it;
786 
788  std::string outFileName = buf.fileNamePrefix + "Target_" + std::to_string((int)targetID) + "_Frame_" + std::to_string(buf.frameNum);
789 
791  writeImageOutput(buf.img, outFileName, buf.outputDirectoryKey, buf.subFolderName);
792  }
793 
794  m_writeBuffer[targetInd].clear();
795  }
796  }
797  }
798 
810  const NvMOTStreamId streamId_, const uint trackerInd, std::vector<cv::Mat> &corrRespMats,
811  const cv::Size dstSize, const bool showPeakPoint = true, const bool showDetBboxes = true
812  )
813  {
814  const NvTrackedObjectList &targetList = m_targets->getTrackedObjectsInUseList(streamId_);
815 
816  if(targetList.size() == 0)
817  {
818  return cv::Mat::zeros(corrRespMats[trackerInd].size(), corrRespMats[trackerInd].type());
819  }
820 
821  const std::shared_ptr<NvTrackedObject> target = targetList.at(trackerInd);
822 
823  if(target->getTrackerState() == TRACKER_STATE::EMPTY)
824  {
825  return cv::Mat::zeros(corrRespMats[trackerInd].size(), corrRespMats[trackerInd].type());
826  }
827 
828  assert(corrRespMats[trackerInd].size().width > 0 && corrRespMats[trackerInd].size().height > 0);
829 
830  cv::Mat response_viz_gray, response_viz_rgb;
831 
834  corrRespMats[trackerInd], response_viz_gray,
835  corrRespMats[trackerInd].cols*corrRespMats[trackerInd].rows, 0, cv::NORM_L2
836  );
837 
839  response_viz_gray = CV_FUNCS::circshift(
840  response_viz_gray, cvFloor(response_viz_gray.cols/2), cvFloor(response_viz_gray.rows/2)
841  );
842  response_viz_gray.convertTo(response_viz_gray, CV_8UC1);
843 
844  cv::resize(response_viz_gray, response_viz_gray, dstSize);
845 
846  float wScale = dstSize.width / (float)corrRespMats[trackerInd].size().width;
847  float hScale = dstSize.height / (float)corrRespMats[trackerInd].size().height;
848 
849  cv::applyColorMap(response_viz_gray, response_viz_rgb, cv::COLORMAP_JET);
850 
851  double maxVal;
852  cv::Point maxLoc;
853  cv::minMaxLoc(response_viz_gray, NULL, &maxVal, NULL, &maxLoc);
854 
856  if(showPeakPoint)
857  {
858  cv::Point2f loc;
859  if(m_visualTracker)
860  loc = cv::Point2f(m_visualTracker->m_targetDisplacement2D_h[trackerInd].x, m_visualTracker->m_targetDisplacement2D_h[trackerInd].y)
861  + cv::Point2f(corrRespMats[trackerInd].size().width, corrRespMats[trackerInd].size().height)*0.5f;
862  else
863  loc = cv::Point2f(m_dcfTracker->m_targetDisplacement2D_h[trackerInd].x, m_dcfTracker->m_targetDisplacement2D_h[trackerInd].y)
864  + cv::Point2f(corrRespMats[trackerInd].size().width, corrRespMats[trackerInd].size().height)*0.5f;
865 
866  loc.x *= wScale;
867  loc.y *= hScale;
868 
869  cv::drawMarker(
870  response_viz_rgb, loc+cv::Point2f(0.5f,0.5f), CV_RGB(255,255,0), cv::MARKER_CROSS, 1.5*wScale, 2
871  );
872  }
873 
875  if(showDetBboxes)
876  {
877  if(m_visualTracker)
878  {
879  for(uint i=0; i<m_visualTracker->m_detectorBboxes_size_h[trackerInd]; i++)
880  {
881  cv::Point2f dBboxCenterPtInCorrResp = cv::Point2f(
882  m_visualTracker->m_detectorBboxes_h[trackerInd*m_targets->getMaxTargetsPerStream() + i].x*wScale,
883  m_visualTracker->m_detectorBboxes_h[trackerInd*m_targets->getMaxTargetsPerStream() + i].y*hScale
884  );
885 
887  cv::Point ptInCorrResp_shifted(
888  int(response_viz_gray.cols/2 + dBboxCenterPtInCorrResp.x +0.5f)%(response_viz_gray.cols),
889  int(response_viz_gray.rows/2 + dBboxCenterPtInCorrResp.y +0.5f)%(response_viz_gray.rows)
890  );
891  cv::drawMarker(
892  response_viz_rgb, ptInCorrResp_shifted,
893  CV_RGB(255,0,255), cv::MARKER_TILTED_CROSS, 1.5*wScale, 3
894  );
895  }
896  }
897  else
898  {
899  for(uint i=0; i<m_dcfTracker->m_detectorBboxes_size_h[trackerInd]; i++)
900  {
901  cv::Point2f dBboxCenterPtInCorrResp = cv::Point2f(
902  m_dcfTracker->m_detectorBboxes_h[trackerInd*m_targets->getMaxTargetsPerStream() + i].x*wScale,
903  m_dcfTracker->m_detectorBboxes_h[trackerInd*m_targets->getMaxTargetsPerStream() + i].y*hScale
904  );
905 
907  cv::Point ptInCorrResp_shifted(
908  int(response_viz_gray.cols/2 + dBboxCenterPtInCorrResp.x +0.5f)%(response_viz_gray.cols),
909  int(response_viz_gray.rows/2 + dBboxCenterPtInCorrResp.y +0.5f)%(response_viz_gray.rows)
910  );
911  cv::drawMarker(
912  response_viz_rgb, ptInCorrResp_shifted,
913  CV_RGB(255,0,255), cv::MARKER_TILTED_CROSS, 1.5*wScale, 3
914  );
915  }
916 
917  }
918  }
919 
920  return response_viz_rgb;
921  }
922 
932  const NvMOTStreamId streamId_, const uint trackerInd, std::vector<cv::Mat> &maskMats, const cv::Size dstSize
933  )
934  {
935  const std::map<uint32_t, std::shared_ptr<NvTrackedObject>> &targetList = m_targets->getTrackedObjectsInUseList(
936  streamId_
937  );
938 
939  if(targetList.size() == 0)
940  {
941  return cv::Mat::zeros(maskMats[trackerInd].size(), CV_8UC3);
942  }
943 
944  const std::shared_ptr<NvTrackedObject> target = targetList.at(trackerInd);
945 
946  if(target->getTrackerState() == TRACKER_STATE::EMPTY)
947  {
948  return cv::Mat::zeros(maskMats[trackerInd].size(), CV_8UC3);
949  }
950 
951  assert(maskMats[trackerInd].size().width > 0 && maskMats[trackerInd].size().height > 0);
952 
954  cv::Mat mask_viz_gray = maskMats[trackerInd] * 255;
955  cv::Mat mask_viz_rgb;
956 
957  mask_viz_gray.convertTo(mask_viz_gray, CV_8UC1);
958  cvtColor(mask_viz_gray, mask_viz_rgb, cv::COLOR_GRAY2BGR);
959 
960  cv::resize(mask_viz_rgb, mask_viz_rgb, dstSize);
961  return mask_viz_rgb;
962 
963  }
964 
971  void drawFullTrajectory(const uint64_t targetID, const std::list<TargetInfo> &trajectory, cv::Mat &frame)
972  {
974  const int radius = 5;
975 
976  if(trajectory.size() == 0)
977  {
978  return;
979  }
980 
981  cv::Point objLoc_curr, objLoc_prev;
982  uint i=0;
983 
984  cv::Rect2f lastBbox = CV_FUNCS::convertMotRect2f2CvRect2f(trajectory.rbegin()->tBbox);
985 
987  cv::putText(
988  frame, std::to_string(targetID), cv::Point(lastBbox.tl()) + cv::Point(lastBbox.width*0.5),
989  cv::FONT_HERSHEY_SIMPLEX, 0.6, CV_RGB(155,255,55), 2, 8
990  );
991 
992  for(auto pt=trajectory.begin(); pt != trajectory.end(); ++pt, ++i)
993  {
994  cv::Rect2f bbox = CV_FUNCS::convertMotRect2f2CvRect2f((*pt).tBbox);
995  objLoc_curr = (bbox.tl()+bbox.br())*0.5;
996 
997  float fading = std::max((float)0, (i*1.5f)/((float)trajectory.size()-1));
998  cv::Scalar color = cv::Scalar(0,255,255)*fading + cv::Scalar(255,255,0)*(1.f - fading);
999 
1000  if((*pt).trackerState == TRACKER_STATE::PROJECTED)
1001  {
1002  color = cv::Scalar(0,0,255);
1003  }
1004  else if((*pt).trackerState != TRACKER_STATE::ACTIVE)
1005  {
1006  color = cv::Scalar(0,0,0);
1007  }
1008 
1009  if(i == trajectory.size()-1)
1010  {
1011  cv::circle(frame, objLoc_curr, radius, color, -1);
1012  cv::circle(frame, objLoc_curr, radius+2, CV_RGB(255,0,0), 2);
1013 
1014  cv::rectangle(frame, bbox, color, 1, 1);
1015  }
1016  else
1017  {
1018  cv::circle(frame, objLoc_curr, radius, color, 1);
1019  }
1020 
1021  if(i>0)
1022  cv::line(frame, objLoc_prev, objLoc_curr, color, 1);
1023 
1024  objLoc_prev = objLoc_curr;
1025  }
1026  }
1027 
1039  const std::shared_ptr<NvTrackedObject> tracker, cv::Mat &frame, const bool showCurrentDetBbox = true,
1040  const bool showCurrentTargetBbox = true, const bool showPrediction = false,
1041  const bool showPredictionUncertainty = false, const bool showTrajectoryOnFeet = false
1042  )
1043  {
1045  const int radius = 3;
1046  const int tailLength = 300;
1047 
1048  cv::Point objLoc_curr, objLoc_prev;
1049 
1050  const std::list<TargetInfo> trajectory = tracker->getTrajectoryBuffer();
1051 
1052  if(trajectory.size() == 0)
1053  {
1054  return;
1055  }
1056 
1058  {
1059  auto pt = trajectory.rbegin();
1060 
1061  if(!((*pt).trackerState == TRACKER_STATE::ACTIVE
1062  || ((*pt).trackerState == TRACKER_STATE::TENTATIVE && (*pt).matchedDetObjInfo != nullptr)))
1063  {
1064  return;
1065  }
1066  }
1067 
1068  uint32_t targetID = tracker->getTargetID();
1069  cv::Rect2f lastBbox = CV_FUNCS::convertMotRect2f2CvRect2f(trajectory.rbegin()->tBbox);
1070  const cv::Scalar targetColor = tracker->getColor();
1071 
1073  cv::putText(
1074  frame, std::to_string(targetID), cv::Point(lastBbox.tl()) + cv::Point(lastBbox.width*0.5),
1075  cv::FONT_HERSHEY_SIMPLEX, 0.6, targetColor, 2, 8
1076  );
1077 
1078  auto pt = trajectory.begin();
1079  uint totalPts = trajectory.size();
1080 
1082  if(trajectory.size() > tailLength)
1083  {
1084  std::advance(pt, trajectory.size() - tailLength);
1085  totalPts = tailLength;
1086  }
1087 
1088  uint i=0;
1089  for(; pt != trajectory.end(); ++pt, ++i)
1090  {
1091  cv::Rect2f tBbox = CV_FUNCS::convertMotRect2f2CvRect2f((*pt).tBbox);
1092 
1093  if(showTrajectoryOnFeet)
1094  {
1095  if(tracker->m_objModelProjector != nullptr && tracker->m_objModelProjector->isInitialized())
1096  {
1098  objLoc_curr = cv::Point((*pt).pt_img_feet(0), (*pt).pt_img_feet(1));
1099  }
1100  else
1101  {
1103  objLoc_curr = tBbox.br() - cv::Point2f(tBbox.width/2, 0);
1104  }
1105  }
1106  else
1107  {
1109  objLoc_curr = (tBbox.tl()+tBbox.br())*0.5;
1110  }
1111 
1112  float fading = std::max((float)0, (i*1.5f)/((float)totalPts-1));
1113  cv::Scalar color = targetColor*fading + cv::Scalar(100,100,100)*(1.f - fading);
1114 
1115  if(!((*pt).trackerState == TRACKER_STATE::ACTIVE
1116  || ((*pt).trackerState == TRACKER_STATE::TENTATIVE && (*pt).matchedDetObjInfo != nullptr)))
1117  {
1118  color = cv::Scalar(0,0,0);
1119  }
1120 
1121  if(std::next(pt) == trajectory.end())
1122  {
1123  if(showCurrentDetBbox)
1124  {
1126  if(pt->matchedDetObjInfo != nullptr && pt->matchedDetObjInfo->objIn != nullptr)
1127  {
1128  const NvMOTObjToTrack *objIn = pt->matchedDetObjInfo->objIn;
1130  objIn->bbox.x, objIn->bbox.y, objIn->bbox.width, objIn->bbox.height
1131  );
1132  cv::Rect2f originalDetBbox = CV_FUNCS::convertMotRect2f2CvRect2f(detBbox);
1133 
1134  cv::rectangle(frame, originalDetBbox, cv::Scalar(100,100,100), 1, 1);
1135  }
1136  }
1137 
1138  if(showCurrentTargetBbox && (*pt).convexHull.size() == 0)
1139  {
1141  cv::rectangle(frame, tBbox, color, 1, 1);
1142  }
1143 
1145  cv::circle(frame, objLoc_curr, radius, color, -1);
1146  cv::circle(frame, objLoc_curr, radius+2, CV_RGB(255,0,0), 2);
1147 
1148  if(showPrediction)
1149  {
1150 
1151  if(tracker->m_objModelProjector != nullptr && tracker->m_objModelProjector->isInitialized())
1152  {
1154  const std::deque<float> dT = {10.f, 20.f};
1156  const std::deque<float> radius = {20.f, 40.f};
1157 
1159  for(uint i=0; i<dT.size(); i++)
1160  {
1161  const Eigen::VectorXd pt_world_pred_states = tracker->m_stateEstimator->getPredictedStates(
1162  dT[i]
1163  );
1164  Eigen::Vector3d pt_world_feet_pred; pt_world_feet_pred << pt_world_pred_states(0), pt_world_pred_states(1), 0;
1165  Eigen::Vector2d eigenVector = tracker->m_objModelProjector->projectWorldPt2ImgPt(
1166  pt_world_feet_pred
1167  );
1168  cv::Point2d pt_img_feet_pred(eigenVector(0), eigenVector(1));
1169 
1170  cv::Point predLoc(int(pt_img_feet_pred.x+0.5f), int(pt_img_feet_pred.y+0.5f));
1171 
1173  {
1174  std::vector<Eigen::Vector2d> projCircle = tracker->m_objModelProjector->calculateProjectedCircleFromWorldFeet(Eigen::Vector2d(pt_world_feet_pred(0), pt_world_feet_pred(1)), radius[i]);
1175 
1176  for(uint i=1; i<projCircle.size(); i++)
1177  {
1178  cv::line(
1179  frame, cv::Point(projCircle[i-1](0), projCircle[i-1](1)),
1180  cv::Point(projCircle[i](0), projCircle[i](1)), targetColor, 2, cv::LINE_AA
1181  );
1182  }
1183  cv::line(
1184  frame, cv::Point(projCircle[0](0),projCircle[0](1)),
1185  cv::Point(projCircle[projCircle.size()-1](0),projCircle[projCircle.size()-1](1)),
1186  targetColor, 2, cv::LINE_AA
1187  );
1188  }
1189  }
1190 
1191  }
1192  else
1193  {
1195  const std::deque<float> dT = {10.f, 20.f};
1196 
1197  Eigen::VectorXd P;
1198  Eigen::MatrixXd Pcov;
1199  P = tracker->m_stateEstimator->getPredictedStates(*(dT.rbegin()));
1200  cv::Point predLoc(int(P(0)+0.5f), int(P(1)+0.5f));
1201 
1202  cv::line(frame, objLoc_curr, predLoc, CV_RGB(255,0,0), 2);
1203 
1204  if(showPredictionUncertainty)
1205  {
1207  for(uint i=0; i<dT.size(); i++)
1208  {
1209  std::tie(P, Pcov) = tracker->m_stateEstimator->getPredictedStatesWithCov(dT[i]);
1210 
1211  {
1212  cv::Mat P_ocv(P.rows(), P.cols(), CV_64F);
1213  cv::Mat Pcov_ocv(Pcov.rows(), Pcov.cols(), CV_64F);
1214 
1215  cv::eigen2cv(P, P_ocv);
1216  cv::eigen2cv(Pcov, Pcov_ocv);
1217 
1218  drawUncertaintyEllipse(frame, P_ocv, Pcov_ocv, color, 0.5);
1219  }
1220  }
1221  }
1222  }
1223  }
1224  }
1225  else
1226  {
1227  cv::circle(frame, objLoc_curr, radius, color, -1);
1228  }
1229 
1230  if(i>0)
1231  {
1232  cv::line(frame, objLoc_prev, objLoc_curr, color, 1);
1233  }
1234 
1235  objLoc_prev = objLoc_curr;
1236  }
1237  }
1238 
1248  cv::Mat &frame, const cv::Mat P, const cv::Mat Pcov, cv::Scalar color, float scale = 1.f
1249  )
1250  {
1252  double rho;
1253  double sigma[2];
1254 
1255  sigma[0] = (double)std::sqrt(Pcov.at<double>(0,0));
1256  sigma[1] = (double)std::sqrt(Pcov.at<double>(1,1));
1257  rho = (double)(Pcov.at<double>(0,1)/(sigma[0]*sigma[1]));
1258 
1260  double width, height;
1262  double a;
1263 
1264  if(sigma[0] != sigma[1])
1265  a = atan((double)(2.*rho*sigma[0]*sigma[1] / (std::pow(sigma[0],2)-std::pow(sigma[1],2))))/2.0;
1266  else
1267  a = 0;
1268 
1270  a *= 180/M_PI;
1271 
1272  width = std::pow(sigma[0]*sigma[1],2) * (1.-std::pow(rho,2)) / (std::pow(sigma[1]*cos(a),2) - 2.0*rho*sigma[0]*sigma[1]*sin(a)*cos(a) + std::pow(sigma[0]*sin(a),2));
1273  height = std::pow(sigma[0]*sigma[1],2) * (1.-std::pow(rho,2)) / (std::pow(sigma[1]*sin(a),2) + 2.0*rho*sigma[0]*sigma[1]*sin(a)*cos(a) + std::pow(sigma[0]*cos(a),2));
1274 
1275  width = std::pow(width, 0.7);
1276  height = std::pow(height, 0.7);
1277 
1278  width *= scale;
1279  height *= scale;
1280 
1281  cv::Point2i loc(P.at<double>(0), P.at<double>(1));
1282 
1284  cv::ellipse(frame, loc, cv::Size(width, height), a, 0, 360, color, 1, cv::LINE_AA);
1285  }
1286 
1292  void drawProjectedTargetModel(const std::shared_ptr<NvTrackedObject> target, cv::Mat &frame)
1293  {
1294  const std::list<TargetInfo> trajectory = target->getTrajectoryBuffer();
1295 
1296  if(trajectory.size() == 0)
1297  {
1298  return;
1299  }
1300 
1302  {
1303  auto pt = trajectory.rbegin();
1304 
1305  if(!((*pt).trackerState == TRACKER_STATE::ACTIVE
1306  || ((*pt).trackerState == TRACKER_STATE::TENTATIVE && (*pt).matchedDetObjInfo != nullptr)))
1307  {
1308  return;
1309  }
1310  }
1311 
1312  const cv::Scalar targetColor = target->getColor();
1313  const NvMOTStreamId streamId = target->getVideoStreamId();
1314  const TargetInfo &lastTargetInfo = *trajectory.rbegin();
1315 
1317  {
1318  const std::vector<Eigen::Vector2f> &convexHull = lastTargetInfo.convexHull;
1319  const Eigen::Vector2f &tLoc = lastTargetInfo.loc;
1320  const Eigen::Vector2f &pt_img_feet = lastTargetInfo.pt_img_feet;
1321 
1322  if(convexHull.size() == 0)
1323  return;
1324 
1325  std::vector<cv::Point> projected_cylinder;
1326  for(auto &pt : convexHull)
1327  {
1328  projected_cylinder.push_back(cv::Point(pt(0), pt(1)));
1329  }
1330 
1331  for(uint i=1; i<projected_cylinder.size(); i++)
1332  {
1333  cv::line(frame, projected_cylinder[i-1], projected_cylinder[i], targetColor, 2, cv::LINE_AA);
1334  }
1335  cv::line(
1336  frame, projected_cylinder[0],
1337  projected_cylinder[projected_cylinder.size()-1], targetColor, 2, cv::LINE_AA
1338  );
1339 
1341  const uint humanFeetRadius = 3;
1342  cv::circle(frame, cv::Point2d(pt_img_feet(0), pt_img_feet(1)) , humanFeetRadius, targetColor, -1);
1343  }
1344  }
1345 
1355  const PeerTargetDB& peerTargetDB, cv::Mat &frame, const NvMOTStreamId &videoStreamID,
1356  const int& frameNum, const std::map<TargetId, cv::Scalar>& targetColorList
1357  )
1358  {
1359  for (auto &peerTargets : peerTargetDB) {
1360  CamId camId = peerTargets.first;
1361  for (auto &peerTargetIt : peerTargets.second) {
1362  TargetId targetID = peerTargetIt.first;
1363 
1364  const PeerTarget& peerTarget = peerTargetIt.second;
1366  if (peerTarget.frameNum + 2 < frameNum)
1367  continue;
1368 
1369  Eigen::Vector2d peer_world_feet(peerTarget.nextState(0), peerTarget.nextState(1));
1370 
1371  Eigen::Vector2d pt_img_feet = m_targets->m_objModelProjectors.at(videoStreamID)->getProjectedWorldGroundPts({peer_world_feet}).front();
1372 
1374  unsigned camNum = 100;
1375  cv::Scalar color = make_dist_colors(camNum).at<cv::Vec3b>(0, camId);
1376  if (targetColorList.find(targetID) != targetColorList.end())
1377  {
1378  color = targetColorList.at(targetID);
1379  }
1380 
1381  NvMotDataTypes::Rect2f peerMotBbox = m_targets->m_objModelProjectors.at(videoStreamID)->getBboxOfProjectedCylinderFromWorldFeet(Eigen::Vector2d(peer_world_feet(0), peer_world_feet(1)), -1);
1382  cv::Rect2f bbox = CV_FUNCS::convertMotRect2f2CvRect2f(peerMotBbox);
1383 
1384  cv::rectangle(frame, bbox, color, 2, 1);
1385  cv::putText(
1386  frame, std::string("ID " + std::to_string(int(targetID)) + " / Cam " + std::to_string(camId)),
1387  cv::Point(int(bbox.x), int(bbox.y-10)), cv::FONT_HERSHEY_SIMPLEX, 1.2, color, 2, 8
1388  );
1389 
1390  const Tracklet& tracklet = peerTarget.tracklet;
1391  if (tracklet.empty())
1392  continue;
1393 
1394  cv::Point objLoc_curr, objLoc_prev;
1395  for (auto it = tracklet.rbegin(); it!= tracklet.rend(); ++it)
1396  {
1397  Eigen::Vector2d pt_world((*it).second(0), (*it).second(1));
1398  Eigen::Vector2d pt_img = m_targets->m_objModelProjectors.at(videoStreamID)->getProjectedWorldGroundPts({pt_world}).front();
1399 
1400  objLoc_curr = cv::Point(int(pt_img(0)), int(pt_img(1)));
1401  if (it != tracklet.rbegin())
1402  {
1404  cv::line(frame, objLoc_curr, objLoc_prev, color, 2, cv::LINE_AA);
1405  }
1406 
1407  objLoc_prev = objLoc_curr;
1408  }
1409  }
1410  }
1411  }
1412 };
1413 
1414 #endif // VISUALTRACKERLIB_VIZOUTPUT_HPP_
DCFTracker::m_params
DCFTrackerConfigParams m_params
Config params for visual tracker module.
Definition: sources/libs/nvmultiobjecttracker/include/modules/VisualTracker/DCFTracker.hpp:216
PeerTarget::frameNum
NvMOTFrameNum frameNum
Frame number (of the last update).
Definition: sources/libs/nvmultiobjecttracker/include/modules/MultiViewAssociator/ICommunicator.hpp:74
TrackerVizOutput::writeAllTrajectoriesOnEveryFrame
void writeAllTrajectoriesOnEveryFrame(const uint outputDirectoryKey=0)
Draw all current trajectories on each available source frame and write the results.
Definition: sources/libs/nvmultiobjecttracker/include/modules/VisualTracker/vizOutput.hpp:405
TrackerVizOutput::m_targets
const std::shared_ptr< NvTrackedObjectManager > m_targets
Manager that supplies tracked objects.
Definition: sources/libs/nvmultiobjecttracker/include/modules/VisualTracker/vizOutput.hpp:95
NvMotDataTypes::Rect2f
Rect_< float, 2 > Rect2f
Definition: sources/libs/nvmultiobjecttracker/include/modules/utility/dataTypes.hpp:47
VisualTrackerRunTimeParams::colorFormat
NvBufSurfaceColorFormat colorFormat
Input source image color format.
Definition: sources/libs/nvmultiobjecttracker/include/modules/VisualTracker/VisualTracker.hpp:130
width
JDIMENSION JDIMENSION * width
Definition: sources/libs/nvll_batch_jpeg_encode/oss/jpeglib.h:1001
PeerTarget::tracklet
Tracklet tracklet
Stores recent world-space positions for the peer target.
Definition: sources/libs/nvmultiobjecttracker/include/modules/MultiViewAssociator/ICommunicator.hpp:89
TENTATIVE
@ TENTATIVE
\ tracking is not confirmed or w/ low confidence, so not reporting the outputs, but keep tracking (i....
Definition: includes/nvds_tracker_meta.h:45
VisualTracker::m_params
VisualTrackerConfigParams m_params
Config params for visual tracker module.
Definition: sources/libs/nvmultiobjecttracker/include/modules/VisualTracker/VisualTracker.hpp:212
VIZ_OUTPUT_TYPES
VIZ_OUTPUT_TYPES
Definition: sources/libs/nvmultiobjecttracker/include/modules/VisualTracker/vizOutput.hpp:36
TrackerVizOutput::writeSrcImagePatchesWithMaskFilter_perTarget
void writeSrcImagePatchesWithMaskFilter_perTarget(const NvMOTStreamId streamId_, const int trackerInd, const uint outputDirectoryKey, cv::Mat srcImgPatch, cv::Mat maskMat)
Buffer a source patch paired with its segmentation-filter mask for one target.
Definition: sources/libs/nvmultiobjecttracker/include/modules/VisualTracker/vizOutput.hpp:704
TargetInfo
Tracked target info.
Definition: sources/libs/nvmultiobjecttracker/include/modules/NvMultiObjectTracker/NvMultiObjectTracker_common.hpp:159
TrackerVizOutput::m_lastFrameMatchedInTrajectoryArchive
std::map< NvMOTStreamId, uint64_t > m_lastFrameMatchedInTrajectoryArchive
The target ID of the latest trajectory archived.
Definition: sources/libs/nvmultiobjecttracker/include/modules/VisualTracker/vizOutput.hpp:102
PeerTarget
Store the latest state and trajectory received for a peer target.
Definition: sources/libs/nvmultiobjecttracker/include/modules/MultiViewAssociator/ICommunicator.hpp:72
VisualTracker::m_detectorBboxes_size_h
uint * m_detectorBboxes_size_h
Definition: sources/libs/nvmultiobjecttracker/include/modules/VisualTracker/VisualTracker.hpp:249
TrackerVizOutput::drawFullTrajectory
void drawFullTrajectory(const uint64_t targetID, const std::list< TargetInfo > &trajectory, cv::Mat &frame)
Draw a target's complete trajectory on a frame.
Definition: sources/libs/nvmultiobjecttracker/include/modules/VisualTracker/vizOutput.hpp:971
TrackerVizOutput::writeSrcImagePatchesWithCorrResp_perTarget
void writeSrcImagePatchesWithCorrResp_perTarget(const NvMOTStreamId streamId_, const int trackerInd, const uint outputDirectoryKey, cv::Mat srcImgPatch, cv::Mat corrRespMat)
Buffer a source patch paired with its correlation-response image for one target.
Definition: sources/libs/nvmultiobjecttracker/include/modules/VisualTracker/vizOutput.hpp:658
TRAJECTORY_VIZ
@ TRAJECTORY_VIZ
Visualize the trajectories.
Definition: sources/libs/nvmultiobjecttracker/include/modules/VisualTracker/vizOutput.hpp:39
TrackerVizOutput::m_visualTracker
VisualTracker * m_visualTracker
CUDA visual tracker that supplies visualization data.
Definition: sources/libs/nvmultiobjecttracker/include/modules/VisualTracker/vizOutput.hpp:93
VisualTrackerRunTimeParams::srcImageSize
NvMotDataTypes::Size srcImageSize
The size of the source image.
Definition: sources/libs/nvmultiobjecttracker/include/modules/VisualTracker/VisualTracker.hpp:128
NvTrackedObjectList
std::map< TrackerIndex, std::shared_ptr< NvTrackedObject > > NvTrackedObjectList
Definition: sources/libs/nvmultiobjecttracker/include/modules/NvMultiObjectTracker/NvMultiObjectTracker_common.hpp:321
DCFTrackerConfigParams::m_vizDebugStreamId
int m_vizDebugStreamId
Video stream ID selected for visualization debugging.
Definition: sources/libs/nvmultiobjecttracker/include/modules/VisualTracker/DCFTracker.hpp:115
VisualTracker::m_detectorBboxes_h
detectorBbox_t * m_detectorBboxes_h
Definition: sources/libs/nvmultiobjecttracker/include/modules/VisualTracker/VisualTracker.hpp:252
TrackerVizOutput::writeFromWriteBuffer
void writeFromWriteBuffer(const std::shared_ptr< NvTrackedObject > target)
Write and clear pending images after a target receives a persistent ID.
Definition: sources/libs/nvmultiobjecttracker/include/modules/VisualTracker/vizOutput.hpp:772
pydeepstreamdoc::tensor::TensorDoc::clone
constexpr const char * clone
Definition: service-maker/sources/python/src/bindings/docstrings/tensordoc.h:44
TargetId
uint64_t TargetId
Definition: sources/libs/nvmultiobjecttracker/include/modules/NvMultiObjectTracker/NvMultiObjectTracker_common.hpp:41
half_float::detail::sqrt
uint32 sqrt(uint32 &r, int &exp)
Fixed point square root.
Definition: includes/half.hpp:1497
half_float::pow
half pow(half x, half y)
Power function.
Definition: includes/half.hpp:3444
half_float::cos
half cos(half arg)
Cosine function.
Definition: includes/half.hpp:3606
VisualTracker::m_paramsRt
VisualTrackerRunTimeParams m_paramsRt
Config params for visual tracker module.
Definition: sources/libs/nvmultiobjecttracker/include/modules/VisualTracker/VisualTracker.hpp:213
CamId
std::string CamId
Camera IDs are represented as strings to maintain consistency across different communicator types.
Definition: sources/libs/nvmultiobjecttracker/include/modules/NvMultiObjectTracker/NvMultiObjectTracker_common.hpp:46
TrackerVizOutput::writeSrcImagePatchesWithCorrResp
void writeSrcImagePatchesWithCorrResp(const uint outputDirectoryKey=0)
Write source image patches alongside their correlation-response visualizations.
Definition: sources/libs/nvmultiobjecttracker/include/modules/VisualTracker/vizOutput.hpp:569
uint
unsigned int uint
Definition: sources/libs/nvmultiobjecttracker/include/modules/cuDCFv2/helper_math.h:25
VisualTracker
Tracks objects with a CUDA discriminative correlation filter.
Definition: sources/libs/nvmultiobjecttracker/include/modules/VisualTracker/VisualTracker.hpp:150
DCFTracker::m_detectorBboxes_size_h
uint * m_detectorBboxes_size_h
Definition: sources/libs/nvmultiobjecttracker/include/modules/VisualTracker/DCFTracker.hpp:232
TRACKER_STATES_VIZ
@ TRACKER_STATES_VIZ
Visualize the tracker states.
Definition: sources/libs/nvmultiobjecttracker/include/modules/VisualTracker/vizOutput.hpp:38
MatrixXd
Eigen::MatrixXd MatrixXd
Definition: sources/gst-plugins/gst-nvdsvideotemplate/ds-sparse4d/preprocess/calibration_parser.h:42
half_float::atan
half atan(half arg)
Arc tangent function.
Definition: includes/half.hpp:3725
DCFTracker::m_corrResponses_d
float * m_corrResponses_d
The correlation response maps for targets (a Batch CUDA memory buffer).
Definition: sources/libs/nvmultiobjecttracker/include/modules/VisualTracker/DCFTracker.hpp:227
DCFTrackerRunTimeParams::srcImageSize
NvMotDataTypes::Size srcImageSize
The size of the source image.
Definition: sources/libs/nvmultiobjecttracker/include/modules/VisualTracker/DCFTracker.hpp:140
TrackerVizOutput::addToWriteBuffer
void addToWriteBuffer(const std::shared_ptr< NvTrackedObject > target, const cv::Mat &img, const uint frameNum, const uint outputDirectoryKey, const std::string subFolderName, const std::string fileNamePrefix="")
Add an image to a target's pending output buffer.
Definition: sources/libs/nvmultiobjecttracker/include/modules/VisualTracker/vizOutput.hpp:751
TrackerVizOutput::m_lastFrames
std::map< NvMOTStreamId, cv::Mat > m_lastFrames
The last source frame kept.
Definition: sources/libs/nvmultiobjecttracker/include/modules/VisualTracker/vizOutput.hpp:103
TrackerVizOutput::drawRecentTrajectory
void drawRecentTrajectory(const std::shared_ptr< NvTrackedObject > tracker, cv::Mat &frame, const bool showCurrentDetBbox=true, const bool showCurrentTargetBbox=true, const bool showPrediction=false, const bool showPredictionUncertainty=false, const bool showTrajectoryOnFeet=false)
Draw a target's recent trajectory, current boxes, and optional predictions on a frame.
Definition: sources/libs/nvmultiobjecttracker/include/modules/VisualTracker/vizOutput.hpp:1038
max
int max(int a, int b)
Compute the component-wise maximum.
Definition: sources/libs/nvmultiobjecttracker/include/modules/cuDCFv2/helper_math.h:60
CV_FUNCS::circshift
Eigen::MatrixXf circshift(const Eigen::MatrixXf &matrix, int dx, int dy)
Circularly shift a matrix along both axes.
Definition: sources/libs/nvmultiobjecttracker/include/modules/utility/cv_functions.hpp:293
PeerTarget::nextState
Eigen::VectorXd nextState
Predicted feet location.
Definition: sources/libs/nvmultiobjecttracker/include/modules/MultiViewAssociator/ICommunicator.hpp:81
VisualTracker::m_maskingSegWindow4Model
float * m_maskingSegWindow4Model
Masking window for the model for filter learning (a Batch CUDA memory buffer).
Definition: sources/libs/nvmultiobjecttracker/include/modules/VisualTracker/VisualTracker.hpp:241
TrackerVizOutput::drawProjectedTargetModel
void drawProjectedTargetModel(const std::shared_ptr< NvTrackedObject > target, cv::Mat &frame)
Draw a target's projected human model on the camera frame.
Definition: sources/libs/nvmultiobjecttracker/include/modules/VisualTracker/vizOutput.hpp:1292
TrackerVizOutput::m_featImgWH
const int m_featImgWH
Visualization width and height for feature images.
Definition: sources/libs/nvmultiobjecttracker/include/modules/VisualTracker/vizOutput.hpp:100
TrackerVizOutput::m_dcfTracker
DCFTracker * m_dcfTracker
VPI DCF tracker that supplies visualization data.
Definition: sources/libs/nvmultiobjecttracker/include/modules/VisualTracker/vizOutput.hpp:94
detectorBbox_t::x
int x
Definition: sources/libs/nvmultiobjecttracker/include/modules/cuDCFv2/cuDCF.h:33
DCFTracker::m_paramsRt
DCFTrackerRunTimeParams m_paramsRt
Runtime params for visual tracker module.
Definition: sources/libs/nvmultiobjecttracker/include/modules/VisualTracker/DCFTracker.hpp:217
_NvMOTObjToTrack::bbox
NvMOTRect bbox
Holds the bounding box of the object.
Definition: includes/nvdstracker.h:247
Tracklet
std::deque< TrackletPoint > Tracklet
Definition: sources/libs/nvmultiobjecttracker/include/modules/MultiViewAssociator/ICommunicator.hpp:69
TargetInfo::convexHull
std::vector< Eigen::Vector2f > convexHull
Convex hull of the projected 3D object model centered on the bounding box.
Definition: sources/libs/nvmultiobjecttracker/include/modules/NvMultiObjectTracker/NvMultiObjectTracker_common.hpp:313
CLOG
#define CLOG(message)
Definition: sources/libs/nvmultiobjecttracker/include/modules/utility/debug_common.hpp:26
PeerTargetDB
std::map< CamId, std::map< TargetId, PeerTarget > > PeerTargetDB
PeerTargetDB structure.
Definition: sources/libs/nvmultiobjecttracker/include/modules/MultiViewAssociator/IMultiViewAssociator.hpp:32
absl::move
constexpr absl::OTABSL_OPTION_NAMESPACE_NAME::remove_reference_t< T > && move(T &&t) noexcept
Definition: includes/opentelemetry/nostd/internal/absl/utility/utility.h:199
NvMOTStreamId
uint64_t NvMOTStreamId
Definition: includes/nvdstracker.h:53
TrackerVizOutput::drawUncertaintyEllipse
void drawUncertaintyEllipse(cv::Mat &frame, const cv::Mat P, const cv::Mat Pcov, cv::Scalar color, float scale=1.f)
Draw a covariance-derived uncertainty ellipse around a predicted position.
Definition: sources/libs/nvmultiobjecttracker/include/modules/VisualTracker/vizOutput.hpp:1247
DCFTracker
Tracks objects with the VPI discriminative correlation filter implementation.
Definition: sources/libs/nvmultiobjecttracker/include/modules/VisualTracker/DCFTracker.hpp:154
_NvMOTObjToTrack
Holds information about an object to be tracked.
Definition: includes/nvdstracker.h:242
TrackerVizOutput::m_writeBuffer
std::map< uint32_t, std::deque< WriteBuffer_t > > m_writeBuffer
Buffered outputs grouped by target index.
Definition: sources/libs/nvmultiobjecttracker/include/modules/VisualTracker/vizOutput.hpp:101
TargetInfo::pt_img_feet
Eigen::Vector2f pt_img_feet
Person foot location in image coordinates.
Definition: sources/libs/nvmultiobjecttracker/include/modules/NvMultiObjectTracker/NvMultiObjectTracker_common.hpp:310
_NvMOTRect::height
float height
Holds the height of the bounding box, in pixels.
Definition: includes/nvdstracker.h:219
TargetInfo::loc
Eigen::Vector2f loc
Bounding-box centroid.
Definition: sources/libs/nvmultiobjecttracker/include/modules/NvMultiObjectTracker/NvMultiObjectTracker_common.hpp:302
TrackerVizOutput::drawProjectedPeerTrajectory
void drawProjectedPeerTrajectory(const PeerTargetDB &peerTargetDB, cv::Mat &frame, const NvMOTStreamId &videoStreamID, const int &frameNum, const std::map< TargetId, cv::Scalar > &targetColorList)
Draw peer-camera target boxes and trajectories projected into the current camera frame.
Definition: sources/libs/nvmultiobjecttracker/include/modules/VisualTracker/vizOutput.hpp:1354
TrackerVizOutput::m_displayWidth
const int m_displayWidth
Display/screen width.
Definition: sources/libs/nvmultiobjecttracker/include/modules/VisualTracker/vizOutput.hpp:98
pydeepstreamdoc::tensor::TensorDoc::size
constexpr const char * size
Definition: service-maker/sources/python/src/bindings/docstrings/tensordoc.h:46
TrackerVizOutput::writeSrcImagePatchesWithMaskFilter
void writeSrcImagePatchesWithMaskFilter(const uint outputDirectoryKey=0)
Write source image patches alongside their segmentation-filter masks.
Definition: sources/libs/nvmultiobjecttracker/include/modules/VisualTracker/vizOutput.hpp:611
TrackerVizOutput::TrackerVizOutput
TrackerVizOutput(VisualTracker *visTracker, const std::shared_ptr< NvTrackedObjectManager > targets)
Construct output rendering for a CUDA visual tracker.
Definition: sources/libs/nvmultiobjecttracker/include/modules/VisualTracker/vizOutput.hpp:111
TrackerVizOutput::writeBirdsEyeView
void writeBirdsEyeView(const uint outputDirectoryKey=0)
Render and write a bird's-eye view for each available stream.
Definition: sources/libs/nvmultiobjecttracker/include/modules/VisualTracker/vizOutput.hpp:163
detectorBbox_t::y
int y
Coordinates in the correlation-response matrix.
Definition: sources/libs/nvmultiobjecttracker/include/modules/cuDCFv2/cuDCF.h:33
INACTIVE
@ INACTIVE
\ tracking is being confirmed by detectors and actively reporting outputs
Definition: includes/nvds_tracker_meta.h:44
_NvMOTRect::width
float width
Holds the width of the bounding box, in pixels.
Definition: includes/nvdstracker.h:217
FrameOutput
Writes tracker visualization frames to image files or a video stream.
Definition: sources/libs/nvmultiobjecttracker/include/modules/utility/FrameOutput.hpp:29
normalize
__host__ __device__ float2 normalize(float2 v)
Normalize a vector to unit length.
Definition: sources/libs/nvmultiobjecttracker/include/modules/cuDCFv2/helper_math.h:2752
FrameOutput::writeImageOutput
void writeImageOutput(const cv::Mat &img, const std::string imgFilename, const uint outputDirectoryKey=0, const std::string subFolderName="")
Write an image to a keyed output directory.
Definition: sources/libs/nvmultiobjecttracker/include/modules/utility/FrameOutput.hpp:157
TrackerVizOutput::~TrackerVizOutput
~TrackerVizOutput()
Destroy the visualization output writer.
Definition: sources/libs/nvmultiobjecttracker/include/modules/VisualTracker/vizOutput.hpp:127
TrackerVizOutput::TrackerVizOutput
TrackerVizOutput(DCFTracker *dcfTracker, const std::shared_ptr< NvTrackedObjectManager > targets)
Construct output rendering for a VPI DCF tracker.
Definition: sources/libs/nvmultiobjecttracker/include/modules/VisualTracker/vizOutput.hpp:121
TrackerVizOutput::m_srcImgWH
const int m_srcImgWH
Visualization width and height for source image patches.
Definition: sources/libs/nvmultiobjecttracker/include/modules/VisualTracker/vizOutput.hpp:99
_NvMOTRect::x
float x
Holds the left edge position of the object bounding box, in pixels.
Definition: includes/nvdstracker.h:213
_NvMOTRect::y
float y
Holds the top edge position of the object bounding box, in pixels.
Definition: includes/nvdstracker.h:215
TrackerVizOutput::prepareMaskFilterImg
cv::Mat prepareMaskFilterImg(const NvMOTStreamId streamId_, const uint trackerInd, std::vector< cv::Mat > &maskMats, const cv::Size dstSize)
Prepare an 8-bit BGR visualization of a target's segmentation-filter mask.
Definition: sources/libs/nvmultiobjecttracker/include/modules/VisualTracker/vizOutput.hpp:931
CV_FUNCS::constructRect2f
NvMotDataTypes::Rect2f constructRect2f(const float minX=0, const float minY=0, const float width=0, const float height=0)
Construct an axis-aligned rectangle from its origin and size.
Definition: sources/libs/nvmultiobjecttracker/include/modules/utility/cv_functions.hpp:93
NvMotDataTypes::Size::height
int height
Height in pixels.
Definition: sources/libs/nvmultiobjecttracker/include/modules/utility/dataTypes.hpp:65
VisualTracker::m_targetDisplacement2D_h
float2 * m_targetDisplacement2D_h
Definition: sources/libs/nvmultiobjecttracker/include/modules/VisualTracker/VisualTracker.hpp:251
EMPTY
@ EMPTY
Definition: includes/nvds_tracker_meta.h:42
TrackerVizOutput::writeEachCompletedTrajectory
void writeEachCompletedTrajectory(const uint outputDirectoryKey=0)
Draw and write each trajectory after its track completes.
Definition: sources/libs/nvmultiobjecttracker/include/modules/VisualTracker/vizOutput.hpp:500
NVBUF_COLOR_FORMAT_RGBA
@ NVBUF_COLOR_FORMAT_RGBA
Specifies RGBA-8-8-8-8 single plane.
Definition: includes/nvbufsurface.h:151
Vector3d
Eigen::Matrix< double, 3, 1 > Vector3d
Definition: sources/gst-plugins/gst-nvdsvideotemplate/ds-sparse4d/preprocess/calibration_parser.h:40
VisualTrackerConfigParams::m_vizDebugStreamId
int m_vizDebugStreamId
Video stream ID selected for visualization debugging.
Definition: sources/libs/nvmultiobjecttracker/include/modules/VisualTracker/VisualTracker.hpp:104
CV_FUNCS::convexHull
void convexHull(const std::vector< Eigen::Vector2d > &points, std::vector< Eigen::Vector2d > &hull)
Compute the convex hull of double-precision points.
TrackerVizOutput::make_dist_colors
cv::Mat make_dist_colors(unsigned nb)
Generate visually distinct BGR colors by distributing shuffled hues.
Definition: sources/libs/nvmultiobjecttracker/include/modules/VisualTracker/vizOutput.hpp:134
DCFTracker::m_detectorBboxes_h
detectorBbox_t * m_detectorBboxes_h
Definition: sources/libs/nvmultiobjecttracker/include/modules/VisualTracker/DCFTracker.hpp:234
PROJECTED
@ PROJECTED
\ tracking is just started and in a probational period. Waiting to become ACTIVE
Definition: includes/nvds_tracker_meta.h:46
VisualTracker::m_featureExtractor
FeatureExtractor m_featureExtractor
Feature extractor that performs bbox cropping, scaling, and compose a feature vec batch.
Definition: sources/libs/nvmultiobjecttracker/include/modules/VisualTracker/VisualTracker.hpp:218
NvMotDataTypes::Rect
Rect_< int, 2 > Rect
Definition: sources/libs/nvmultiobjecttracker/include/modules/utility/dataTypes.hpp:49
TrackerVizOutput
Renders and writes visual tracker debugging output.
Definition: sources/libs/nvmultiobjecttracker/include/modules/VisualTracker/vizOutput.hpp:43
ACTIVE
@ ACTIVE
\ The corresponding tracker is no longer is in use
Definition: includes/nvds_tracker_meta.h:43
VisualTracker::m_corrResponses_d
float * m_corrResponses_d
The correlation response maps for targets (a Batch CUDA memory buffer).
Definition: sources/libs/nvmultiobjecttracker/include/modules/VisualTracker/VisualTracker.hpp:242
half_float::sin
half sin(half arg)
Sine function.
Definition: includes/half.hpp:3573
TrackerVizOutput::prepareCorrelationResponseImg
cv::Mat prepareCorrelationResponseImg(const NvMOTStreamId streamId_, const uint trackerInd, std::vector< cv::Mat > &corrRespMats, const cv::Size dstSize, const bool showPeakPoint=true, const bool showDetBboxes=true)
Prepare a color-mapped correlation response with optional target and detection markers.
Definition: sources/libs/nvmultiobjecttracker/include/modules/VisualTracker/vizOutput.hpp:809