From a783d67e08b576676d5b4f616df06a8578531ae8 Mon Sep 17 00:00:00 2001 From: bhklein Date: Wed, 16 Sep 2015 23:19:56 -0400 Subject: [PATCH] IPD metadataTransform --- openbr/plugins/metadata/ipd.cpp | 63 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 63 insertions(+), 0 deletions(-) create mode 100644 openbr/plugins/metadata/ipd.cpp diff --git a/openbr/plugins/metadata/ipd.cpp b/openbr/plugins/metadata/ipd.cpp new file mode 100644 index 0000000..797900e --- /dev/null +++ b/openbr/plugins/metadata/ipd.cpp @@ -0,0 +1,63 @@ +#include +#include + +namespace br +{ + +/*! + * \ingroup transforms + * \brief Calculate interpupillary distance or the distance between two arbitrary points. + * \author Ben Klein \cite bhklein + * \br_property bool named Are the points named? + * \br_property QString firstEye First point's metadata key. + * \br_property QString secondEye Second point's metadata key. + * \br_property QString key Metadata key for distance. + * \br_property QList indices Indices of points in metadata if not named. + */ +class IPDTransform : public UntrainableMetadataTransform +{ + Q_OBJECT + + + Q_PROPERTY(bool named READ get_named WRITE set_named RESET reset_named STORED false) + Q_PROPERTY(QString firstEye READ get_firstEye WRITE set_firstEye RESET reset_firstEye STORED false) + Q_PROPERTY(QString secondEye READ get_secondEye WRITE set_secondEye RESET reset_secondEye STORED false) + Q_PROPERTY(QString key READ get_key WRITE set_key RESET reset_key STORED false) + Q_PROPERTY(QList indices READ get_indices WRITE set_indices RESET reset_indices STORED false) + BR_PROPERTY(bool, named, true) + BR_PROPERTY(QString, firstEye, "First_Eye") + BR_PROPERTY(QString, secondEye, "Second_Eye") + BR_PROPERTY(QString, key, "IPD") + BR_PROPERTY(QList, indices, QList()) + + void projectMetadata(const File &src, File &dst) const + { + dst = src; + if (!indices.empty()) { + if (indices.size() != 2) { + qDebug() << "Indices must be of length 2 to calculate IPD!"; + return; + } + + QPointF first = src.points()[indices[0]]; + QPointF second = src.points()[indices[1]]; + float distX = second.x() - first.x(); + float distY = second.y() - first.y(); + float distance = std::sqrt(distX*distX + distY*distY); + dst.set(key, distance); + } else { + QPointF first = src.get(firstEye, QPointF()); + QPointF second = src.get(secondEye, QPointF()); + float distX = second.x() - first.x(); + float distY = second.y() - first.y(); + float distance = std::sqrt(distX*distX + distY*distY); + dst.set(key, distance); + } + } +}; + +BR_REGISTER(Transform, IPDTransform) + +} // namespace br + +#include "metadata/ipd.moc" -- libgit2 0.21.4