diff --git a/include/control.h b/include/control.h index 0327b73e4b9178316644cff9b107114330680ad4..90d8cfcc828252ee3c79521655c9602ba98ebfad 100644 --- a/include/control.h +++ b/include/control.h @@ -35,7 +35,7 @@ class Control: public QWidget, public Ui::Control Q_OBJECT public: - Control(QWidget *parent = nullptr); + Control(QWidget& parent, reco::Recognizer& recognizer); void setScene(QGraphicsScene *sc); @@ -219,11 +219,9 @@ public: return mMainWindow; } - inline reco::RecognitionMethod getRecoMethod() const - { - auto method = recoMethod->itemData(recoMethod->currentIndex()); - return method.value<reco::RecognitionMethod>(); - } +private: + reco::RecognitionMethod getRecoMethod() const; + private slots: void on_anaCalculate_clicked(); @@ -308,6 +306,8 @@ private slots: void on_trackShowBefore_valueChanged(int /*i*/) { if (!isLoading()) mScene->update(); } void on_trackShowAfter_valueChanged(int /*i*/) { if (!isLoading()) mScene->update(); } + void on_recoMethod_currentIndexChanged(int index); + void onRecoMethodChanged(reco::RecognitionMethod method); void on_performRecognition_stateChanged(int i); void on_markerBrightness_valueChanged(int i); void on_markerIgnoreWithout_stateChanged(int i); @@ -414,6 +414,9 @@ private slots: void on_trackRoiFix_stateChanged(int arg1); +signals: + void userChangedRecoMethod(reco::RecognitionMethod method); + private: Petrack *mMainWindow; QGraphicsScene *mScene; diff --git a/include/petrack.h b/include/petrack.h index bc34d87ef1b852038364955fe96cf52ad356ad06..fe92c61e32ab747f65fdc039f581d182d0a94fec 100644 --- a/include/petrack.h +++ b/include/petrack.h @@ -39,6 +39,7 @@ #include "autoCalib.h" #include "coordItem.h" #include "extrCalibration.h" +#include "recognition.h" class CalibFilter; class Animation; @@ -225,6 +226,10 @@ public: { return mControlWidget; } + inline reco::Recognizer& getRecognizer() + { + return mReco; + } inline StereoWidget* getStereoWidget() { return mStereoWidget; @@ -567,6 +572,8 @@ private: bool mRecognitionChanged; bool mTrackChanged; + reco::Recognizer mReco; + Tracker *mTracker; TrackerReal *mTrackerReal; double mHeadSize; diff --git a/include/recognition.h b/include/recognition.h index e3bd6b988889f2494cd7b5121d72603e86a121cd..629fe0a558aac14ec89511903900f62cc182f732 100644 --- a/include/recognition.h +++ b/include/recognition.h @@ -22,9 +22,11 @@ #define RECOGNITION_H #include <QList> -#include "vector.h" +#include <QObject> #include <opencv2/aruco.hpp> +#include "vector.h" + class TrackPoint; class QRect; class BackgroundFilter; @@ -48,13 +50,39 @@ namespace reco { Code = 6, }; + class Recognizer : public QObject + { + Q_OBJECT + + private: + // TODO add options for each marker type + + // default multicolor marker (until 11/2016 hermes marker) + RecognitionMethod mRecoMethod = RecognitionMethod::MultiColor; + public: + QList<TrackPoint> getMarkerPos(cv::Mat &img, QRect &roi, Control *controlWidget, int borderSize, BackgroundFilter *bgFilter); + + RecognitionMethod getRecoMethod() const {return mRecoMethod;} + + public slots: + void userChangedRecoMethod(RecognitionMethod method) + { + if(method != mRecoMethod) + { + mRecoMethod = method; + emit recoMethodChanged(mRecoMethod); + } + } + + signals: + void recoMethodChanged(RecognitionMethod method); + }; + // berechnet pixelverschiebung aufgrund von schraegsicht bei einem farbmarker // Maik Dissertation Seite 138 // boxImageCentre ohne Border Vec2F autoCorrectColorMarker(Vec2F &boxImageCentre, Control *controlWidget); - //void getMarkerPos(IplImage *iplImg, QRect roi, QList<TrackPoint> *crossList, int markerBrightness, int borderSize, bool ignoreWithoutMarker, bool autoWB, BackgroundFilter *bgFilter, int recoMethod); - void getMarkerPos(cv::Mat &img, QRect &roi, QList<TrackPoint> *crossList, Control *controlWidget, int borderSize, BackgroundFilter *bgFilter); namespace detail { struct ColorBlob{ @@ -101,6 +129,7 @@ namespace reco { bool ignoreWithoutMarker = true; ///< should a blob without valid arucoMarker be ignored bool autoCorrect = false; ///< should perspective correction be performed bool autoCorrectOnlyExport = false; ///< should perspective correction only be performed when exporting trajectories + RecognitionMethod method = RecognitionMethod::Code; ///< Used recognition method; could be called from findMulticolorMarker }; std::vector<ColorBlob> findColorBlob(const ColorBlobDetectionParams &options); @@ -109,7 +138,7 @@ namespace reco { void refineWithBlackDot(std::vector<ColorBlob>& blobs, const cv::Mat& img, QList<TrackPoint>& crossList, const BlackDotOptions& options); void refineWithAruco(std::vector<ColorBlob> &blobs, const cv::Mat& img, QList<TrackPoint> &crossList, ArucoOptions& options); - void findCodeMarker(cv::Mat &img, QList<TrackPoint> *crossList, Control *controlWidget, Vec2F offsetCropRect2Roi=Vec2F{0,0}); + void findCodeMarker(cv::Mat &img, QList<TrackPoint> &crossList, Control *controlWidget, RecognitionMethod recoMethod, Vec2F offsetCropRect2Roi=Vec2F{0,0}); cv::Ptr<cv::aruco::Dictionary> getDictMip36h12(); } } diff --git a/include/tracker.h b/include/tracker.h index 3a264e703f7544d01d4582d9f449f5202db402ff..f93ffaa5e48a01a36e0b23409b203920bc579b8c 100644 --- a/include/tracker.h +++ b/include/tracker.h @@ -464,10 +464,10 @@ public: // true, if new traj is inserted with point p and initial frame frame // p in pixel coord // pers wird gesetzt, wenn existierender trackpoint einer person verschoben wird - bool addPoint(TrackPoint &p, int frame, const QSet<int>& onlyVisible, int *pers = nullptr); + bool addPoint(TrackPoint &p, int frame, const QSet<int>& onlyVisible, reco::RecognitionMethod method, int *pers = nullptr); // hier sollte direkt die farbe mit uebergeben werden - void addPoints(QList<TrackPoint> &pL, int frame); + void addPoints(QList<TrackPoint> &pL, int frame, reco::RecognitionMethod method); // calculate height of person @@ -484,7 +484,7 @@ public: int insertFeaturePoints(int frame, size_t count, cv::Mat &img, int borderSize, float errorScale); // frame ist frame fuer naechsten prev frame - int track(cv::Mat &img,cv::Rect &rect, int frame, bool reTrack, int reQual, int borderSize, int level=3, QSet<int> onlyVisible = QSet<int>(), int errorScaleExponent=0); + int track(cv::Mat &img, cv::Rect &rect, int frame, bool reTrack, int reQual, int borderSize, reco::RecognitionMethod recoMethod, int level=3, QSet<int> onlyVisible = QSet<int>(), int errorScaleExponent=0); void checkPlausibility(QList<int> &pers, QList<int> &frame, diff --git a/src/control.cpp b/src/control.cpp index d9acd240be5ccb64e0979ff62e63808f49665485..c3ba492a7e1d8fadac6eb1f11df76bc98fb2b9cb 100644 --- a/src/control.cpp +++ b/src/control.cpp @@ -44,11 +44,11 @@ #define DEFAULT_HEIGHT 180.0 -Control::Control(QWidget *parent) - : QWidget(parent) +Control::Control(QWidget& parent, reco::Recognizer& recognizer) + : QWidget(&parent) { setAccessibleName("Control"); - mMainWindow = (class Petrack*) parent; + mMainWindow = (class Petrack*) &parent; mScene = nullptr; mLoading = false; //beim erzeugen von new colorplot absturz!!!! @@ -164,8 +164,9 @@ Control::Control(QWidget *parent) recoMethod->addItem("multicolor marker", QVariant::fromValue(reco::RecognitionMethod::MultiColor)); recoMethod->addItem("code marker", QVariant::fromValue(reco::RecognitionMethod::Code)); - // default multicolor marker (until 11/2016 hermes marker) - recoMethod->setCurrentIndex(recoMethod->findData(QVariant::fromValue(reco::RecognitionMethod::MultiColor))); + connect(&recognizer, &reco::Recognizer::recoMethodChanged, this, &Control::onRecoMethodChanged); + connect(this, &Control::userChangedRecoMethod, &recognizer, &reco::Recognizer::userChangedRecoMethod); + recoMethod->setCurrentIndex(recoMethod->findData(QVariant::fromValue(recognizer.getRecoMethod()))); scrollArea->setMinimumWidth( scrollAreaWidgetContents->sizeHint().width() + @@ -1549,6 +1550,17 @@ void Control::on_performRecognition_stateChanged(int /*i*/) mMainWindow->updateImage(); } +void Control::on_recoMethod_currentIndexChanged(int /*index*/) +{ + auto method = recoMethod->itemData(recoMethod->currentIndex()); + emit userChangedRecoMethod(method.value<reco::RecognitionMethod>()); +} + +void Control::onRecoMethodChanged(reco::RecognitionMethod method) +{ + recoMethod->setCurrentIndex(recoMethod->findData(QVariant::fromValue(method))); +} + void Control::on_markerBrightness_valueChanged(int /*i*/) { mMainWindow->setRecognitionChanged(true);// flag changes of recognition parameters @@ -3376,6 +3388,12 @@ void Control::getXml(QDomElement &elem) mMainWindow->updateCoord(); } +reco::RecognitionMethod Control::getRecoMethod() const +{ + auto method = recoMethod->itemData(recoMethod->currentIndex()); + return method.value<reco::RecognitionMethod>(); +} + void Control::on_colorPickerButton_clicked(bool checked) { //true wenn neu gechecked, false wenn wieder abgewählt @@ -3651,3 +3669,4 @@ void Control::expandRange(QColor& fromColor, QColor& toColor, const QColor& clic } #include "moc_control.cpp" + diff --git a/src/petrack.cpp b/src/petrack.cpp index 6d1bfa09a67832fd9264b8a83faa9fe09762690c..885380eb652bb37dffe14bb0efadadd4b17fa197 100644 --- a/src/petrack.cpp +++ b/src/petrack.cpp @@ -44,7 +44,6 @@ #include "player.h" #include "calibFilter.h" #include "autoCalib.h" -#include "recognition.h" #include "trackerItem.h" #include "backgroundItem.h" #include "tracker.h" @@ -107,7 +106,7 @@ Petrack::Petrack() mCalibFilter = new CalibFilter; // schoener waere erst zu erzeugen, wenn video geladen wird, da sonst bei stereo erst normealer und dann stereo objekt erzeugt wird mCalibFilter->disable(); // aber control widget greift schon bei erzeugung auf alle objekte zur einstellung zurueck - mControlWidget = new Control(this); + mControlWidget = new Control(*this, mReco); cw = mControlWidget; // muss spaeter geloescht werden mStereoWidget = new StereoWidget(this); @@ -2512,7 +2511,7 @@ void Petrack::testTracker() int Petrack::calculateRealTracker() { - bool autoCorrectOnlyExport = (mControlWidget->getRecoMethod() == reco::RecognitionMethod::MultiColor) && // multicolor + bool autoCorrectOnlyExport = (mReco.getRecoMethod() == reco::RecognitionMethod::MultiColor) && // multicolor mMultiColorMarkerWidget->autoCorrect->isChecked() && mMultiColorMarkerWidget->autoCorrectOnlyExport->isChecked(); int anz = mTrackerReal->calculate(mTracker, mImageItem, mControlWidget->getColorPlot(), getImageBorderSize(), @@ -2555,7 +2554,7 @@ void Petrack::exportTracker(QString dest) //default = "" if (!dest.isEmpty()) { QList<int> pers, frame; - bool autoCorrectOnlyExport = (mControlWidget->getRecoMethod() == reco::RecognitionMethod::MultiColor) && // multicolor + bool autoCorrectOnlyExport = (mReco.getRecoMethod() == reco::RecognitionMethod::MultiColor) && // multicolor mMultiColorMarkerWidget->autoCorrect->isChecked() && mMultiColorMarkerWidget->autoCorrectOnlyExport->isChecked(); @@ -3135,7 +3134,8 @@ void Petrack::updateImage(bool imageChanged) // default = false (only true for n int anz = mTracker->track(mImgFiltered, rect, frameNum, mControlWidget->trackRepeat->isChecked(), mControlWidget->trackRepeatQual->value(), getImageBorderSize(), - mControlWidget->trackRegionLevels->value(), getOnlyVisible()); + mReco.getRecoMethod(), mControlWidget->trackRegionLevels->value(), + getOnlyVisible()); #ifdef TIME_MEASUREMENT debout << "nach track: " << getElapsedTime() <<endl; #endif @@ -3166,7 +3166,7 @@ void Petrack::updateImage(bool imageChanged) // default = false (only true for n myRound(mRecognitionRoiItem->rect().width()), myRound(mRecognitionRoiItem->rect().height())); QList<TrackPoint> persList; - auto recoMethod = mControlWidget->getRecoMethod(); + auto recoMethod = mReco.getRecoMethod(); #ifdef TIME_MEASUREMENT // "==========: " debout << "vor reco: " << getElapsedTime() <<endl; @@ -3175,20 +3175,20 @@ void Petrack::updateImage(bool imageChanged) // default = false (only true for n || (recoMethod == reco::RecognitionMethod::Color) || (recoMethod == reco::RecognitionMethod::Japan) || (recoMethod == reco::RecognitionMethod::MultiColor) || (recoMethod == reco::RecognitionMethod::Code)) //else { - reco::getMarkerPos(mImgFiltered, rect, &persList, mControlWidget, getImageBorderSize(), getBackgroundFilter()); + persList = mReco.getMarkerPos(mImgFiltered, rect, mControlWidget, getImageBorderSize(), getBackgroundFilter()); } #ifndef STEREO_DISABLED if (mStereoContext && mStereoWidget->stereoUseForReco->isChecked()) { PersonList pl; - pl.calcPersonPos(mImgFiltered, rect, persList, mStereoContext, getBackgroundFilter(), markerLess); + pl.calcPersonPos(mImgFiltered, rect, &persList, mStereoContext, getBackgroundFilter(), markerLess); } #endif #ifdef TIME_MEASUREMENT // "==========: " debout << "nach reco: " << getElapsedTime() <<endl; #endif - mTracker->addPoints(persList, frameNum); + mTracker->addPoints(persList, frameNum, mReco.getRecoMethod()); // folgendes lieber im Anschluss, ggf beim exportieren oder statt test direkt del: if (mStereoContext && mStereoWidget->stereoUseForReco->isChecked()) @@ -3459,7 +3459,7 @@ int Petrack::addOrMoveManualTrackPoint(const QPointF& pos) int pers = -1; TrackPoint tP(Vec2F{pos}, 110); // 110 is higher than 100 (max. quality) and gets clamped to 100 after insertion // allows replacemet of every point (check for better quality always passes) - mTracker->addPoint(tP, mAnimation->getCurrentFrameNum(), getOnlyVisible(), &pers); + mTracker->addPoint(tP, mAnimation->getCurrentFrameNum(), getOnlyVisible(), mReco.getRecoMethod(), &pers); updateControlWidget(); return pers; } diff --git a/src/recognition.cpp b/src/recognition.cpp index 0713905348fea0766cbc7ee7be940dfe8a8b8161..f439fe3223505603f8021917f50ef893a10bbbb5 100644 --- a/src/recognition.cpp +++ b/src/recognition.cpp @@ -579,7 +579,7 @@ void detail::refineWithAruco(std::vector<ColorBlob> &blobs, const cv::Mat& img, if (subImg.empty()) continue; - findCodeMarker(subImg, &crossList, controlWidget, offsetCropRect2Roi); + findCodeMarker(subImg, crossList, controlWidget, options.method, offsetCropRect2Roi); // The next three statements each: // - set the offset of subImg with regards to ROI //(ROI to original image is archieved later in the code for all methods) @@ -647,7 +647,7 @@ void detail::refineWithAruco(std::vector<ColorBlob> &blobs, const cv::Mat& img, * @param ignoreWithoutMarker (is ignored->overwritten by cmWidget->ignoreWithoutDot->isChecked()) * @param offset */ -void findMultiColorMarker(cv::Mat &img, QList<TrackPoint> *crossList, Control *controlWidget, bool ignoreWithoutMarker, Vec2F &offset) +void findMultiColorMarker(cv::Mat &img, QList<TrackPoint> &crossList, Control *controlWidget, bool ignoreWithoutMarker, Vec2F &offset, RecognitionMethod method) { Petrack *mainWindow = controlWidget->getMainWindow(); MultiColorMarkerItem* cmItem = mainWindow->getMultiColorMarkerItem(); @@ -720,7 +720,7 @@ void findMultiColorMarker(cv::Mat &img, QList<TrackPoint> *crossList, Control *c options.imageItem = mainWindow->getImageItem(); // adds to crosslist - refineWithBlackDot(blobs, img, *crossList, options); + refineWithBlackDot(blobs, img, crossList, options); }else if (useCodeMarker) { ArucoOptions options; @@ -728,9 +728,10 @@ void findMultiColorMarker(cv::Mat &img, QList<TrackPoint> *crossList, Control *c options.autoCorrectOnlyExport = autoCorrectOnlyExport; options.ignoreWithoutMarker = ignoreWithoutMarker; options.controlWidget = controlWidget; + options.method = method; // adds to crosslist - refineWithAruco(blobs, img, *crossList, options); + refineWithAruco(blobs, img, crossList, options); }else { Vec2F moveDir; @@ -740,11 +741,11 @@ void findMultiColorMarker(cv::Mat &img, QList<TrackPoint> *crossList, Control *c { moveDir = autoCorrectColorMarker(blob.imageCenter, controlWidget); - crossList->append(TrackPoint(Vec2F(blob.box.center.x, blob.box.center.y)+moveDir, 100, Vec2F(blob.box.center.x, blob.box.center.y), blob.color)); // 100 beste qualitaet + crossList.append(TrackPoint(Vec2F(blob.box.center.x, blob.box.center.y)+moveDir, 100, Vec2F(blob.box.center.x, blob.box.center.y), blob.color)); // 100 beste qualitaet } else { - crossList->append(TrackPoint(Vec2F(blob.box.center.x, blob.box.center.y), 100, Vec2F(blob.box.center.x, blob.box.center.y), blob.color)); // 100 beste qualitaet + crossList.append(TrackPoint(Vec2F(blob.box.center.x, blob.box.center.y), 100, Vec2F(blob.box.center.x, blob.box.center.y), blob.color)); // 100 beste qualitaet } } } @@ -761,7 +762,7 @@ void findMultiColorMarker(cv::Mat &img, QList<TrackPoint> *crossList, Control *c * @param crossList * @param controlWidget */ -void findColorMarker(cv::Mat &img, QList<TrackPoint> *crossList, Control *controlWidget) +void findColorMarker(cv::Mat &img, QList<TrackPoint> &crossList, Control *controlWidget) { ColorParameters param; ColorMarkerItem* cmItem = controlWidget->getMainWindow()->getColorMarkerItem(); @@ -840,7 +841,7 @@ void findColorMarker(cv::Mat &img, QList<TrackPoint> *crossList, Control *contro { // eine mittelung waere ggf sinnvoll, aber am rand aufpassen col.setRgb(getValue(img,myRound(box.center.x),myRound(box.center.y)).rgb()); - crossList->append(TrackPoint(Vec2F(box.center.x, box.center.y), 100, Vec2F(box.center.x, box.center.y), col)); // 100 beste qualitaet + crossList.append(TrackPoint(Vec2F(box.center.x, box.center.y), 100, Vec2F(box.center.x, box.center.y), col)); // 100 beste qualitaet } // take the next contour @@ -854,7 +855,7 @@ void findColorMarker(cv::Mat &img, QList<TrackPoint> *crossList, Control *contro * @param crossList[out] list of detected TrackPoints * @param controlWidget */ -void detail::findCodeMarker(cv::Mat &img, QList<TrackPoint> *crossList, Control *controlWidget, Vec2F offsetCropRect2Roi /*=(0,0)*/) +void detail::findCodeMarker(cv::Mat &img, QList<TrackPoint> &crossList, Control *controlWidget, RecognitionMethod recoMethod, Vec2F offsetCropRect2Roi /*=(0,0)*/) { CodeMarkerItem* codeMarkerItem = controlWidget->getMainWindow()->getCodeMarkerItem(); CodeMarkerWidget* codeMarkerWidget = controlWidget->getMainWindow()->getCodeMarkerWidget(); @@ -873,7 +874,6 @@ void detail::findCodeMarker(cv::Mat &img, QList<TrackPoint> *crossList, Control Petrack *mainWindow = controlWidget->getMainWindow(); int bS = mainWindow->getImageBorderSize(); - auto recoMethod = controlWidget->getRecoMethod(); if (controlWidget->getCalibCoordDimension() == 0) // 3D { @@ -895,9 +895,7 @@ void detail::findCodeMarker(cv::Mat &img, QList<TrackPoint> *crossList, Control minMarkerPerimeterRate = (codeMarkerWidget->minMarkerPerimeter->value()*4./cmPerPixel_max)/std::max(rect.width(),rect.height()); maxMarkerPerimeterRate = (codeMarkerWidget->maxMarkerPerimeter->value()*4./cmPerPixel_min)/std::max(rect.width(),rect.height()); - } - - if (recoMethod == RecognitionMethod::MultiColor) // for usage of codemarker with MulticolorMarker + } else if (recoMethod == RecognitionMethod::MultiColor) // for usage of codemarker with MulticolorMarker { QRect rect(0,0, img.rows, img.cols); @@ -962,7 +960,7 @@ void detail::findCodeMarker(cv::Mat &img, QList<TrackPoint> *crossList, Control double x = (corners.at(i).at(0).x+corners.at(i).at(1).x+corners.at(i).at(2).x+corners.at(i).at(3).x)*0.25; double y = (corners.at(i).at(0).y+corners.at(i).at(1).y+corners.at(i).at(2).y+corners.at(i).at(3).y)*0.25; - crossList->append(TrackPoint(Vec2F(x,y), 100, ids.at(i))); // 100 beste qualitaet + crossList.append(TrackPoint(Vec2F(x,y), 100, ids.at(i))); // 100 beste qualitaet } } @@ -1076,35 +1074,47 @@ void findContourMarker(cv::Mat &img, QList<TrackPoint> *crossList, int markerBri * * @param img * @param roi Region of interest for recognition - * @param crossList[out] detected TrackPoints * @param controlWidget * @param borderSize * @param bgFilter + * + * @return List of detected TrackPoints */ -void getMarkerPos(cv::Mat &img, QRect &roi, QList<TrackPoint> *crossList, Control *controlWidget, int borderSize, BackgroundFilter *bgFilter) +QList<TrackPoint> Recognizer::getMarkerPos(cv::Mat &img, QRect &roi, Control *controlWidget, int borderSize, BackgroundFilter *bgFilter) { int markerBrightness = controlWidget->markerBrightness->value(); bool ignoreWithoutMarker = (controlWidget->markerIgnoreWithout->checkState() == Qt::Checked); bool autoWB = (controlWidget->recoAutoWB->checkState() == Qt::Checked); - auto recoMethod = controlWidget->getRecoMethod(); cv::Mat tImg; cv::Rect rect; - tImg = getRoi(img, roi, rect, !((recoMethod == RecognitionMethod::Color) || (recoMethod == RecognitionMethod::MultiColor) || (recoMethod == RecognitionMethod::Code))); + tImg = getRoi(img, roi, rect, !((mRecoMethod == RecognitionMethod::Color) || (mRecoMethod == RecognitionMethod::MultiColor) || (mRecoMethod == RecognitionMethod::Code))); if (tImg.empty()) - return; + return QList<TrackPoint>{}; + QList<TrackPoint> crossList; // offset of rect Vec2F v(rect.x-borderSize, rect.y-borderSize); - if (recoMethod == RecognitionMethod::MultiColor) - findMultiColorMarker(tImg, crossList, controlWidget, ignoreWithoutMarker, v); - else if (recoMethod == RecognitionMethod::Color) - findColorMarker(tImg, crossList, controlWidget); - else if (recoMethod == RecognitionMethod::Code) - findCodeMarker(tImg, crossList, controlWidget); - else - findContourMarker(tImg, crossList, markerBrightness, ignoreWithoutMarker, autoWB, recoMethod, controlWidget->getMainWindow()->getHeadSize()); + + switch (mRecoMethod) { + case RecognitionMethod::MultiColor: + findMultiColorMarker(tImg, crossList, controlWidget, ignoreWithoutMarker, v, mRecoMethod); + break; + case RecognitionMethod::Color: + findColorMarker(tImg, crossList, controlWidget); + break; + case RecognitionMethod::Code: + findCodeMarker(tImg, crossList, controlWidget, mRecoMethod); + break; + case RecognitionMethod::Casern: [[fallthrough]]; + case RecognitionMethod::Hermes: [[fallthrough]]; + case RecognitionMethod::Japan: + findContourMarker(tImg, &crossList, markerBrightness, ignoreWithoutMarker, autoWB, mRecoMethod, controlWidget->getMainWindow()->getHeadSize()); + break; + case RecognitionMethod::Stereo: + throw std::invalid_argument("Stereo marker are not handled in getMarkerPos, but in PersonList::calcPersonPos"); + } // must be set because else hovermoveevent of recognitionRec moves also the colorMaskItem controlWidget->getMainWindow()->getColorMarkerItem()->setRect(v); @@ -1112,24 +1122,23 @@ void getMarkerPos(cv::Mat &img, QRect &roi, QList<TrackPoint> *crossList, Contro controlWidget->getMainWindow()->getMultiColorMarkerItem()->setRect(v); // must be set because else hovermoveevent of recognitionRec moves also the colorMaskItem controlWidget->getMainWindow()->getCodeMarkerItem()->setRect(v); + // set cross position relative to original image size - for (int i=0; i < crossList->size(); ++i) - { - (*crossList)[i] += v; - (*crossList)[i].setColPoint((*crossList)[i].colPoint() + v); + for (auto& point : crossList){ + point += v; + point.setColPoint(point.colPoint() + v); } if (bgFilter->getEnabled()) // nur fuer den fall von bgSubtraction durchfuehren { - for (int i=0; i < crossList->size(); ++i) - { - if (! bgFilter->isForeground(crossList->at(i).x(), crossList->at(i).y())) - { - crossList->removeAt(i); - --i; - } - } + crossList.erase( + std::remove_if(crossList.begin(), crossList.end(), [bgFilter](TrackPoint& tp){ + return !bgFilter->isForeground(tp.x(), tp.y()); + }), + crossList.end()); } + + return crossList; } diff --git a/src/tracker.cpp b/src/tracker.cpp index 9da77f75765ae3609d750acb03f34f7d7a2a0942..cc2bd785034155d13f139dc6d0243bb6a4979631 100644 --- a/src/tracker.cpp +++ b/src/tracker.cpp @@ -949,7 +949,7 @@ int Tracker::calcPosition(int /*frame*/) { * @param[out] pers person the point was added to; undefined when new trajectory was created * @return true if new trajectory was created; false otherwise */ -bool Tracker::addPoint(TrackPoint &p, int frame, const QSet<int>& onlyVisible, int *pers) +bool Tracker::addPoint(TrackPoint &p, int frame, const QSet<int>& onlyVisible, reco::RecognitionMethod method, int *pers) { bool found = false; int i, iNearest = 0.; @@ -977,7 +977,7 @@ bool Tracker::addPoint(TrackPoint &p, int frame, const QSet<int>& onlyVisible, i // skalierungsfaktor fuer kopfgroesse // fuer multicolor marker groesser, da der schwarze punkt weit am rand liegen kann bool multiColorWithDot = false; - if (mMainWindow->getControlWidget()->getRecoMethod() == reco::RecognitionMethod::MultiColor && // multicolor marker + if (method == reco::RecognitionMethod::MultiColor && // multicolor marker mMainWindow->getMultiColorMarkerWidget()->useDot->isChecked() && // nutzung von black dot !mMainWindow->getMultiColorMarkerWidget()->ignoreWithoutDot->isChecked()) // muetzen ohne black dot werden auch akzeptiert { @@ -1067,7 +1067,7 @@ bool Tracker::addPoint(TrackPoint &p, int frame, const QSet<int>& onlyVisible, i } // used from recognition -void Tracker::addPoints(QList<TrackPoint> &pL, int frame) +void Tracker::addPoints(QList<TrackPoint> &pL, int frame, reco::RecognitionMethod method) { int i; @@ -1078,7 +1078,7 @@ void Tracker::addPoints(QList<TrackPoint> &pL, int frame) // ueberprufen ob identisch mit einem Punkt in liste for (i = 0; i < pL.size(); ++i) // ueber PointList { - addPoint(pL[i], frame, QSet<int>()); + addPoint(pL[i], frame, QSet<int>(), method); } } @@ -1377,7 +1377,7 @@ bool Tracker::tryMergeTrajectories(const TrackPoint& v, size_t i, int frame) * @param errorScaleExponent errorScale is 1.5^errorScaleExponent * @return Number of tracked points */ -int Tracker::track(cv::Mat &img, cv::Rect &rect, int frame, bool reTrack, int reQual, int borderSize, int level, QSet<int> onlyVisible, int errorScaleExponent) +int Tracker::track(cv::Mat &img, cv::Rect &rect, int frame, bool reTrack, int reQual, int borderSize, reco::RecognitionMethod recoMethod, int level, QSet<int> onlyVisible, int errorScaleExponent) { QList<int> trjToDel; float errorScale = pow(1.5,errorScaleExponent); // 0 waere neutral @@ -1436,7 +1436,6 @@ int Tracker::track(cv::Mat &img, cv::Rect &rect, int frame, bool reTrack, int re // (bei schlechten, aber noch ertraeglichem fehler in der naehe dunkelsten punkt suchen) // dieser ansatz kann dazu fuehren, dass bei starken helligkeitsunterschieden auf pappe zum schatten gewandert wird!!! - auto recoMethod = mMainWindow->getControlWidget()->getRecoMethod(); if (!mMainWindow->getStereoWidget()->stereoUseForReco->isChecked() && ((recoMethod == reco::RecognitionMethod::Casern)|| (recoMethod == reco::RecognitionMethod::Hermes))) // nicht benutzen, wenn ueber disparity der kopf gesucht wird und somit kein marker vorhanden oder zumindest nicht am punkt lewigen muss { refineViaNearDarkPoint(); diff --git a/tests/unit_test/tst_control.cpp b/tests/unit_test/tst_control.cpp index c5c82712133432ec66b25537a17ae4968a7fff53..9337288514fa4d1fabf02591f7dfd6ad7d36700f 100644 --- a/tests/unit_test/tst_control.cpp +++ b/tests/unit_test/tst_control.cpp @@ -240,5 +240,5 @@ SCENARIO("I open PeTrack with a red image", "[ui][config]") SCENARIO("Open PeTrack check defaults", "[ui][config]") { Petrack pet {}; - REQUIRE(pet.getControlWidget()->getRecoMethod() == reco::RecognitionMethod::MultiColor); + REQUIRE(pet.getRecognizer().getRecoMethod() == reco::RecognitionMethod::MultiColor); }