From a50d515a8c15222376909c1a76e9d16b3a318bdf Mon Sep 17 00:00:00 2001 From: Josh Klontz Date: Tue, 31 Aug 2021 18:04:35 -0600 Subject: [PATCH] remove procustes --- openbr/plugins/metadata/procrustes.cpp | 155 ----------------------------------------------------------------------------------------------------------------------------------------------------------- 1 file changed, 0 insertions(+), 155 deletions(-) delete mode 100644 openbr/plugins/metadata/procrustes.cpp diff --git a/openbr/plugins/metadata/procrustes.cpp b/openbr/plugins/metadata/procrustes.cpp deleted file mode 100644 index 57a1051..0000000 --- a/openbr/plugins/metadata/procrustes.cpp +++ /dev/null @@ -1,155 +0,0 @@ -/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * - * Copyright 2012 The MITRE Corporation * - * * - * Licensed under the Apache License, Version 2.0 (the "License"); * - * you may not use this file except in compliance with the License. * - * You may obtain a copy of the License at * - * * - * http://www.apache.org/licenses/LICENSE-2.0 * - * * - * Unless required by applicable law or agreed to in writing, software * - * distributed under the License is distributed on an "AS IS" BASIS, * - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * - * See the License for the specific language governing permissions and * - * limitations under the License. * - * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ - -#include - -#include -#include -#include - -using namespace cv; - -namespace br -{ - -/*! - * \ingroup transforms - * \brief Procrustes alignment of points - * \author Scott Klum \cite sklum - */ -class ProcrustesTransform : public MetadataTransform -{ - Q_OBJECT - - Q_PROPERTY(bool warp READ get_warp WRITE set_warp RESET reset_warp STORED false) - BR_PROPERTY(bool, warp, true) - - Eigen::MatrixXf meanShape; - - void train(const TemplateList &data) - { - QList< QList > normalizedPoints; - - // Normalize all sets of points - foreach (br::Template datum, data) { - QList points = datum.file.points(); - QList rects = datum.file.rects(); - - if (points.empty() || rects.empty()) continue; - - // Assume rect appended last was bounding box - points.append(rects.last().topLeft()); - points.append(rects.last().topRight()); - points.append(rects.last().bottomLeft()); - points.append(rects.last().bottomRight()); - - // Center shape at origin - Scalar mean = cv::mean(OpenCVUtils::toPoints(points).toVector().toStdVector()); - for (int i = 0; i < points.size(); i++) points[i] -= QPointF(mean[0],mean[1]); - - // Remove scale component - float norm = cv::norm(OpenCVUtils::toPoints(points).toVector().toStdVector()); - for (int i = 0; i < points.size(); i++) points[i] /= norm; - - normalizedPoints.append(points); - } - - if (normalizedPoints.empty()) qFatal("Unable to calculate normalized points"); - - // Determine mean shape, assuming all shapes contain the same number of points - meanShape = Eigen::MatrixXf(normalizedPoints[0].size(), 2); - - for (int i = 0; i < normalizedPoints[0].size(); i++) { - double x = 0; - double y = 0; - - for (int j = 0; j < normalizedPoints.size(); j++) { - x += normalizedPoints[j][i].x(); - y += normalizedPoints[j][i].y(); - } - - x /= (double)normalizedPoints.size(); - y /= (double)normalizedPoints.size(); - - meanShape(i,0) = x; - meanShape(i,1) = y; - } - } - - void projectMetadata(const File &src, File &dst) const - { - QList points = src.points(); - QList rects = src.rects(); - - if (points.empty() || rects.empty()) { - dst = src; - if (Globals->verbose) qWarning("Procrustes alignment failed because points or rects are empty."); - return; - } - - // Assume rect appended last was bounding box - points.append(rects.last().topLeft()); - points.append(rects.last().topRight()); - points.append(rects.last().bottomLeft()); - points.append(rects.last().bottomRight()); - - Scalar mean = cv::mean(OpenCVUtils::toPoints(points).toVector().toStdVector()); - for (int i = 0; i < points.size(); i++) points[i] -= QPointF(mean[0],mean[1]); - - Eigen::MatrixXf srcMat(points.size(), 2); - float norm = cv::norm(OpenCVUtils::toPoints(points).toVector().toStdVector()); - for (int i = 0; i < points.size(); i++) { - points[i] /= norm; - srcMat(i,0) = points[i].x(); - srcMat(i,1) = points[i].y(); - } - - Eigen::JacobiSVD svd(srcMat.transpose()*meanShape, Eigen::ComputeThinU | Eigen::ComputeThinV); - Eigen::MatrixXf R = svd.matrixU()*svd.matrixV().transpose(); - - dst = src; - - // Store procrustes stats in the order: - // R(0,0), R(1,0), R(1,1), R(0,1), mean_x, mean_y, norm - QList procrustesStats; - procrustesStats << R(0,0) << R(1,0) << R(1,1) << R(0,1) << mean[0] << mean[1] << norm; - dst.setList("ProcrustesStats",procrustesStats); - - if (warp) { - Eigen::MatrixXf dstMat = srcMat*R; - for (int i = 0; i < dstMat.rows(); i++) { - dst.appendPoint(QPointF(dstMat(i,0),dstMat(i,1))); - } - } - } - - void store(QDataStream &stream) const - { - stream << meanShape; - } - - void load(QDataStream &stream) - { - stream >> meanShape; - } - -}; - -BR_REGISTER(Transform, ProcrustesTransform) - -} // namespace br - -#include "metadata/procrustes.moc" -- libgit2 0.21.4