Skip to content
Snippets Groups Projects

Compare revisions

Changes are shown as if the source revision was being merged into the target revision. Learn more about comparing revisions.

Source

Select target project
No results found

Target

Select target project
  • ped-dyn-emp/petrack
1 result
Show changes
Commits on Source (3)
...@@ -29,25 +29,37 @@ class Petrack; ...@@ -29,25 +29,37 @@ class Petrack;
class Control; class Control;
class Tracker; class Tracker;
struct OffsetMarker {
std::vector<cv::Point2f> corners;
Vec2F offset;
OffsetMarker(std::vector<cv::Point2f> corn, Vec2F off) : corners(corn), offset(off) {};
};
class CodeMarkerItem : public QGraphicsItem class CodeMarkerItem : public QGraphicsItem
{ {
private: private:
Petrack *mMainWindow; Petrack *mMainWindow;
// QImage *mImage; const QColor mRejectedColor = QColor(255,0,0); // red
const QColor mCornerColor = QColor(0,0,255); // blue
const QColor mAcceptedColor = QColor(0,255,0); // green
std::vector<int> mIds; std::vector<int> mIds;
std::vector<std::vector<cv::Point2f> > mCorners, mRejected; std::vector<OffsetMarker> mCorners, mRejected;
Vec2F mUlc; // upper left corner to draw Vec2F mUlc; // upper left corner to draw
Vec2F mOffsetCropRect2Roi; //
public: public:
CodeMarkerItem(QWidget *wParent, QGraphicsItem * parent = NULL); CodeMarkerItem(QWidget *wParent, QGraphicsItem * parent = nullptr);
QRectF boundingRect() const; QRectF boundingRect() const override;
void setRect(Vec2F& v); void setRect(Vec2F& v);
void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget); void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget) override;
void setDetectedMarkers(std::vector<std::vector<cv::Point2f> > corners, std::vector<int> ids); void addDetectedMarkers(std::vector<std::vector<cv::Point2f> > corners, std::vector<int> ids, Vec2F offset = Vec2F(0,0));
void setRejectedMarkers(std::vector<std::vector<cv::Point2f> > rejected); void addRejectedMarkers(std::vector<std::vector<cv::Point2f> > rejected, Vec2F offset = Vec2F(0,0));
void setOffsetCropRect2Roi(Vec2F offsetCropRect2Roi); void resetSavedMarkers();
private:
void drawMarker(const OffsetMarker& currentMarker, int id, const QColor& borderColor, QPainter *painter);
static constexpr int numCorners = 4;
}; };
#endif #endif
...@@ -129,6 +129,7 @@ public: ...@@ -129,6 +129,7 @@ public:
Vec2F(double x, double y); Vec2F(double x, double y);
Vec2F(const Vec2F& v) = default; Vec2F(const Vec2F& v) = default;
Vec2F(const QPointF& v); Vec2F(const QPointF& v);
Vec2F(const cv::Point2f& p);
Vec2F(const CvPoint* v); Vec2F(const CvPoint* v);
Vec2F(const CvPoint2D32f* v); Vec2F(const CvPoint2D32f* v);
......
...@@ -79,10 +79,6 @@ void CodeMarkerItem::paint(QPainter *painter, const QStyleOptionGraphicsItem */* ...@@ -79,10 +79,6 @@ void CodeMarkerItem::paint(QPainter *painter, const QStyleOptionGraphicsItem */*
if (mMainWindow->getCodeMarkerWidget()->showDetectedCandidates->isChecked()) if (mMainWindow->getCodeMarkerWidget()->showDetectedCandidates->isChecked())
{ {
QColor textColor = QColor(255,0,0), // red
cornerColor = QColor(0,0,255), // blue
borderColor = QColor(0,255,0); // green
int nMarkers = mCorners.size(); int nMarkers = mCorners.size();
int nRejected = mRejected.size(); int nRejected = mRejected.size();
...@@ -90,77 +86,14 @@ void CodeMarkerItem::paint(QPainter *painter, const QStyleOptionGraphicsItem */* ...@@ -90,77 +86,14 @@ void CodeMarkerItem::paint(QPainter *painter, const QStyleOptionGraphicsItem */*
Point2f p0, p1; Point2f p0, p1;
for(int i = 0; i < nMarkers; i++) // draws green square/ circle around head if person recognized for(int i = 0; i < nMarkers; i++) // draws green square/ circle around head if person recognized
{ {
int recoMethod = mMainWindow->getControlWidget()->getRecoMethod(); drawMarker(mCorners.at(i), mIds.at(i), mAcceptedColor, painter);
if (recoMethod == 6) // for usage of ArucoCodeMarker-Funktion (without MulticolorMarker)
{
vector<Point2f> currentMarker = mCorners.at(i);
// draw marker sides
for(int j = 0; j < 4; j++) {
p0 = currentMarker.at(j);
p1 = currentMarker.at((j + 1) % 4);
// debout << "p0: " << p0 << " p1: " << p1 << endl;
painter->setPen(borderColor);
painter->drawLine(QPointF(mUlc.x()+p0.x,mUlc.y()+p0.y),QPointF(mUlc.x()+p1.x,mUlc.y()+p1.y));
}
painter->setPen(cornerColor);
painter->drawText(QPointF(mUlc.x()+currentMarker.at(0).x+10.,mUlc.y()+currentMarker.at(0).y+10. ), QString::number(mIds.at(i)));
painter->drawRect(QRectF(mUlc.x()+currentMarker.at(0).x-3.0,mUlc.y()+currentMarker.at(0).y-3.0,6.0,6.0));
}
if (recoMethod == 5) // for usage of codemarker with MulticolorMarker
{
vector<Point2f> currentMarker = mCorners.at(i);
// draw marker sides
for(int j = 0; j < 4; j++) {
p0 = currentMarker.at(j);
p1 = currentMarker.at((j + 1) % 4);
// debout << "p0: " << p0 << " p1: " << p1 << endl;
painter->setPen(borderColor);
painter->drawLine(QPointF(mUlc.x()+p0.x+mOffsetCropRect2Roi.x(),mUlc.y()+p0.y+mOffsetCropRect2Roi.y()),QPointF(mUlc.x()+p1.x+mOffsetCropRect2Roi.x(),mUlc.y()+p1.y+mOffsetCropRect2Roi.y()));
}
painter->setPen(cornerColor);
painter->drawText(QPointF(mUlc.x()+currentMarker.at(0).x+mOffsetCropRect2Roi.x()+10.,mUlc.y()+currentMarker.at(0).y+mOffsetCropRect2Roi.y()+10. ), QString::number(mIds.at(i)));
painter->drawRect(QRectF(mUlc.x()+currentMarker.at(0).x+mOffsetCropRect2Roi.x()-3.0,mUlc.y()+currentMarker.at(0).y+mOffsetCropRect2Roi.y()-3.0,6.0,6.0));
}
} }
for(int i = 0; i < nRejected; i++) for(int i = 0; i < nRejected; i++)
{ {
int recoMethod = mMainWindow->getControlWidget()->getRecoMethod(); drawMarker(mRejected.at(i), -1, mRejectedColor, painter);
if (recoMethod == 6) // for usage of ArucoCodeMarker-Funktion (without MulticolorMarker)
{
vector<Point2f> currentMarker = mRejected.at(i);
for(int j = 0; j < 4; j++) {
p0 = currentMarker.at(j);
p1 = currentMarker.at((j + 1) % 4);
// debout << "p0: " << p0 << " p1: " << p1 << endl;
painter->setPen(textColor);
painter->drawLine(QPointF(mUlc.x()+p0.x,mUlc.y()+p0.y),QPointF(mUlc.x()+p1.x,mUlc.y()+p1.y));
}
painter->setPen(borderColor);
painter->drawRect(QRectF(mUlc.x()+currentMarker.at(0).x-3.0,mUlc.y()+currentMarker.at(0).y-3.0,6.0,6.0));
}
if (recoMethod == 5) // for usage of all types of detection (except combination of multicolormarker with arucoCode)
{
vector<Point2f> currentMarker = mRejected.at(i);
for(int j = 0; j < 4; j++) {
p0 = currentMarker.at(j);
p1 = currentMarker.at((j + 1) % 4);
// debout << "p0: " << p0 << " p1: " << p1 << endl;
painter->setPen(textColor);
painter->drawLine(QPointF(mUlc.x()+p0.x+mOffsetCropRect2Roi.x(),mUlc.y()+p0.y+mOffsetCropRect2Roi.y()),QPointF(mUlc.x()+p1.x+mOffsetCropRect2Roi.x(),mUlc.y()+p1.y+mOffsetCropRect2Roi.y()));
}
painter->setPen(borderColor);
painter->drawRect(QRectF(mUlc.x()+currentMarker.at(0).x+mOffsetCropRect2Roi.x()-3.0,mUlc.y()+currentMarker.at(0).y+mOffsetCropRect2Roi.y()-3.0,6.0,6.0));
}
} }
} }
if (false) // Show min/max marker size if (false) // Show min/max marker size
{ {
int minPerimeter = mMainWindow->getCodeMarkerWidget()->minMarkerPerimeter->value(); int minPerimeter = mMainWindow->getCodeMarkerWidget()->minMarkerPerimeter->value();
...@@ -196,26 +129,72 @@ void CodeMarkerItem::paint(QPainter *painter, const QStyleOptionGraphicsItem */* ...@@ -196,26 +129,72 @@ void CodeMarkerItem::paint(QPainter *painter, const QStyleOptionGraphicsItem */*
} }
void CodeMarkerItem::setDetectedMarkers(vector<vector<Point2f> > corners, vector<int> ids) /**
* @brief Draws a aruco code marker
*
* Draws a rect with the corners of the marker, the id, and the upper left corner.
*
* @param currentMarker marker to draw
* @param id id of the marker to draw
* @param borderColor color of the rect drawn
* @param painter painter with which to draw
*/
void CodeMarkerItem::drawMarker(const OffsetMarker& currentMarker, int id, const QColor& borderColor, QPainter *painter)
{ {
mCorners = corners; Vec2F offset = currentMarker.offset;
mIds = ids; // draw marker sides
for(int j = 0; j < numCorners; j++) {
Vec2F p0 = currentMarker.corners.at(j);
Vec2F p1 = currentMarker.corners.at((j + 1) % numCorners);
painter->setPen(borderColor);
painter->drawLine((mUlc + p0 + offset).toQPointF(), (mUlc + p1 + offset).toQPointF());
}
Vec2F topLeftCorner {currentMarker.corners.at(0)};
painter->setPen(mCornerColor);
if(id != -1) {
painter->drawText((mUlc + topLeftCorner + offset + Vec2F(10,10)).toQPointF(), QString::number(id));
}
painter->drawRect(QRectF((mUlc + topLeftCorner + offset - Vec2F(3,3)).toQPointF(), QSize(6.0,6.0)));
} }
void CodeMarkerItem::setRejectedMarkers(vector<vector<Point2f> > rejected) /**
* @brief Adds given markers as detected markers to visualization
*
* @pre ids[i] is the id of corners[i]
*
* @param corners corners of the markers
* @param ids ids of the detected markers
* @param offset offset from marker-coords to recognition ROI
*/
void CodeMarkerItem::addDetectedMarkers(vector<vector<Point2f> > corners, vector<int> ids, Vec2F offset /* = (0,0)*/)
{ {
mRejected = rejected; for(std::vector<Point2f> singleMarkerCorners : corners)
{
mCorners.emplace_back(singleMarkerCorners, offset);
}
mIds.insert(mIds.end(), ids.begin(), ids.end());
} }
/** /**
* @brief sets Offset from cropRect to Roi for correct drawing of CodeMarkers in paint() when calling findCodeMarker() out of findMulticolorMarker(). * @brief Adds given markers as rejected markers to visualization
* *
* Explanation: when calling findCodeMarker() out of findMultiColorMarker() the transfer parameter is not the entire image but rather a small rectangle (cropRect) around the detected colorBlobb. * @param rejected corners of the rejected markers
* Offset additions via 'offset' and 'v' only allow addition of ONE offset for all candidates per frame, as is originates from realising the offset from the entire image to the region of interest (ROI). * @param offset offset from marker-coords to recognition ROI
* offsetCropRect2Roi closes the resulting gap between ROI and cropRect (which is individuall for each pedestrian and frame). */
* @param offsetCropRect2Roi void CodeMarkerItem::addRejectedMarkers(vector<vector<Point2f> > rejected, Vec2F offset /* = (0,0)*/)
{
for(std::vector<Point2f> singleMarkerCorners : rejected)
{
mRejected.emplace_back(singleMarkerCorners, offset);
}
}
/**
* @brief Resets detected and rejected markers for visualization
*/ */
void CodeMarkerItem::setOffsetCropRect2Roi(Vec2F offsetCropRect2Roi) void CodeMarkerItem::resetSavedMarkers()
{ {
mOffsetCropRect2Roi = offsetCropRect2Roi; mCorners.clear();
mIds.clear();
mRejected.clear();
} }
...@@ -3560,6 +3560,8 @@ void Petrack::updateImage(bool imageChanged) // default = false (only true for n ...@@ -3560,6 +3560,8 @@ void Petrack::updateImage(bool imageChanged) // default = false (only true for n
debout << "go update: " << getElapsedTime() <<endl; debout << "go update: " << getElapsedTime() <<endl;
#endif #endif
mCodeMarkerItem->resetSavedMarkers();
static int lastRecoFrame = -10000; static int lastRecoFrame = -10000;
static bool borderChangedForTracking = false; static bool borderChangedForTracking = false;
......
...@@ -813,8 +813,6 @@ void findMultiColorMarker(Mat &img, QList<TrackPoint> *crossList, Control *contr ...@@ -813,8 +813,6 @@ void findMultiColorMarker(Mat &img, QList<TrackPoint> *crossList, Control *contr
{ {
offsetCropRect2Roi.setX(0); // set to zero as cooridinates are directly used from cropRect offsetCropRect2Roi.setX(0); // set to zero as cooridinates are directly used from cropRect
offsetCropRect2Roi.setY(0); offsetCropRect2Roi.setY(0);
CodeMarkerItem* codeMarkerItem = controlWidget->getMainWindow()->getCodeMarkerItem();
codeMarkerItem->setOffsetCropRect2Roi(offsetCropRect2Roi);
if (autoCorrect && !autoCorrectOnlyExport) if (autoCorrect && !autoCorrectOnlyExport)
{ {
...@@ -1100,7 +1098,7 @@ void findColorMarker(Mat &img, QList<TrackPoint> *crossList, Control *controlWid ...@@ -1100,7 +1098,7 @@ void findColorMarker(Mat &img, QList<TrackPoint> *crossList, Control *controlWid
* @param crossList[out] list of detected TrackPoints * @param crossList[out] list of detected TrackPoints
* @param controlWidget * @param controlWidget
*/ */
void findCodeMarker(Mat &img, QList<TrackPoint> *crossList, Control *controlWidget, Vec2F offsetCropRect2Roi) void findCodeMarker(Mat &img, QList<TrackPoint> *crossList, Control *controlWidget, Vec2F offsetCropRect2Roi /*=(0,0)*/)
{ {
//#if 0 // Maik temporaer, damit es auf dem Mac laeuft //#if 0 // Maik temporaer, damit es auf dem Mac laeuft
...@@ -1212,14 +1210,8 @@ void findCodeMarker(Mat &img, QList<TrackPoint> *crossList, Control *controlWidg ...@@ -1212,14 +1210,8 @@ void findCodeMarker(Mat &img, QList<TrackPoint> *crossList, Control *controlWidg
debout << "end detectCodeMarkers : " << getElapsedTime() <<endl; debout << "end detectCodeMarkers : " << getElapsedTime() <<endl;
#endif #endif
codeMarkerItem->addDetectedMarkers(corners,ids, offsetCropRect2Roi);
if (offsetCropRect2Roi.length()!=0) codeMarkerItem->addRejectedMarkers(rejected, offsetCropRect2Roi);
{
codeMarkerItem->setOffsetCropRect2Roi(offsetCropRect2Roi);
}
codeMarkerItem->setDetectedMarkers(corners,ids);
codeMarkerItem->setRejectedMarkers(rejected);
// detected code markers // detected code markers
for(size_t i = 0; i<ids.size(); i++) for(size_t i = 0; i<ids.size(); i++)
......
...@@ -238,6 +238,13 @@ Vec2F::Vec2F(const QPointF& v) ...@@ -238,6 +238,13 @@ Vec2F::Vec2F(const QPointF& v)
mY(v.y()) mY(v.y())
{ {
} }
Vec2F::Vec2F(const cv::Point2f &p)
: mX(p.x),
mY(p.y)
{
}
Vec2F::Vec2F(const CvPoint* v) Vec2F::Vec2F(const CvPoint* v)
: mX(v->x), : mX(v->x),
mY(v->y) mY(v->y)
......