Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
Greenplum
Opencv
提交
6a5a0fe8
O
Opencv
项目概览
Greenplum
/
Opencv
11 个月 前同步成功
通知
7
Star
0
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
DevOps
流水线
流水线任务
计划
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
O
Opencv
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
DevOps
DevOps
流水线
流水线任务
计划
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
流水线任务
提交
Issue看板
体验新版 GitCode,发现更多精彩内容 >>
提交
6a5a0fe8
编写于
4月 15, 2014
作者:
V
Vadim Pisarevsky
提交者:
OpenCV Buildbot
4月 15, 2014
浏览文件
操作
浏览文件
下载
差异文件
Merge pull request #2016 from pemmanuelviel:kmeansppSquareDist
上级
df8e2828
0d19685f
变更
3
隐藏空白更改
内联
并排
Showing
3 changed file
with
80 addition
and
4 deletion
+80
-4
modules/flann/include/opencv2/flann/dist.h
modules/flann/include/opencv2/flann/dist.h
+60
-0
modules/flann/include/opencv2/flann/hierarchical_clustering_index.h
...ann/include/opencv2/flann/hierarchical_clustering_index.h
+11
-2
modules/flann/include/opencv2/flann/kmeans_index.h
modules/flann/include/opencv2/flann/kmeans_index.h
+9
-2
未找到文件。
modules/flann/include/opencv2/flann/dist.h
浏览文件 @
6a5a0fe8
...
...
@@ -812,6 +812,66 @@ struct ZeroIterator
};
/*
* Depending on processed distances, some of them are already squared (e.g. L2)
* and some are not (e.g.Hamming). In KMeans++ for instance we want to be sure
* we are working on ^2 distances, thus following templates to ensure that.
*/
template
<
typename
Distance
,
typename
ElementType
>
struct
squareDistance
{
typedef
typename
Distance
::
ResultType
ResultType
;
ResultType
operator
()(
ResultType
dist
)
{
return
dist
*
dist
;
}
};
template
<
typename
ElementType
>
struct
squareDistance
<
L2_Simple
<
ElementType
>
,
ElementType
>
{
typedef
typename
L2_Simple
<
ElementType
>::
ResultType
ResultType
;
ResultType
operator
()(
ResultType
dist
)
{
return
dist
;
}
};
template
<
typename
ElementType
>
struct
squareDistance
<
L2
<
ElementType
>
,
ElementType
>
{
typedef
typename
L2
<
ElementType
>::
ResultType
ResultType
;
ResultType
operator
()(
ResultType
dist
)
{
return
dist
;
}
};
template
<
typename
ElementType
>
struct
squareDistance
<
MinkowskiDistance
<
ElementType
>
,
ElementType
>
{
typedef
typename
MinkowskiDistance
<
ElementType
>::
ResultType
ResultType
;
ResultType
operator
()(
ResultType
dist
)
{
return
dist
;
}
};
template
<
typename
ElementType
>
struct
squareDistance
<
HellingerDistance
<
ElementType
>
,
ElementType
>
{
typedef
typename
HellingerDistance
<
ElementType
>::
ResultType
ResultType
;
ResultType
operator
()(
ResultType
dist
)
{
return
dist
;
}
};
template
<
typename
ElementType
>
struct
squareDistance
<
ChiSquareDistance
<
ElementType
>
,
ElementType
>
{
typedef
typename
ChiSquareDistance
<
ElementType
>::
ResultType
ResultType
;
ResultType
operator
()(
ResultType
dist
)
{
return
dist
;
}
};
template
<
typename
Distance
>
typename
Distance
::
ResultType
ensureSquareDistance
(
typename
Distance
::
ResultType
dist
)
{
typedef
typename
Distance
::
ElementType
ElementType
;
squareDistance
<
Distance
,
ElementType
>
dummy
;
return
dummy
(
dist
);
}
}
#endif //OPENCV_FLANN_DIST_H_
modules/flann/include/opencv2/flann/hierarchical_clustering_index.h
浏览文件 @
6a5a0fe8
...
...
@@ -210,8 +210,11 @@ private:
assert
(
index
>=
0
&&
index
<
n
);
centers
[
0
]
=
dsindices
[
index
];
// Computing distance^2 will have the advantage of even higher probability further to pick new centers
// far from previous centers (and this complies to "k-means++: the advantages of careful seeding" article)
for
(
int
i
=
0
;
i
<
n
;
i
++
)
{
closestDistSq
[
i
]
=
distance
(
dataset
[
dsindices
[
i
]],
dataset
[
dsindices
[
index
]],
dataset
.
cols
);
closestDistSq
[
i
]
=
ensureSquareDistance
<
Distance
>
(
closestDistSq
[
i
]
);
currentPot
+=
closestDistSq
[
i
];
}
...
...
@@ -237,7 +240,10 @@ private:
// Compute the new potential
double
newPot
=
0
;
for
(
int
i
=
0
;
i
<
n
;
i
++
)
newPot
+=
std
::
min
(
distance
(
dataset
[
dsindices
[
i
]],
dataset
[
dsindices
[
index
]],
dataset
.
cols
),
closestDistSq
[
i
]
);
for
(
int
i
=
0
;
i
<
n
;
i
++
)
{
DistanceType
dist
=
distance
(
dataset
[
dsindices
[
i
]],
dataset
[
dsindices
[
index
]],
dataset
.
cols
);
newPot
+=
std
::
min
(
ensureSquareDistance
<
Distance
>
(
dist
),
closestDistSq
[
i
]
);
}
// Store the best result
if
((
bestNewPot
<
0
)
||
(
newPot
<
bestNewPot
))
{
...
...
@@ -249,7 +255,10 @@ private:
// Add the appropriate center
centers
[
centerCount
]
=
dsindices
[
bestNewIndex
];
currentPot
=
bestNewPot
;
for
(
int
i
=
0
;
i
<
n
;
i
++
)
closestDistSq
[
i
]
=
std
::
min
(
distance
(
dataset
[
dsindices
[
i
]],
dataset
[
dsindices
[
bestNewIndex
]],
dataset
.
cols
),
closestDistSq
[
i
]
);
for
(
int
i
=
0
;
i
<
n
;
i
++
)
{
DistanceType
dist
=
distance
(
dataset
[
dsindices
[
i
]],
dataset
[
dsindices
[
bestNewIndex
]],
dataset
.
cols
);
closestDistSq
[
i
]
=
std
::
min
(
ensureSquareDistance
<
Distance
>
(
dist
),
closestDistSq
[
i
]
);
}
}
centers_length
=
centerCount
;
...
...
modules/flann/include/opencv2/flann/kmeans_index.h
浏览文件 @
6a5a0fe8
...
...
@@ -211,6 +211,7 @@ public:
for
(
int
i
=
0
;
i
<
n
;
i
++
)
{
closestDistSq
[
i
]
=
distance_
(
dataset_
[
indices
[
i
]],
dataset_
[
indices
[
index
]],
dataset_
.
cols
);
closestDistSq
[
i
]
=
ensureSquareDistance
<
Distance
>
(
closestDistSq
[
i
]
);
currentPot
+=
closestDistSq
[
i
];
}
...
...
@@ -236,7 +237,10 @@ public:
// Compute the new potential
double
newPot
=
0
;
for
(
int
i
=
0
;
i
<
n
;
i
++
)
newPot
+=
std
::
min
(
distance_
(
dataset_
[
indices
[
i
]],
dataset_
[
indices
[
index
]],
dataset_
.
cols
),
closestDistSq
[
i
]
);
for
(
int
i
=
0
;
i
<
n
;
i
++
)
{
DistanceType
dist
=
distance_
(
dataset_
[
indices
[
i
]],
dataset_
[
indices
[
index
]],
dataset_
.
cols
);
newPot
+=
std
::
min
(
ensureSquareDistance
<
Distance
>
(
dist
),
closestDistSq
[
i
]
);
}
// Store the best result
if
((
bestNewPot
<
0
)
||
(
newPot
<
bestNewPot
))
{
...
...
@@ -248,7 +252,10 @@ public:
// Add the appropriate center
centers
[
centerCount
]
=
indices
[
bestNewIndex
];
currentPot
=
bestNewPot
;
for
(
int
i
=
0
;
i
<
n
;
i
++
)
closestDistSq
[
i
]
=
std
::
min
(
distance_
(
dataset_
[
indices
[
i
]],
dataset_
[
indices
[
bestNewIndex
]],
dataset_
.
cols
),
closestDistSq
[
i
]
);
for
(
int
i
=
0
;
i
<
n
;
i
++
)
{
DistanceType
dist
=
distance_
(
dataset_
[
indices
[
i
]],
dataset_
[
indices
[
bestNewIndex
]],
dataset_
.
cols
);
closestDistSq
[
i
]
=
std
::
min
(
ensureSquareDistance
<
Distance
>
(
dist
),
closestDistSq
[
i
]
);
}
}
centers_length
=
centerCount
;
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录