我知道如何找到数据类型的最高值,例如int
,float
,double
等。但在这里,我正在使用x
,{ {1}},& y
使用z
进行坐标。那么有人可以帮助Point3f
x
y
找到z
,std::vector
或std::vector
的最高值吗?
std::vector< std::vector<Point3f> > cluster_points;
为简单起见,我想说只想找到x
轴中的最高值。
答案 0 :(得分:2)
我不知道opencv,所以可以采用更简单的解决方案,但......
几个具有几个lambda函数的std::for_each()
呢?
std::vector<std::vector<Point3f>> vvp { /* some data */ };
auto mx = vvp[0][0].x;
auto my = vvp[0][0].y;
auto mz = vvp[0][0].z;
std::for_each(vvp.cbegin(), vvp.cend(),
[&](std::vector<Point3f> const & vp)
{ std::for_each(vp.cbegin(), vp.cend(),
[&](Point3f const & p)
{ mx = std::max(mx, p.x);
my = std::max(my, p.y);
mz = std::max(mz, p.z); }); });
如果你可以使用C ++ 14,那么lambda函数带有auto
个参数,双std::for_each()
部分可以简单地写成
std::for_each(vvp.cbegin(), vvp.cend(), [&](auto const & vp)
{ std::for_each(vp.cbegin(), vp.cend(), [&](auto const & p)
{ mx = std::max(mx, p.x);
my = std::max(my, p.y);
mz = std::max(mz, p.z); }); });
所以没有明确Poinf3f
并且可以被其他类似3d的类型使用。
答案 1 :(得分:1)
这是C ++ 14。
这是一个在客户端代码中没有显式循环的解决方案。
template<class F>
auto foreacher(F&& f) {
return [f=std::forward<F>(f)](auto&& r)mutable{
for (auto&& e:decltype(r)(r))
f(decltype(e)(e));
};
}
std::vector<std::vector<Point3f>> data = {whatever};
auto mx = data[0][0].x;
auto task = foreacher(foreacher([&](Point3f const& e){
mx = (std::max)(mx, e.x);
}));
task(data);
我们使用我们的lambda来解决元素上的问题,然后我们将它包装在两个修饰符中,使它遍历参数的内容。
答案 2 :(得分:1)
您可以使用std::accumulate
很好地映射到此任务:
const auto min = std::numeric_limits<float>::min();
Point3f init( min, min, min );
std::vector< std::vector<Point3f> > cluster_points;
auto max = std::accumulate( cluster_points.begin(), cluster_points.end(), init, []( const Point3f &p, const std::vector<Point3f> &v ) {
return std::accumulate( v.begin(), v.end(), p, []( const Point3f &p1, const Point3f &p2 ) {
return Point3f( std::max( p1.x, p2.x ), std::max( p1.y, p2.y ), std::max( p1.z, p2.z ) );
}
} ) );
这只需要C ++ 11,使用C ++ 14可以通过在lambdas中使用auto
参数来简化它
答案 3 :(得分:1)
虽然有几个很好的答案,但我只是写了一个 pure opencv 的答案,我会以最快的方式给你调查。
std::vector<Point3f> points;
// .. fill the array
Mat pointsMat = Mat(points).reshape(1);
Quoting - 结果我们得到一个32FC1矩阵,有3列而不是32FC3矩阵,有1列。 pointsMat使用来自点的数据,并且在销毁时不会释放内存。但是,在这个特定的实例中,开发人员必须确保点的生命周期长于pointsMat。
然后,既然您拥有了所有Point3f
的席子,就可以使用以下内容:
minMaxLoc(pointsMat, &minVal, &maxVal);
如果您希望std::vector<std::vector<Point3f>> All_points
执行此操作,则可以制作一个列数为Mat
的单个频道All_points.size() * 3
,并使用相同的函数minMaxLoc
。这将为您提供所有点集的minVal
和maxVal
。
您还可以获取minVal
和maxVal
的位置:
minMaxLoc(pointsMat, &minVal, &maxVal, &minLoc, &maxLoc);
当然是重塑Mat 。
希望它有所帮助!
P.S。对C ++ 11和C ++ 14的回答