Commit 6c78c5ee2f266f2f632b27f8d220407418534417

Authored by Josh Klontz
1 parent 59e268e5

removed meanshift

openbr/plugins/cluster/meanshift.cpp deleted
1 -#include <openbr/plugins/openbr_internal.h>  
2 -#include <openbr/core/opencvutils.h>  
3 -  
4 -using namespace cv;  
5 -  
6 -namespace br  
7 -{  
8 -  
9 -/*!  
10 - * \brief A transform implementing the mean shift clustering algorithm.  
11 - * \author Jordan Cheney \cite JordanCheney  
12 - * \br_property br::Distance* distance The distance used to compute the distance between templates  
13 - * \br_property int kernelBandwidth The size of the kernel used to converge points to a cluster center  
14 - * \br_property float shiftThreshold The cutoff threshold distance for a shifted point. A value lower then this threshold indicates a point has finished shifting to a cluster center.  
15 - * \br_property float distanceThreshold The distance threshold for a point to join a cluster. A point must be at least this close to another point to be included in the same cluster as that point.  
16 - * \br_link http://spin.atomicobject.com/2015/05/26/mean-shift-clustering/  
17 - */  
18 -class MeanShiftClusteringTransform : public TimeVaryingTransform  
19 -{  
20 - Q_OBJECT  
21 -  
22 - Q_PROPERTY(br::Distance* distance READ get_distance WRITE set_distance RESET reset_distance STORED false)  
23 - Q_PROPERTY(int kernelBandwidth READ get_kernelBandwidth WRITE set_kernelBandwidth RESET reset_kernelBandwidth STORED false)  
24 - Q_PROPERTY(float shiftThreshold READ get_shiftThreshold WRITE set_shiftThreshold RESET reset_shiftThreshold STORED false)  
25 - Q_PROPERTY(float distanceThreshold READ get_distanceThreshold WRITE set_distanceThreshold RESET reset_distanceThreshold STORED false)  
26 - BR_PROPERTY(br::Distance*, distance, Distance::make(".Dist(L2, false)", NULL))  
27 - BR_PROPERTY(int, kernelBandwidth, 3)  
28 - BR_PROPERTY(float, shiftThreshold, 1e-3)  
29 - BR_PROPERTY(float, distanceThreshold, 1e-1)  
30 -  
31 -public:  
32 - MeanShiftClusteringTransform() : TimeVaryingTransform(false, false) {}  
33 -  
34 -private:  
35 - void projectUpdate(const TemplateList &src, TemplateList &)  
36 - {  
37 - templates.append(src);  
38 - }  
39 -  
40 - void finalize(TemplateList &output)  
41 - {  
42 - output.clear();  
43 -  
44 - QList<Mat> original_points, shifted_points;  
45 - original_points = shifted_points = templates.data();  
46 -  
47 - Mat shift_mask = Mat::zeros(1, shifted_points.size(), CV_32S);  
48 - while (countNonZero(shift_mask) != shifted_points.size()) {  
49 - for (int i = 0; i < shifted_points.size(); i++) {  
50 - if (shift_mask.at<int>(0, i))  
51 - continue;  
52 -  
53 - Mat point = shifted_points[i];  
54 - Mat shifted_point = point.clone();  
55 - meanshift(shifted_point, original_points);  
56 -  
57 - float dist = distance->compare(point, shifted_point);  
58 - if (dist < shiftThreshold)  
59 - shift_mask.at<int>(0, i) = 1;  
60 -  
61 - shifted_points[i] = shifted_point;  
62 - }  
63 - }  
64 -  
65 - QList<int> clusters = assignClusterID(shifted_points);  
66 - for (int i = 0; i < templates.size(); i++)  
67 - templates[i].file.set("Cluster", clusters[i]);  
68 - output.append(templates);  
69 - }  
70 -  
71 - void meanshift(Mat &point, const QList<Mat> &original_points)  
72 - {  
73 - Mat distances(1, original_points.size(), CV_32FC1);  
74 - for (int i = 0; i < original_points.size(); i++)  
75 - distances.at<float>(0, i) = distance->compare(point, original_points[i]);  
76 -  
77 - Mat weights = gaussianKernel(distances, kernelBandwidth);  
78 - point = (weights * OpenCVUtils::toMat(original_points)) / sum(weights)[0];  
79 - }  
80 -  
81 - inline Mat gaussianKernel(const Mat &distance, const float bandwidth)  
82 - {  
83 - Mat p, e;  
84 - pow(distance / bandwidth, 2, p);  
85 - exp(-0.5 * p, e);  
86 -  
87 - return (1.0 / (bandwidth * sqrt(2 * CV_PI))) * e;  
88 - }  
89 -  
90 - QList<int> assignClusterID(const QList<Mat> &points)  
91 - {  
92 - QList<int> groups;  
93 - int newGroupIdx = 0;  
94 - foreach (const Mat &point, points) {  
95 - int group = nearestGroup(point, points, groups);  
96 - if (group < 0)  
97 - group = newGroupIdx++;  
98 - groups.append(group);  
99 - }  
100 -  
101 - if (Globals->verbose)  
102 - qDebug("created %d clusters from %d templates", newGroupIdx, points.size());  
103 -  
104 - return groups;  
105 - }  
106 -  
107 - int nearestGroup(const Mat &point, const QList<Mat> &points, const QList<int> groups)  
108 - {  
109 - for (int i = 0; i < groups.size(); i++) {  
110 - float dist = distance->compare(point, points[i]);  
111 - if (dist < distanceThreshold)  
112 - return groups[i];  
113 - }  
114 - return -1;  
115 - }  
116 -  
117 - TemplateList templates;  
118 -};  
119 -  
120 -BR_REGISTER(Transform, MeanShiftClusteringTransform)  
121 -  
122 -} // namespace br  
123 -  
124 -#include "cluster/meanshift.moc"