From f0af46eb7701552ebc8e46c994a5e1826b99670f Mon Sep 17 00:00:00 2001 From: Brendan Klare Date: Wed, 22 Jan 2014 17:27:05 -0500 Subject: [PATCH] Various helper functions --- openbr/core/eigenutils.cpp | 9 +++++++++ openbr/core/eigenutils.h | 1 + openbr/core/opencvutils.cpp | 24 ++++++++++++++++++++++++ openbr/core/opencvutils.h | 2 ++ openbr/plugins/template.cpp | 39 +++++++++++++++++++++++++++++++++++++++ 5 files changed, 75 insertions(+), 0 deletions(-) diff --git a/openbr/core/eigenutils.cpp b/openbr/core/eigenutils.cpp index 4e1d939..df21a86 100644 --- a/openbr/core/eigenutils.cpp +++ b/openbr/core/eigenutils.cpp @@ -36,6 +36,15 @@ void writeEigen(VectorXd X, QString filename) { format->write(br::Template(m)); } +void writeEigen(VectorXf X, QString filename) { + Mat m(X.size(),1,CV_32FC1); + for (int i = 0; i < X.rows(); i++) { + m.at(i,0) = X(i); + } + QScopedPointer format(br::Factory::make(filename)); + format->write(br::Template(m)); +} + void printEigen(Eigen::MatrixXd X) { for (int i = 0; i < X.rows(); i++) { QString str; diff --git a/openbr/core/eigenutils.h b/openbr/core/eigenutils.h index 5d4ab62..89e36c0 100644 --- a/openbr/core/eigenutils.h +++ b/openbr/core/eigenutils.h @@ -24,6 +24,7 @@ void writeEigen(Eigen::MatrixXf X, QString filename); void writeEigen(Eigen::MatrixXd X, QString filename); void writeEigen(Eigen::VectorXd X, QString filename); +void writeEigen(Eigen::VectorXf X, QString filename); void printEigen(Eigen::MatrixXd X); template diff --git a/openbr/core/opencvutils.cpp b/openbr/core/opencvutils.cpp index 48e08e8..ebef768 100644 --- a/openbr/core/opencvutils.cpp +++ b/openbr/core/opencvutils.cpp @@ -300,6 +300,30 @@ QList OpenCVUtils::fromRects(const QList &cvRects) return qRects; } +float OpenCVUtils::overlap(const Rect &rect1, const Rect &rect2) { + float left = max(rect1.x, rect2.x); + float top = max(rect1.y, rect2.y); + float right = min(rect1.x + rect1.width, rect2.x + rect2.width); + float bottom = min(rect1.y + rect1.height, rect2.y + rect2.height); + + float overlap = (right - left + 1) * (top - bottom + 1) / max(rect1.width * rect1.height, rect2.width * rect2.height); + if (overlap < 0) + return 0; + return overlap; +} + +float OpenCVUtils::overlap(const QRectF &rect1, const QRectF &rect2) { + float left = max(rect1.x(), rect2.x()); + float top = max(rect1.y(), rect2.y()); + float right = min(rect1.x() + rect1.width(), rect2.x() + rect2.width()); + float bottom = min(rect1.y() + rect1.height(), rect2.y() + rect2.height()); + + float overlap = (right - left + 1) * (top - bottom + 1) / max(rect1.width() * rect1.height(), rect2.width() * rect2.height()); + if (overlap < 0) + return 0; + return overlap; +} + bool OpenCVUtils::overlaps(const QList &posRects, const Rect &negRect, double overlap) { foreach (const Rect &posRect, posRects) { diff --git a/openbr/core/opencvutils.h b/openbr/core/opencvutils.h index 283aada..2d7cd68 100644 --- a/openbr/core/opencvutils.h +++ b/openbr/core/opencvutils.h @@ -88,6 +88,8 @@ namespace OpenCVUtils QList toRects(const QList &qRects); QList fromRects(const QList &cvRects); bool overlaps(const QList &posRects, const cv::Rect &negRect, double overlap); + float overlap(const cv::Rect &rect1, const cv::Rect &rect2); + float overlap(const QRectF &rect1, const QRectF &rect2); int getFourcc(); } diff --git a/openbr/plugins/template.cpp b/openbr/plugins/template.cpp index fdffab5..acfde7b 100644 --- a/openbr/plugins/template.cpp +++ b/openbr/plugins/template.cpp @@ -70,6 +70,45 @@ class RemoveMetadataTransform : public UntrainableTransform }; BR_REGISTER(Transform, RemoveMetadataTransform) +/*! + * \ingroup transforms + * \brief Retains only landmarks/points at the provided indices + * \author Brendan Klare \cite bklare + */ +class SelectPointsTransform : public UntrainableTransform +{ + Q_OBJECT + Q_PROPERTY(QList indices READ get_indices WRITE set_indices RESET reset_indices STORED false) + BR_PROPERTY(QList, indices, QList()) + + void project(const Template &src, Template &dst) const + { + dst = src; + QList origPoints = src.file.points(); + dst.file.clearPoints(); + for (int i = 0; i < indices.size(); i++) + dst.file.appendPoint(origPoints[indices[i]]); + } +}; + +BR_REGISTER(Transform, SelectPointsTransform) + +/*! + * \ingroup transforms + * \brief Does nothing. + */ +class NoneTransform : public UntrainableMetaTransform +{ + Q_OBJECT + + void project(const Template &src, Template &dst) const + { + dst = src; + } +}; + +BR_REGISTER(Transform, NoneTransform) + } // namespace br #include "template.moc" -- libgit2 0.21.4