Commit a50d515a8c15222376909c1a76e9d16b3a318bdf

Authored by Josh Klontz
1 parent 800affe8

remove procustes

openbr/plugins/metadata/procrustes.cpp deleted
1   -/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
2   - * Copyright 2012 The MITRE Corporation *
3   - * *
4   - * Licensed under the Apache License, Version 2.0 (the "License"); *
5   - * you may not use this file except in compliance with the License. *
6   - * You may obtain a copy of the License at *
7   - * *
8   - * http://www.apache.org/licenses/LICENSE-2.0 *
9   - * *
10   - * Unless required by applicable law or agreed to in writing, software *
11   - * distributed under the License is distributed on an "AS IS" BASIS, *
12   - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. *
13   - * See the License for the specific language governing permissions and *
14   - * limitations under the License. *
15   - * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
16   -
17   -#include <Eigen/Dense>
18   -
19   -#include <openbr/plugins/openbr_internal.h>
20   -#include <openbr/core/opencvutils.h>
21   -#include <openbr/core/eigenutils.h>
22   -
23   -using namespace cv;
24   -
25   -namespace br
26   -{
27   -
28   -/*!
29   - * \ingroup transforms
30   - * \brief Procrustes alignment of points
31   - * \author Scott Klum \cite sklum
32   - */
33   -class ProcrustesTransform : public MetadataTransform
34   -{
35   - Q_OBJECT
36   -
37   - Q_PROPERTY(bool warp READ get_warp WRITE set_warp RESET reset_warp STORED false)
38   - BR_PROPERTY(bool, warp, true)
39   -
40   - Eigen::MatrixXf meanShape;
41   -
42   - void train(const TemplateList &data)
43   - {
44   - QList< QList<QPointF> > normalizedPoints;
45   -
46   - // Normalize all sets of points
47   - foreach (br::Template datum, data) {
48   - QList<QPointF> points = datum.file.points();
49   - QList<QRectF> rects = datum.file.rects();
50   -
51   - if (points.empty() || rects.empty()) continue;
52   -
53   - // Assume rect appended last was bounding box
54   - points.append(rects.last().topLeft());
55   - points.append(rects.last().topRight());
56   - points.append(rects.last().bottomLeft());
57   - points.append(rects.last().bottomRight());
58   -
59   - // Center shape at origin
60   - Scalar mean = cv::mean(OpenCVUtils::toPoints(points).toVector().toStdVector());
61   - for (int i = 0; i < points.size(); i++) points[i] -= QPointF(mean[0],mean[1]);
62   -
63   - // Remove scale component
64   - float norm = cv::norm(OpenCVUtils::toPoints(points).toVector().toStdVector());
65   - for (int i = 0; i < points.size(); i++) points[i] /= norm;
66   -
67   - normalizedPoints.append(points);
68   - }
69   -
70   - if (normalizedPoints.empty()) qFatal("Unable to calculate normalized points");
71   -
72   - // Determine mean shape, assuming all shapes contain the same number of points
73   - meanShape = Eigen::MatrixXf(normalizedPoints[0].size(), 2);
74   -
75   - for (int i = 0; i < normalizedPoints[0].size(); i++) {
76   - double x = 0;
77   - double y = 0;
78   -
79   - for (int j = 0; j < normalizedPoints.size(); j++) {
80   - x += normalizedPoints[j][i].x();
81   - y += normalizedPoints[j][i].y();
82   - }
83   -
84   - x /= (double)normalizedPoints.size();
85   - y /= (double)normalizedPoints.size();
86   -
87   - meanShape(i,0) = x;
88   - meanShape(i,1) = y;
89   - }
90   - }
91   -
92   - void projectMetadata(const File &src, File &dst) const
93   - {
94   - QList<QPointF> points = src.points();
95   - QList<QRectF> rects = src.rects();
96   -
97   - if (points.empty() || rects.empty()) {
98   - dst = src;
99   - if (Globals->verbose) qWarning("Procrustes alignment failed because points or rects are empty.");
100   - return;
101   - }
102   -
103   - // Assume rect appended last was bounding box
104   - points.append(rects.last().topLeft());
105   - points.append(rects.last().topRight());
106   - points.append(rects.last().bottomLeft());
107   - points.append(rects.last().bottomRight());
108   -
109   - Scalar mean = cv::mean(OpenCVUtils::toPoints(points).toVector().toStdVector());
110   - for (int i = 0; i < points.size(); i++) points[i] -= QPointF(mean[0],mean[1]);
111   -
112   - Eigen::MatrixXf srcMat(points.size(), 2);
113   - float norm = cv::norm(OpenCVUtils::toPoints(points).toVector().toStdVector());
114   - for (int i = 0; i < points.size(); i++) {
115   - points[i] /= norm;
116   - srcMat(i,0) = points[i].x();
117   - srcMat(i,1) = points[i].y();
118   - }
119   -
120   - Eigen::JacobiSVD<Eigen::MatrixXf> svd(srcMat.transpose()*meanShape, Eigen::ComputeThinU | Eigen::ComputeThinV);
121   - Eigen::MatrixXf R = svd.matrixU()*svd.matrixV().transpose();
122   -
123   - dst = src;
124   -
125   - // Store procrustes stats in the order:
126   - // R(0,0), R(1,0), R(1,1), R(0,1), mean_x, mean_y, norm
127   - QList<float> procrustesStats;
128   - procrustesStats << R(0,0) << R(1,0) << R(1,1) << R(0,1) << mean[0] << mean[1] << norm;
129   - dst.setList<float>("ProcrustesStats",procrustesStats);
130   -
131   - if (warp) {
132   - Eigen::MatrixXf dstMat = srcMat*R;
133   - for (int i = 0; i < dstMat.rows(); i++) {
134   - dst.appendPoint(QPointF(dstMat(i,0),dstMat(i,1)));
135   - }
136   - }
137   - }
138   -
139   - void store(QDataStream &stream) const
140   - {
141   - stream << meanShape;
142   - }
143   -
144   - void load(QDataStream &stream)
145   - {
146   - stream >> meanShape;
147   - }
148   -
149   -};
150   -
151   -BR_REGISTER(Transform, ProcrustesTransform)
152   -
153   -} // namespace br
154   -
155   -#include "metadata/procrustes.moc"