有效的比较向量的方法
C++ - Efficient way to compare vectors
此刻我正在用相机检测标记。我使用opencv和Aruco库。
只是我现在遇到了一个问题。我需要检测两个标记之间的距离是否小于一个特定的值。我有一个计算距离的函数,我可以比较所有的东西。但是我正在寻找最有效的方法来跟踪所有标记(大约5/6)以及它们在一起的距离。
有一个标记列表,但我找不到一种有效的方法来比较它们。
我有
Vector <Marker>
我还有一个叫做getDistance
的函数。
double getDistance(cv::Point2f punt1, cv::Point2f punt2)
{
float xd = punt2.x-punt1.x;
float yd = punt2.y-punt1.y;
double Distance = sqrtf(xd*xd + yd*yd);
return Distance;
}
Marker
s包含一个Point2f
,所以我可以很容易地比较它们
提高性能的一种方法是保持所有距离的平方,避免使用平方根函数。如果您对要检查的特定值进行平方,则应该可以正常工作。
没有什么值得推荐的。如果我理解问题并且数对正确的话,当你有5个点的时候你需要计算10个距离,当你有6个点的时候需要计算15个距离。如果你需要确定所有的距离,那么你别无选择,只能计算所有的距离。我看不出有什么办法。我能给出的唯一建议是确保你只计算一次每对之间的距离(例如,一旦你知道A点和B点之间的距离,你就不需要计算B点和A点之间的距离)。
有可能对向量进行排序,从而使循环短路。例如,如果您正确排序,并且点A和点B之间的距离大于您的阈值,那么A和C以及A和D之间的距离也将大于阈值。但请记住,排序不是免费的,对于小的点集,只计算所有的距离可能会更快("当n很小时,花哨的算法很慢,而n通常很小。奇特的算法有很大的常数。除非您知道n通常会很大,否则不要太花哨. ...例如,对于日常问题,二叉树总是比展开树更快。
新版本的C和c++标准库有一个hypot
函数用于计算点之间的距离:
#include <cmath>
double getDistance(cv::Point2f punt1, cv::Point2f punt2)
{
return std::hypot(punt2.x - punt1.x, punt2.y - punt1.y);
}
它不一定更快,但它应该以一种避免在点相距很远时溢出的方式实现。
一个较小的优化是简单地检查X或Y的变化是否超过阈值。如果是,则可以忽略这两点之间的距离,因为总距离也将超过阈值:
const double threshold = ...;
std::vector<cv::Point2f> points;
// populate points
...
for (auto i = points.begin(); i != points.end(); ++i) {
for (auto j = i + 1; j != points.end(); ++j) {
double dx = std::abs(i->x - j->x), dy = std::abs(i->y - j->y);
if (dx > threshold || dy > threshold) {
continue;
}
double distance = std::hypot(dx, dy);
if (distance > threshold) {
continue;
}
...
}
}
如果你在矢量中处理大量数据,你可能想考虑使用future
进行多线程处理。
Vector <Marker>
可以分成X
块,这些块异步计算在一起并存储在std::future<>
中,使用@Sesame的建议也会提高你的速度。
- C++从另一个类访问公共静态向量的正确方法是什么
- 有没有一种"cleaner"的方法可以在指向基的指针向量中找到派生类的第一个实例?
- 声明高维向量的更简洁的方法
- 在C++中初始化向量映射的最有效方法
- C++11 迭代向量的新方法?
- std::find,返回所有找到的值的替代方法,而不仅仅是存在重复的向量的第一个值
- C++ STD 函数运算符:有没有一种方法可以通过函数将一个向量映射到另一个向量上?
- C++:将向量传递到构造函数以创建成员变量的最佳方法?
- 有什么方法可以将具有不同模板参数的模板类实例放入向量中?
- 当映射包含字符串向量作为值时,从值中获取键的有效方法
- 在向量中查找大于 0(或通常为 k)的最小元素的最佳方法是什么?
- 从数组中删除非唯一值、保持顺序和不使用向量的最佳方法?
- 使用192/256位整数求和无符号64位整数向量的点积的最快方法
- 访问类成员向量最后一项的正确方法
- 使用 std::vector::swap 方法在C++中交换两个不同的向量是否安全?
- 从列表/向量制作嵌套 for 循环的最佳方法是什么?
- 方法向量的新/分配的复杂性::p ush_back
- C++调用另一个类中的类方法向量
- 自己的"Insert"方法(向量)函数模板
- 最有效的计算集合A对集合B的补的方法(向量)