18 #ifndef VISUALTRACKERLIB_VIZOUTPUT_HPP_
19 #define VISUALTRACKERLIB_VIZOUTPUT_HPP_
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"
50 const uint outputDirectoryKey;
51 const std::string subFolderName;
52 const std::string fileNamePrefix;
63 const cv::Mat &img_,
uint frameNum_,
uint outputDirectoryKey_,
64 const std::string &subFolderName_,
const std::string &fileNamePrefix_
66 : img(img_), frameNum(frameNum_), outputDirectoryKey(outputDirectoryKey_),
67 subFolderName(subFolderName_), fileNamePrefix(fileNamePrefix_)
74 WriteBuffer_t(
const WriteBuffer_t&) =
default;
79 WriteBuffer_t& operator=(
const WriteBuffer_t&) =
default;
84 WriteBuffer_t(WriteBuffer_t&&) noexcept =
default;
89 WriteBuffer_t& operator=(WriteBuffer_t&&) noexcept =
default;
95 const std::shared_ptr<NvTrackedObjectManager>
m_targets;
137 float step = 180.0f / nb;
138 std::vector<int> hues(nb);
140 for (
size_t i = 0; i < nb; i++) {
144 std::random_device rd;
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);
155 cv::cvtColor(hsv, rgb, cv::COLOR_HSV2BGR);
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;
175 frameSize = cv::Point(
180 frameSize = cv::Point(
184 const std::map<NvMOTStreamId, std::shared_ptr<NvTrackedObjectList>>& targetLists =
m_targets->getTrackedObjectsInUseList();
187 for(
auto it = targetLists.begin(); it != targetLists.end(); ++it)
191 if(
m_targets->m_objModelProjectors.find(videoStreamID) ==
m_targets->m_objModelProjectors.end()
192 || !
m_targets->m_objModelProjectors.at(videoStreamID)->isInitialized())
197 framesBgr[videoStreamID] = cv::Mat::zeros(frameSize,CV_8UC3);
199 if(worldMapRegions.find(videoStreamID) == worldMapRegions.end())
201 worldMapRegions[videoStreamID] =
cv::Rect(0,0,0,0);
204 cv::Rect &worldMapRegion = worldMapRegions[videoStreamID];
206 if(targetLists.find(videoStreamID) != targetLists.end())
210 if(targetList.size() > 0)
212 for(
auto targetIt = targetList.begin(); targetIt != targetList.end(); ++targetIt)
214 std::shared_ptr<NvTrackedObject> tracker = targetIt->second;
216 const std::list<TargetInfo> trajectory = tracker->getTrajectoryBuffer();
218 if(trajectory.size() == 0)
225 auto pt = trajectory.rbegin();
234 for(
auto pt = trajectory.begin(); pt != trajectory.end(); ++pt)
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));
243 if(worldMapRegion.width == 0 || worldMapRegion.x > pt_world_feet.x-worldMapMargin)
245 worldMapRegion.x = pt_world_feet.x-worldMapMargin;
247 if(worldMapRegion.width == 0 || worldMapRegion.x+worldMapRegion.width < pt_world_feet.x+worldMapMargin)
249 worldMapRegion.width = pt_world_feet.x+worldMapMargin-worldMapRegion.x;
251 if(worldMapRegion.height == 0 || worldMapRegion.y > pt_world_feet.y-worldMapMargin)
253 worldMapRegion.y = pt_world_feet.y-worldMapMargin;
255 if(worldMapRegion.height == 0 || worldMapRegion.y+worldMapRegion.height < pt_world_feet.y+worldMapMargin)
257 worldMapRegion.height = pt_world_feet.y+worldMapMargin-worldMapRegion.y;
265 const double mapWidth =
std::max(worldMapRegion.width, worldMapRegion.height);
267 worldMapsScale[videoStreamID] = cv::Point2d(frameSize.x/mapWidth, frameSize.y/mapWidth);
272 const int radius = 3;
275 for(
auto it = targetLists.begin(); it != targetLists.end(); ++it)
279 if(worldMapRegions.find(videoStreamID) == worldMapRegions.end()
280 || framesBgr.find(videoStreamID) == framesBgr.end()
281 || worldMapsScale.find(videoStreamID) == worldMapsScale.end())
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
289 cv::Mat frame = framesBgr.at(videoStreamID);
290 const double mapWidth =
std::max(worldMapRegion.width, worldMapRegion.height);
292 if(targetLists.find(videoStreamID) != targetLists.end())
296 if(targetList.size() > 0)
299 int frameNum = targetList.begin()->second->getTargetInfo().frameNum;
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
305 for(
auto targetIt = targetList.begin(); targetIt != targetList.end(); ++targetIt)
307 std::shared_ptr<NvTrackedObject> tracker = targetIt->second;
309 const std::list<TargetInfo> trajectory_ = tracker->getTrajectoryBuffer();
310 std::list<TargetInfo> trajectory = trajectory_;
312 if(trajectory.size() == 0)
319 auto pt = trajectory.rbegin();
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
341 cv::Point pt_map_last(frameSize.x - pt_map_last_.x, frameSize.y - pt_map_last_.y);
343 const cv::Scalar targetColor = tracker->getColor();
346 for(
auto pt = trajectory.begin(); pt != trajectory.end(); ++pt, ++i)
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));
353 (pt_world_feet.x-mapCenter.x+mapWidth/2)*worldMapScale.x,
354 (pt_world_feet.y-mapCenter.y+mapWidth/2)*worldMapScale.y
359 cv::Point pt_map(frameSize.x - pt_map_.x, frameSize.y - pt_map_.y);
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);
367 color = cv::Scalar(50,50,50);
370 if(std::next(pt) == trajectory.end())
373 cv::circle(frame, pt_map, radius, color, -1);
374 cv::circle(frame, pt_map, radius+2, CV_RGB(255,0,0), 2);
378 cv::circle(frame, pt_map, radius, color, -1);
382 std::string label = std::to_string(targetID) +
"(" + std::to_string(targetAge) +
")";
384 frame, label, pt_map_last + cv::Point(5,-5),
385 cv::FONT_HERSHEY_SIMPLEX, 0.6, targetColor, 2, 8
390 std::ostringstream imgName;
392 imgName <<
"BirdsEye_StreamID[" << std::hex << videoStreamID <<
"]";
393 imgName <<
"_Frame[" << std::dec << std::setfill(
'0') << std::setw(10) << frameNum <<
"]";
407 bool showRecentTrajectory =
true;
408 bool showCurrentDetBbox =
true;
409 bool showCurrentTargetBbox =
true;
410 bool showPrediction =
false;
411 bool showPredictionUncertainty =
false;
413 bool showHumanModelCylinder =
true;
414 bool showTrajectoryOnFeet =
true;
415 bool showPeerTrajectory =
true;
419 std::map<NvMOTStreamId, cv::Mat> srcImgFramesBgr;
427 if(srcImgFramesBgr.size() == 0)
429 CLOG(std::string(
"!!![WARNING] No video stream exist in srcImgFramesBgr" ).c_str());
434 const std::map<NvMOTStreamId, std::shared_ptr<NvTrackedObjectList>>& targetLists =
m_targets->getTrackedObjectsInUseList();
437 for(
auto it = srcImgFramesBgr.begin(); it != srcImgFramesBgr.end(); ++it)
441 if(targetLists.find(videoStreamID) == targetLists.end())
444 cv::Mat frame = it->second.clone();
448 if(targetList.size() == 0)
452 int frameNum = targetList.begin()->second->getTargetInfo().frameNum;
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
458 std::map<TargetId, cv::Scalar> targetColorList;
459 for(
auto targetIt = targetList.begin(); targetIt != targetList.end(); ++targetIt)
461 std::shared_ptr<NvTrackedObject> target = targetIt->second;
462 targetColorList[target->getTargetID()] = target->getColor();
464 if(showRecentTrajectory)
467 target, frame, showCurrentDetBbox, showCurrentTargetBbox,
468 showPrediction, showPredictionUncertainty, showTrajectoryOnFeet
473 if(showHumanModelCylinder
474 &&
m_targets->m_objModelProjectors.find(videoStreamID) !=
m_targets->m_objModelProjectors.end()
475 &&
m_targets->m_objModelProjectors.at(videoStreamID)->isInitialized())
481 if (showPeerTrajectory)
487 std::ostringstream imgName;
489 imgName <<
"TrajPerFrame_StreamID[" << std::hex << videoStreamID <<
"]";
490 imgName <<
"_Frame[" << std::dec << std::setfill(
'0') << std::setw(10) << frameNum <<
"]";
504 std::map<NvMOTStreamId, cv::Mat> srcImgFramesBgr;
512 if(srcImgFramesBgr.size() == 0)
514 CLOG(std::string(
"!!![WARNING] No video stream exist in srcImgFramesBgr" ).c_str());
520 for(
auto it = srcImgFramesBgr.begin(); it != srcImgFramesBgr.end(); ++it)
532 if(
m_targets->m_trajectoryManager->m_trajectoryArchive.find(videoStreamID) ==
m_targets->m_trajectoryManager->m_trajectoryArchive.end())
536 for(
auto trajIt =
m_targets->m_trajectoryManager->m_trajectoryArchive.at(videoStreamID)->begin(); trajIt !=
m_targets->m_trajectoryManager->m_trajectoryArchive.at(videoStreamID)->end(); ++trajIt)
538 const uint64_t targetId = trajIt->first & 0x0000ffff;
539 const std::list<TargetInfo> &tracklet = trajIt->second.tracklet;
540 bool &isVisualized = trajIt->second.isVisualized;
544 cv::Mat frame = it->second.clone();
549 std::ostringstream imgName;
551 imgName <<
"CompletedTraj_StreamID[" << std::hex << videoStreamID <<
"]";
552 imgName <<
"_TargetID[" << std::dec << targetId <<
"]_Frame[" << tracklet.begin()->frameNum
553 <<
"->"<< tracklet.rbegin()->frameNum <<
"]";
557 std::cout <<
"[VizOutput] Wrote archived tracklet of TargetID[" << targetId <<
"]" << std::endl;
572 std::map<NvMOTStreamId, std::map<uint, cv::Mat > > srcImgPatches;
573 std::vector<cv::Mat> corrRespMats;
574 int m_vizDebugStreamId;
583 srcImgPatches =
m_dcfTracker->getImagePatches2Host_OCV_batch();
588 for(
auto it =
m_targets->getTrackedObjectsInUseList().begin(); it !=
m_targets->getTrackedObjectsInUseList().end(); ++it)
592 if(m_vizDebugStreamId < 0 || m_vizDebugStreamId == (
int)(streamId>>32))
594 for(
auto jt = it->second->begin(); jt != it->second->end(); ++jt)
596 uint trackerInd = jt->first;
599 streamId, trackerInd, outputDirectoryKey, srcImgPatches[streamId][trackerInd].
clone(),
614 std::map<NvMOTStreamId, std::map<uint, cv::Mat > > srcImgPatches;
615 std::vector<cv::Mat> maskMats;
616 int m_vizDebugStreamId;
625 std::cout <<
"Mask visualization is not supported for VPI NvDCF yet" << std::endl;
629 for(
auto it =
m_targets->getTrackedObjectsInUseList().begin(); it !=
m_targets->getTrackedObjectsInUseList().end(); ++it)
633 if(m_vizDebugStreamId < 0 || m_vizDebugStreamId == (
int)(streamId>>32))
635 for(
auto jt = it->second->begin(); jt != it->second->end(); ++jt)
637 uint trackerInd = jt->first;
640 streamId, trackerInd, outputDirectoryKey, srcImgPatches[streamId][trackerInd].
clone(),
660 const uint outputDirectoryKey, cv::Mat srcImgPatch, cv::Mat corrRespMat
663 const std::shared_ptr<NvTrackedObject> target =
m_targets->getTrackedObjectsInUseList(streamId_).at(trackerInd);
668 int frameNum = target->getTargetInfo().frameNum;
669 int streamId = streamId_ >> 32;
671 assert(srcImgPatch.size().width > 0 && srcImgPatch.size().height > 0);
675 cvtColor(srcImgPatch, srcImgPatch, cv::COLOR_RGBA2BGR);
679 assert(srcImgPatch.type() == corrRespMat.type());
688 target, fusedImg, frameNum, outputDirectoryKey,
689 std::string(
"Stream_" + std::to_string((
int)streamId)),
"CorrResp_"
706 const uint outputDirectoryKey, cv::Mat srcImgPatch, cv::Mat maskMat
709 const std::shared_ptr<NvTrackedObject> target =
m_targets->getTrackedObjectsInUseList(streamId_).at(trackerInd);
714 int frameNum = target->getTargetInfo().frameNum;
715 int streamId = streamId_ >> 32;
717 assert(srcImgPatch.size().width > 0 && srcImgPatch.size().height > 0);
721 cvtColor(srcImgPatch, srcImgPatch, cv::COLOR_RGBA2BGR);
725 assert(srcImgPatch.type() == maskMat.type());
734 target, fusedImg, frameNum, outputDirectoryKey,
735 std::string(
"Stream_" + std::to_string((
int)streamId)),
"mask_"
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 =
""
756 const uint targetInd = target->getTargetInd();
757 const uint32_t targetAge = target->getAge();
763 WriteBuffer_t buf(img, frameNum, outputDirectoryKey, subFolderName, fileNamePrefix);
778 const uint targetInd = target->getTargetInd();
779 uint64_t targetID = target->getTargetID();
785 const WriteBuffer_t &buf = *it;
788 std::string outFileName = buf.fileNamePrefix +
"Target_" + std::to_string((
int)targetID) +
"_Frame_" + std::to_string(buf.frameNum);
791 writeImageOutput(buf.img, outFileName, buf.outputDirectoryKey, buf.subFolderName);
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
816 if(targetList.size() == 0)
818 return cv::Mat::zeros(corrRespMats[trackerInd].
size(), corrRespMats[trackerInd].type());
821 const std::shared_ptr<NvTrackedObject> target = targetList.at(trackerInd);
825 return cv::Mat::zeros(corrRespMats[trackerInd].
size(), corrRespMats[trackerInd].type());
828 assert(corrRespMats[trackerInd].
size().
width > 0 && corrRespMats[trackerInd].
size().height > 0);
830 cv::Mat response_viz_gray, response_viz_rgb;
834 corrRespMats[trackerInd], response_viz_gray,
835 corrRespMats[trackerInd].cols*corrRespMats[trackerInd].rows, 0, cv::NORM_L2
840 response_viz_gray, cvFloor(response_viz_gray.cols/2), cvFloor(response_viz_gray.rows/2)
842 response_viz_gray.convertTo(response_viz_gray, CV_8UC1);
844 cv::resize(response_viz_gray, response_viz_gray, dstSize);
846 float wScale = dstSize.width / (float)corrRespMats[trackerInd].
size().width;
847 float hScale = dstSize.height / (float)corrRespMats[trackerInd].
size().height;
849 cv::applyColorMap(response_viz_gray, response_viz_rgb, cv::COLORMAP_JET);
853 cv::minMaxLoc(response_viz_gray, NULL, &maxVal, NULL, &maxLoc);
861 + cv::Point2f(corrRespMats[trackerInd].
size().
width, corrRespMats[trackerInd].
size().height)*0.5f;
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;
870 response_viz_rgb, loc+cv::Point2f(0.5f,0.5f), CV_RGB(255,255,0), cv::MARKER_CROSS, 1.5*wScale, 2
881 cv::Point2f dBboxCenterPtInCorrResp = cv::Point2f(
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)
892 response_viz_rgb, ptInCorrResp_shifted,
893 CV_RGB(255,0,255), cv::MARKER_TILTED_CROSS, 1.5*wScale, 3
901 cv::Point2f dBboxCenterPtInCorrResp = cv::Point2f(
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)
912 response_viz_rgb, ptInCorrResp_shifted,
913 CV_RGB(255,0,255), cv::MARKER_TILTED_CROSS, 1.5*wScale, 3
920 return response_viz_rgb;
932 const NvMOTStreamId streamId_,
const uint trackerInd, std::vector<cv::Mat> &maskMats,
const cv::Size dstSize
935 const std::map<uint32_t, std::shared_ptr<NvTrackedObject>> &targetList =
m_targets->getTrackedObjectsInUseList(
939 if(targetList.size() == 0)
941 return cv::Mat::zeros(maskMats[trackerInd].
size(), CV_8UC3);
944 const std::shared_ptr<NvTrackedObject> target = targetList.at(trackerInd);
948 return cv::Mat::zeros(maskMats[trackerInd].
size(), CV_8UC3);
951 assert(maskMats[trackerInd].
size().
width > 0 && maskMats[trackerInd].
size().height > 0);
954 cv::Mat mask_viz_gray = maskMats[trackerInd] * 255;
955 cv::Mat mask_viz_rgb;
957 mask_viz_gray.convertTo(mask_viz_gray, CV_8UC1);
958 cvtColor(mask_viz_gray, mask_viz_rgb, cv::COLOR_GRAY2BGR);
960 cv::resize(mask_viz_rgb, mask_viz_rgb, dstSize);
971 void drawFullTrajectory(
const uint64_t targetID,
const std::list<TargetInfo> &trajectory, cv::Mat &frame)
974 const int radius = 5;
976 if(trajectory.size() == 0)
981 cv::Point objLoc_curr, objLoc_prev;
984 cv::Rect2f lastBbox = CV_FUNCS::convertMotRect2f2CvRect2f(trajectory.rbegin()->tBbox);
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
992 for(
auto pt=trajectory.begin(); pt != trajectory.end(); ++pt, ++i)
994 cv::Rect2f bbox = CV_FUNCS::convertMotRect2f2CvRect2f((*pt).tBbox);
995 objLoc_curr = (bbox.tl()+bbox.br())*0.5;
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);
1002 color = cv::Scalar(0,0,255);
1006 color = cv::Scalar(0,0,0);
1009 if(i == trajectory.size()-1)
1011 cv::circle(frame, objLoc_curr, radius, color, -1);
1012 cv::circle(frame, objLoc_curr, radius+2, CV_RGB(255,0,0), 2);
1014 cv::rectangle(frame, bbox, color, 1, 1);
1018 cv::circle(frame, objLoc_curr, radius, color, 1);
1022 cv::line(frame, objLoc_prev, objLoc_curr, color, 1);
1024 objLoc_prev = objLoc_curr;
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
1045 const int radius = 3;
1046 const int tailLength = 300;
1048 cv::Point objLoc_curr, objLoc_prev;
1050 const std::list<TargetInfo> trajectory = tracker->getTrajectoryBuffer();
1052 if(trajectory.size() == 0)
1059 auto pt = trajectory.rbegin();
1068 uint32_t targetID = tracker->getTargetID();
1069 cv::Rect2f lastBbox = CV_FUNCS::convertMotRect2f2CvRect2f(trajectory.rbegin()->tBbox);
1070 const cv::Scalar targetColor = tracker->getColor();
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
1078 auto pt = trajectory.begin();
1079 uint totalPts = trajectory.size();
1082 if(trajectory.size() > tailLength)
1084 std::advance(pt, trajectory.size() - tailLength);
1085 totalPts = tailLength;
1089 for(; pt != trajectory.end(); ++pt, ++i)
1091 cv::Rect2f tBbox = CV_FUNCS::convertMotRect2f2CvRect2f((*pt).tBbox);
1093 if(showTrajectoryOnFeet)
1095 if(tracker->m_objModelProjector !=
nullptr && tracker->m_objModelProjector->isInitialized())
1098 objLoc_curr = cv::Point((*pt).pt_img_feet(0), (*pt).pt_img_feet(1));
1103 objLoc_curr = tBbox.br() - cv::Point2f(tBbox.width/2, 0);
1109 objLoc_curr = (tBbox.tl()+tBbox.br())*0.5;
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);
1118 color = cv::Scalar(0,0,0);
1121 if(std::next(pt) == trajectory.end())
1123 if(showCurrentDetBbox)
1126 if(pt->matchedDetObjInfo !=
nullptr && pt->matchedDetObjInfo->objIn !=
nullptr)
1132 cv::Rect2f originalDetBbox = CV_FUNCS::convertMotRect2f2CvRect2f(detBbox);
1134 cv::rectangle(frame, originalDetBbox, cv::Scalar(100,100,100), 1, 1);
1138 if(showCurrentTargetBbox && (*pt).convexHull.size() == 0)
1141 cv::rectangle(frame, tBbox, color, 1, 1);
1145 cv::circle(frame, objLoc_curr, radius, color, -1);
1146 cv::circle(frame, objLoc_curr, radius+2, CV_RGB(255,0,0), 2);
1151 if(tracker->m_objModelProjector !=
nullptr && tracker->m_objModelProjector->isInitialized())
1154 const std::deque<float> dT = {10.f, 20.f};
1156 const std::deque<float> radius = {20.f, 40.f};
1159 for(
uint i=0; i<dT.size(); i++)
1161 const Eigen::VectorXd pt_world_pred_states = tracker->m_stateEstimator->getPredictedStates(
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(
1168 cv::Point2d pt_img_feet_pred(eigenVector(0), eigenVector(1));
1170 cv::Point predLoc(
int(pt_img_feet_pred.x+0.5f),
int(pt_img_feet_pred.y+0.5f));
1174 std::vector<Eigen::Vector2d> projCircle = tracker->m_objModelProjector->calculateProjectedCircleFromWorldFeet(Eigen::Vector2d(pt_world_feet_pred(0), pt_world_feet_pred(1)), radius[i]);
1176 for(
uint i=1; i<projCircle.size(); i++)
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
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
1195 const std::deque<float> dT = {10.f, 20.f};
1199 P = tracker->m_stateEstimator->getPredictedStates(*(dT.rbegin()));
1200 cv::Point predLoc(
int(P(0)+0.5f),
int(P(1)+0.5f));
1202 cv::line(frame, objLoc_curr, predLoc, CV_RGB(255,0,0), 2);
1204 if(showPredictionUncertainty)
1207 for(
uint i=0; i<dT.size(); i++)
1209 std::tie(P, Pcov) = tracker->m_stateEstimator->getPredictedStatesWithCov(dT[i]);
1212 cv::Mat P_ocv(P.rows(), P.cols(), CV_64F);
1213 cv::Mat Pcov_ocv(Pcov.rows(), Pcov.cols(), CV_64F);
1215 cv::eigen2cv(P, P_ocv);
1216 cv::eigen2cv(Pcov, Pcov_ocv);
1227 cv::circle(frame, objLoc_curr, radius, color, -1);
1232 cv::line(frame, objLoc_prev, objLoc_curr, color, 1);
1235 objLoc_prev = objLoc_curr;
1248 cv::Mat &frame,
const cv::Mat P,
const cv::Mat Pcov, cv::Scalar color,
float scale = 1.f
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]));
1260 double width, height;
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;
1281 cv::Point2i loc(P.at<
double>(0), P.at<
double>(1));
1284 cv::ellipse(frame, loc, cv::Size(
width, height), a, 0, 360, color, 1, cv::LINE_AA);
1294 const std::list<TargetInfo> trajectory = target->getTrajectoryBuffer();
1296 if(trajectory.size() == 0)
1303 auto pt = trajectory.rbegin();
1312 const cv::Scalar targetColor = target->getColor();
1314 const TargetInfo &lastTargetInfo = *trajectory.rbegin();
1319 const Eigen::Vector2f &tLoc = lastTargetInfo.
loc;
1320 const Eigen::Vector2f &pt_img_feet = lastTargetInfo.
pt_img_feet;
1325 std::vector<cv::Point> projected_cylinder;
1328 projected_cylinder.push_back(cv::Point(pt(0), pt(1)));
1331 for(
uint i=1; i<projected_cylinder.size(); i++)
1333 cv::line(frame, projected_cylinder[i-1], projected_cylinder[i], targetColor, 2, cv::LINE_AA);
1336 frame, projected_cylinder[0],
1337 projected_cylinder[projected_cylinder.size()-1], targetColor, 2, cv::LINE_AA
1341 const uint humanFeetRadius = 3;
1342 cv::circle(frame, cv::Point2d(pt_img_feet(0), pt_img_feet(1)) , humanFeetRadius, targetColor, -1);
1356 const int& frameNum,
const std::map<TargetId, cv::Scalar>& targetColorList
1359 for (
auto &peerTargets : peerTargetDB) {
1360 CamId camId = peerTargets.first;
1361 for (
auto &peerTargetIt : peerTargets.second) {
1362 TargetId targetID = peerTargetIt.first;
1364 const PeerTarget& peerTarget = peerTargetIt.second;
1366 if (peerTarget.
frameNum + 2 < frameNum)
1371 Eigen::Vector2d pt_img_feet =
m_targets->m_objModelProjectors.at(videoStreamID)->getProjectedWorldGroundPts({peer_world_feet}).front();
1374 unsigned camNum = 100;
1376 if (targetColorList.find(targetID) != targetColorList.end())
1378 color = targetColorList.at(targetID);
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);
1384 cv::rectangle(frame, bbox, color, 2, 1);
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
1391 if (tracklet.empty())
1394 cv::Point objLoc_curr, objLoc_prev;
1395 for (
auto it = tracklet.rbegin(); it!= tracklet.rend(); ++it)
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();
1400 objLoc_curr = cv::Point(
int(pt_img(0)),
int(pt_img(1)));
1401 if (it != tracklet.rbegin())
1404 cv::line(frame, objLoc_curr, objLoc_prev, color, 2, cv::LINE_AA);
1407 objLoc_prev = objLoc_curr;
1414 #endif // VISUALTRACKERLIB_VIZOUTPUT_HPP_