diff --git a/Src/Model/BioTrackerTrackingAlgorithm.cpp b/Src/Model/BioTrackerTrackingAlgorithm.cpp index 419c1a614a14a106da5fdca59b72e71cae018623..24939cc4d8de934a154afe0f0ba1d64913de8dfa 100644 --- a/Src/Model/BioTrackerTrackingAlgorithm.cpp +++ b/Src/Model/BioTrackerTrackingAlgorithm.cpp @@ -66,7 +66,7 @@ void BioTrackerTrackingAlgorithm::request_shared_memory() { } void BioTrackerTrackingAlgorithm::receiveAreaDescriptorUpdate(IModelAreaDescriptor *areaDescr) { - _AreaInfo = areaDescr; + _areaInfo = areaDescr; } BioTrackerTrackingAlgorithm::~BioTrackerTrackingAlgorithm() @@ -119,19 +119,21 @@ void BioTrackerTrackingAlgorithm::doTracking(std::shared_ptr<cv::Mat> p_image, u auto res = _sock.recv(_zmq_msg, zmq::recv_flags::none); auto msg = json::parse(_zmq_msg.to_string_view()); - std::vector<FishPose> poses; + std::vector<std::tuple<int, FishPose>> poses; for (auto pos : msg["data"]) { - auto pose = FishPose( - cv::Point2f(1.0, 1.0), // FIXME: Calculate cm - cv::Point2f(pos["x"].get<int>(), pos["y"].get<int>()), - pos["orientation"].get<float>(), - pos["orientation"].get<float>() * (180.0 / CV_PI), - 1.0, // FIXME: width - 1.0, // FIXME: height - 1.0 // FIXME: score - ); - poses.push_back(pose); + auto pose = std::make_tuple( + pos["id"].get<int>(), + FishPose( + _areaInfo, + cv::Point2f(pos["x"].get<int>(), pos["y"].get<int>()), + pos["orientation"].get<float>(), + 1.0)); // FIXME: score + poses.push_back(pose); } + std::sort(poses.begin(), poses.end(), + [](std::tuple<int, FishPose> a, std::tuple<int, FishPose> b) { + return std::get<0>(a) < std::get<0>(b); + }); //Insert new poses into data structure int trajNumber = 0; @@ -140,7 +142,7 @@ void BioTrackerTrackingAlgorithm::doTracking(std::shared_ptr<cv::Mat> p_image, u if (t && t->getValid() && !t->getFixed()) { BST::TrackedElement *e = new BST::TrackedElement(t, "n.a.", t->getId()); - e->setFishPose(poses[trajNumber]); + e->setFishPose(std::get<1>(poses[trajNumber])); e->setTime(start); t->add(e, framenumber); trajNumber++; diff --git a/Src/Model/BioTrackerTrackingAlgorithm.h b/Src/Model/BioTrackerTrackingAlgorithm.h index 583ebedffbfe39858c7715f00e5e7f69e0410296..87e62c6581d9e19e47252018ba083127c2815301 100644 --- a/Src/Model/BioTrackerTrackingAlgorithm.h +++ b/Src/Model/BioTrackerTrackingAlgorithm.h @@ -58,6 +58,7 @@ private: zmq::socket_t _sock; zmq::message_t _zmq_msg; float *_shm_img; + IModelAreaDescriptor* _areaInfo; }; #endif // BIOTRACKERTRACKINGALGORITHM_H diff --git a/Src/Model/TrackedComponents/pose/FishPose.cpp b/Src/Model/TrackedComponents/pose/FishPose.cpp index 6fd36b115e3cb2a9f717bcfb4ebf9ba77eb75017..8c8e6102932f29df45ab594bb3948e24d72debae 100644 --- a/Src/Model/TrackedComponents/pose/FishPose.cpp +++ b/Src/Model/TrackedComponents/pose/FishPose.cpp @@ -13,6 +13,18 @@ FishPose::FishPose(cv::Point2f pos_cm , cv::Point pos_px, float rad, float deg, time(&_timev); } +FishPose::FishPose(IModelAreaDescriptor *_areaInfo, cv::Point pos_px, float rad, float score) : + _position_px(pos_px), + _radAngle(rad), + _width(1.0), + _height(1.0), + _score(score) +{ + assert(_degAngle >= -360.0f && _degAngle <= 360.0f); + time(&_timev); + _position_cm = _areaInfo->pxToCm(_position_px); + _degAngle = _radAngle * (180.0 / CV_PI); +} std::string FishPose::toString(bool rectified) { diff --git a/Src/Model/TrackedComponents/pose/FishPose.h b/Src/Model/TrackedComponents/pose/FishPose.h index 30c569061fefb20d37d04e2957ae89754a5cb104..5dee8a27b1175c79d0b6c1f8d4124c773b03c285 100644 --- a/Src/Model/TrackedComponents/pose/FishPose.h +++ b/Src/Model/TrackedComponents/pose/FishPose.h @@ -2,6 +2,7 @@ #include <time.h> #include <opencv2/opencv.hpp> +#include "Interfaces/IModel/IModelAreaDescriptor.h" class FishPose { @@ -11,6 +12,11 @@ public: */ FishPose(cv::Point2f pos_cm = cv::Point2f(-1,-1), cv::Point pos_px = cv::Point(-1,-1), float rad = 0, float deg = 0, float width = 0, float height = 0, float score = 0.0); + /** + * Simplified constructor using unit conversion. + */ + FishPose(IModelAreaDescriptor *_areaInfo, cv::Point pos_px, float rad, float score); + /** * Copy constructor. */ @@ -114,6 +120,8 @@ public: std::string toString(bool rectified = false); private: + IModelAreaDescriptor* _areaDescr; + cv::Point2f _position_cm; cv::Point _position_px; float _radAngle;