C ++在gridmap中表示相机覆盖区域的最有效方式

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C ++在gridmap中表示相机覆盖区域的最有效方式相关的知识,希望对你有一定的参考价值。

我目前正在开展一个项目,其中一个机器人正在通过一个环境来驱动,该环境被表示为nxn网格图(比如100x100,但将来会更大),我将模拟为2D-arrayints。该区域由相机观察。机器人知道哪个摄像机覆盖哪个区域并且能够从稍微超过摄像机FOV范围的范围远程地停用摄像机。它必须提出一个未被注意的环境计划。

现在,我需要知道哪个摄像机捕获了哪个区域。为简单起见,我们假设所有相机都具有圆形FOV。现在,如果是camera 1捕捉到某个区域,我虽然想在阵列的那个区域放置一个1。到现在为止还挺好。但是,如果有第二个(也许是第三个)相机的FOV重叠怎么办?我如何在网格图中表示这种重叠?

到目前为止我的想法:

  • 将相机ID添加到网格中 - 例如如果camera 1覆盖某个FOV,请填写1's。如果camera 2的FOV重叠,请用1+2=3填充重叠区域。缺点:n个摄像机的可能性数量是指数级的,并且很难回溯计算数字的方式 - 例如,6可能是重叠camera 5camera 1,还有重叠camera 2camera 4
  • 连接网格中的摄像机ID - 对于cam 1cam 2的重叠,将12放入网格中。对于cam 1,2 and 3的重叠,将123放入网格中。优点:仅限整数运算,应该快。缺点:只有尽可能多的相机可能作为整数范围有数字(int_max32bit4294967295,所以最多10个相机)

任何帮助或想法?甚至是解决这类问题的文献或算法?编程语言将是C ++。

答案

您可以在int中为每个特定相机使用一位。但是,如果处理单个位,unsigned int更可取:假设32位int,1 << 31由于有符号整数溢出而导致未定义的行为,因此您必须使用少一点或对摄像机ID进行一些特殊处理31 (假设从零开始的ID):

unsigned int field;

// setting the bit for camera ID n (zero based):
field |= 1U << n;

// clearing the bit for camera ID n (zero based):
field &= ~(1U << n);

// reading the bit:
bool isSet = (field & ~(1U << n)) != 0;

(当然,你会将它打包成适当的(内联?)函数......)

这样,您就可以管理CHAR_BIT * sizeof(unsigned int)相机。在大多数现代系统中,这将是32个摄像头 - 但这取决于编译器/架构!根据标准,unsigned int保证能够保存0到65535之间的值,所以为了便于移植,你只能依赖16位(long会以这种方式保证32位,但可以更大,例如64位在64位Linux上)。如果您想确保可用的特定位数,我建议使用<cstdint> header中的数据类型,例如: G。 uint32_t(为了确保文字1U具有适当的范围,你应该施放:static_cast<uint32_t>(1U)或定义适当类型的常量)。

比特处理需要花费一些额外的操作,但这些操作应该可以忽略不计(除了一些非常罕见的极端性能场景;在超过15年的专业经验中只遇到过一次......)。

只是旁注:您可能会发现位字段隐藏了摆弄您的位。嗯,当然,他们确实(但它仍然存在,只是编译器为你做的事情)。但是它们带来了其他缺点(最重要的是:成员的顺序不能保证在不同的系统中是相同的,所以如果你将它们序列化为TCP或文件,你需要注意!),我个人宁愿避免他们。仍然:

struct Field
{
    uint32_t  _0 : 1;
    uint32_t  _1 : 1;
    // ...
    uint32_t _31 : 1;
};

以上是关于C ++在gridmap中表示相机覆盖区域的最有效方式的主要内容,如果未能解决你的问题,请参考以下文章

php 空格,换行,跳格使用说明

如何在VB6中表示64位整数?

在 C/C++ 中列出项目的最有效方法

如果我在 ERD 中表示 JSON 模型是不是有效?

如何在 Rust 中表示指向 C 数组的指针?

在 C 中存储和使用具有 1,000,000 位有效数字的浮点数的最有效方法是啥?