From 708d3c3ad2332f7ae34a718b45b4b1b6f6da4324 Mon Sep 17 00:00:00 2001 From: Moritz Maxeiner <mm@ucw.sh> Date: Wed, 3 Aug 2022 13:47:13 +0200 Subject: [PATCH] Replace std::shared_ptr<cv::Mat> with cv::Mat cv::Mat is already reference counted. --- Src/BioTrackerPlugin.cpp | 5 +- Src/BioTrackerPlugin.h | 5 +- .../ControllerTrackingAlgorithm.cpp | 3 +- Src/Controller/ControllerTrackingAlgorithm.h | 4 +- Src/Model/BioTrackerTrackingAlgorithm.cpp | 35 +++++----- Src/Model/BioTrackerTrackingAlgorithm.h | 15 +++-- .../preprocessor/ImagePreProcessor.cpp | 65 +++++++++---------- .../preprocessor/ImagePreProcessor.h | 7 +- 8 files changed, 62 insertions(+), 77 deletions(-) diff --git a/Src/BioTrackerPlugin.cpp b/Src/BioTrackerPlugin.cpp index d683f94..12a7cc2 100644 --- a/Src/BioTrackerPlugin.cpp +++ b/Src/BioTrackerPlugin.cpp @@ -163,9 +163,8 @@ void BioTrackerPlugin::receiveAreaDescriptor(IModelAreaDescriptor* areaDescr) Q_EMIT emitAreaDescriptorUpdate(areaDescr); } -void BioTrackerPlugin::receiveCurrentFrameFromMainApp( - std::shared_ptr<cv::Mat> mat, - uint frameNumber) +void BioTrackerPlugin::receiveCurrentFrameFromMainApp(cv::Mat mat, + uint frameNumber) { qobject_cast<ControllerTrackingAlgorithm*>(m_TrackerController) ->doTracking(mat, frameNumber); diff --git a/Src/BioTrackerPlugin.h b/Src/BioTrackerPlugin.h index e194e8d..847b047 100644 --- a/Src/BioTrackerPlugin.h +++ b/Src/BioTrackerPlugin.h @@ -34,7 +34,7 @@ public: private: void connectInterfaces(); signals: - void emitCvMat(std::shared_ptr<cv::Mat> mat, QString name); + void emitCvMat(cv::Mat mat, QString name); void emitTrackingDone(uint framenumber); void emitChangeDisplayImage(QString str); void emitAreaDescriptorUpdate(IModelAreaDescriptor* areaDescr); @@ -69,8 +69,7 @@ public slots: void receiveCurrentFrameNumberFromMainApp(uint frameNumber); public slots: - void receiveCurrentFrameFromMainApp(std::shared_ptr<cv::Mat> mat, - uint frameNumber); + void receiveCurrentFrameFromMainApp(cv::Mat mat, uint frameNumber); void receiveAreaDescriptor(IModelAreaDescriptor* areaDescr); private: diff --git a/Src/Controller/ControllerTrackingAlgorithm.cpp b/Src/Controller/ControllerTrackingAlgorithm.cpp index 555a7f6..a368101 100644 --- a/Src/Controller/ControllerTrackingAlgorithm.cpp +++ b/Src/Controller/ControllerTrackingAlgorithm.cpp @@ -24,8 +24,7 @@ void ControllerTrackingAlgorithm::connectControllerToController() m_TrackedTrajectoryMajor = ctrComponent->getModel(); } -void ControllerTrackingAlgorithm::doTracking(std::shared_ptr<cv::Mat> mat, - uint number) +void ControllerTrackingAlgorithm::doTracking(cv::Mat mat, uint number) { qobject_cast<BioTrackerTrackingAlgorithm*>(m_Model)->doTracking(mat, number); diff --git a/Src/Controller/ControllerTrackingAlgorithm.h b/Src/Controller/ControllerTrackingAlgorithm.h index 9f8af37..eeb75a4 100644 --- a/Src/Controller/ControllerTrackingAlgorithm.h +++ b/Src/Controller/ControllerTrackingAlgorithm.h @@ -28,7 +28,7 @@ public: public: void connectControllerToController() override; - void doTracking(std::shared_ptr<cv::Mat> mat, uint number); + void doTracking(cv::Mat mat, uint number); IView* getTrackingParameterWidget(); @@ -41,7 +41,7 @@ protected: void connectModelToController() override; Q_SIGNALS: - void emitCvMat(std::shared_ptr<cv::Mat> mat, QString name); + void emitCvMat(cv::Mat mat, QString name); void emitTrackingDone(uint framenumber); void emitChangeDisplayImage(QString str); void emitAreaDescriptorUpdate(IModelAreaDescriptor* areaDescr); diff --git a/Src/Model/BioTrackerTrackingAlgorithm.cpp b/Src/Model/BioTrackerTrackingAlgorithm.cpp index 094b2c2..d124f36 100644 --- a/Src/Model/BioTrackerTrackingAlgorithm.cpp +++ b/Src/Model/BioTrackerTrackingAlgorithm.cpp @@ -8,6 +8,7 @@ BioTrackerTrackingAlgorithm::BioTrackerTrackingAlgorithm(IController* parent, IModel* trajectory) : IModelTrackingAlgorithm(parent) , _ipp((TrackerParameter*) parameter) +, _lastImage(std::nullopt) { _cfg = static_cast<ControllerTrackingAlgorithm*>(parent)->getConfig(); _TrackingParameter = (TrackerParameter*) parameter; @@ -27,7 +28,6 @@ BioTrackerTrackingAlgorithm::BioTrackerTrackingAlgorithm(IController* parent, SLOT(acceptConnection())); } - _lastImage = nullptr; _lastFramenumber = -1; } @@ -70,15 +70,15 @@ void BioTrackerTrackingAlgorithm::refreshPolygon() void BioTrackerTrackingAlgorithm::receiveParametersChanged() { if (_lastFramenumber >= 0 && _lastImage && !_lastImage->empty()) { - doTracking(_lastImage, _lastFramenumber); + doTracking(*_lastImage, _lastFramenumber); } } void BioTrackerTrackingAlgorithm::sendSelectedImage( - std::map<std::string, std::shared_ptr<cv::Mat>>* images) + std::map<std::string, cv::Mat>* images) { - std::shared_ptr<cv::Mat> sendImage; + cv::Mat sendImage; // Send forth whatever the user selected switch (_TrackingParameter->getSendImage()) { case 0: // Send none @@ -158,22 +158,20 @@ std::vector<BlobPose> BioTrackerTrackingAlgorithm::getContourCentroids( return centroids; } -void BioTrackerTrackingAlgorithm::doTracking(std::shared_ptr<cv::Mat> p_image, - uint framenumber) +void BioTrackerTrackingAlgorithm::doTracking(cv::Mat image, uint framenumber) { _ipp.m_TrackingParameter = _TrackingParameter; - _lastImage = p_image; + _lastImage = image; _lastFramenumber = framenumber; // dont do nothing if we ain't got an image - if (p_image->empty()) { + if (image.empty()) { return; } - if (_imageX != p_image->size().width || - _imageY != p_image->size().height) { - _imageX = p_image->size().width; - _imageY = p_image->size().height; + if (_imageX != image.size().width || _imageY != image.size().height) { + _imageX = image.size().width; + _imageY = image.size().height; Q_EMIT emitDimensionUpdate(_imageX, _imageY); } @@ -198,18 +196,15 @@ void BioTrackerTrackingAlgorithm::doTracking(std::shared_ptr<cv::Mat> p_image, } // Do the preprocessing - std::map<std::string, std::shared_ptr<cv::Mat>> images = _ipp.preProcess( - p_image); - std::shared_ptr<cv::Mat> mask = - images.find(std::string("Closed Mask"))->second; - std::shared_ptr<cv::Mat> greyMat = - images.find(std::string("Greyscale"))->second; + std::map<std::string, cv::Mat> images = _ipp.preProcess(image); + cv::Mat mask = images.find(std::string("Closed Mask"))->second; + cv::Mat greyMat = images.find(std::string("Greyscale"))->second; // Find blobs via ellipsefitting _bd.setMaxBlobSize(_TrackingParameter->getMaxBlobSize()); _bd.setMinBlobSize(_TrackingParameter->getMinBlobSize()); - auto foo = *images.find(std::string("Masked Greyscale"))->second; + auto foo = images.find(std::string("Masked Greyscale"))->second; std::vector<std::vector<cv::Point>> contours; std::vector<cv::Vec4i> hierarchy; @@ -224,7 +219,7 @@ void BioTrackerTrackingAlgorithm::doTracking(std::shared_ptr<cv::Mat> p_image, drawContours(foo, contours, (int) i, cv::Scalar(255)); } - std::vector<BlobPose> blobs = getContourCentroids(*mask); + std::vector<BlobPose> blobs = getContourCentroids(mask); // Never switch the position of the trajectories. The NN2d mapper relies on // this! If you mess up the order, add or remove some t, then create a new diff --git a/Src/Model/BioTrackerTrackingAlgorithm.h b/Src/Model/BioTrackerTrackingAlgorithm.h index 4fb1042..b75c57d 100644 --- a/Src/Model/BioTrackerTrackingAlgorithm.h +++ b/Src/Model/BioTrackerTrackingAlgorithm.h @@ -5,6 +5,8 @@ #include "TrackerParameter.h" +#include <optional> + #include <opencv2/opencv.hpp> #include "Interfaces/IModel/IModelTrackingAlgorithm.h" #include "Interfaces/IModel/IModelDataExporter.h" @@ -30,21 +32,20 @@ public: ~BioTrackerTrackingAlgorithm(); Q_SIGNALS: - void emitCvMatA(std::shared_ptr<cv::Mat> image, QString name); + void emitCvMatA(cv::Mat image, QString name); void emitDimensionUpdate(int x, int y); void emitTrackingDone(uint framenumber); // ITrackingAlgorithm interface public Q_SLOTS: - void doTracking(std::shared_ptr<cv::Mat> image, uint framenumber) override; + void doTracking(cv::Mat image, uint framenumber) override; void receiveAreaDescriptorUpdate(IModelAreaDescriptor* areaDescr); void receiveParametersChanged(); private: std::vector<BlobPose> getContourCentroids(cv::Mat image); void refreshPolygon(); - void sendSelectedImage( - std::map<std::string, std::shared_ptr<cv::Mat>>* images); + void sendSelectedImage(std::map<std::string, cv::Mat>* images); std::vector<FishPose> getLastPositionsAsPose(); @@ -65,9 +66,9 @@ private: int _imageX; int _imageY; - std::shared_ptr<cv::Mat> _lastImage; - uint _lastFramenumber; - Config* _cfg; + std::optional<cv::Mat> _lastImage; + uint _lastFramenumber; + Config* _cfg; }; #endif // BIOTRACKERTRACKINGALGORITHM_H diff --git a/Src/Model/TrackingAlgorithm/imageProcessor/preprocessor/ImagePreProcessor.cpp b/Src/Model/TrackingAlgorithm/imageProcessor/preprocessor/ImagePreProcessor.cpp index 2a61ac8..1136e63 100644 --- a/Src/Model/TrackingAlgorithm/imageProcessor/preprocessor/ImagePreProcessor.cpp +++ b/Src/Model/TrackingAlgorithm/imageProcessor/preprocessor/ImagePreProcessor.cpp @@ -32,8 +32,8 @@ void ImagePreProcessor::init() qFatal("Unsupported background subtraction algorithm"); } - m_backgroundImage = std::make_shared<cv::Mat>(); - m_foregroundMask = std::make_shared<cv::Mat>(); + m_backgroundImage = cv::Mat(); + m_foregroundMask = cv::Mat(); _backgroundSubtractionEnabled = true; _backgroundEnabled = true; @@ -96,56 +96,49 @@ cv::Mat ImagePreProcessor::backgroundSubtraction(cv::Mat& image) cv::Mat fgmask; m_subtractor->apply(image, fgmask, m_TrackingParameter->getLearningRate()); - m_subtractor->getBackgroundImage(*m_backgroundImage); + m_subtractor->getBackgroundImage(m_backgroundImage); return fgmask; } -std::map<std::string, std::shared_ptr<cv::Mat>> ImagePreProcessor::preProcess( - std::shared_ptr<cv::Mat> p_image) +std::map<std::string, cv::Mat> ImagePreProcessor::preProcess(cv::Mat image) { - std::shared_ptr<cv::Mat> greyMat = std::make_shared<cv::Mat>(); - std::shared_ptr<cv::Mat> openedMask = std::make_shared<cv::Mat>(); - std::shared_ptr<cv::Mat> closedMask = std::make_shared<cv::Mat>(); + cv::Mat greyMat; + cv::Mat openedMask; + cv::Mat closedMask; - std::shared_ptr<cv::Mat> maskedGrey = std::make_shared<cv::Mat>(); + cv::Mat maskedGrey; - cv::cvtColor(*p_image, *greyMat, cv::COLOR_BGR2GRAY); + cv::cvtColor(image, greyMat, cv::COLOR_BGR2GRAY); // 1. step: do the background subtraction - *m_foregroundMask = backgroundSubtraction(*greyMat); + m_foregroundMask = backgroundSubtraction(greyMat); // 2. step: open the mask - *openedMask = dilate( - erode(*m_foregroundMask, m_TrackingParameter->getOpeningErosionSize()), + openedMask = dilate( + erode(m_foregroundMask, m_TrackingParameter->getOpeningErosionSize()), m_TrackingParameter->getOpeningDilationSize()); // 3. step: close the image - *closedMask = erode( - dilate(*openedMask, m_TrackingParameter->getClosingDilationSize()), + closedMask = erode( + dilate(openedMask, m_TrackingParameter->getClosingDilationSize()), m_TrackingParameter->getClosingErosionSize()); // 4. step: masked greyscale image - greyMat->copyTo(*maskedGrey, *closedMask); - - std::map<std::string, std::shared_ptr<cv::Mat>> all; - all.insert(std::pair<std::string, std::shared_ptr<cv::Mat>>( - std::string("Greyscale"), - greyMat)); - all.insert(std::pair<std::string, std::shared_ptr<cv::Mat>>( - std::string("Background"), - m_backgroundImage)); - all.insert(std::pair<std::string, std::shared_ptr<cv::Mat>>( - std::string("Foreground Mask"), - m_foregroundMask)); - all.insert(std::pair<std::string, std::shared_ptr<cv::Mat>>( - std::string("Opened Mask"), - openedMask)); - all.insert(std::pair<std::string, std::shared_ptr<cv::Mat>>( - std::string("Closed Mask"), - closedMask)); - all.insert(std::pair<std::string, std::shared_ptr<cv::Mat>>( - std::string("Masked Greyscale"), - maskedGrey)); + greyMat.copyTo(maskedGrey, closedMask); + + std::map<std::string, cv::Mat> all; + all.insert( + std::pair<std::string, cv::Mat>(std::string("Greyscale"), greyMat)); + all.insert(std::pair<std::string, cv::Mat>(std::string("Background"), + m_backgroundImage)); + all.insert(std::pair<std::string, cv::Mat>(std::string("Foreground Mask"), + m_foregroundMask)); + all.insert(std::pair<std::string, cv::Mat>(std::string("Opened Mask"), + openedMask)); + all.insert(std::pair<std::string, cv::Mat>(std::string("Closed Mask"), + closedMask)); + all.insert(std::pair<std::string, cv::Mat>(std::string("Masked Greyscale"), + maskedGrey)); return all; } diff --git a/Src/Model/TrackingAlgorithm/imageProcessor/preprocessor/ImagePreProcessor.h b/Src/Model/TrackingAlgorithm/imageProcessor/preprocessor/ImagePreProcessor.h index 0acbcc4..50988e4 100644 --- a/Src/Model/TrackingAlgorithm/imageProcessor/preprocessor/ImagePreProcessor.h +++ b/Src/Model/TrackingAlgorithm/imageProcessor/preprocessor/ImagePreProcessor.h @@ -59,8 +59,7 @@ public: * @param: image, image to process, * @return: a pre-process image. */ - std::map<std::string, std::shared_ptr<cv::Mat>> preProcess( - std::shared_ptr<cv::Mat> p_image); + std::map<std::string, cv::Mat> preProcess(cv::Mat p_image); /** * The method updates the image background. @@ -72,8 +71,8 @@ public: private: cv::Mat _outputImage; - std::shared_ptr<cv::Mat> m_backgroundImage; - std::shared_ptr<cv::Mat> m_foregroundMask; + cv::Mat m_backgroundImage; + cv::Mat m_foregroundMask; // parameters for image pre-processing bool _backgroundSubtractionEnabled; -- GitLab