我目前正在开展一个项目,其中一个机器人正在通过一个环境来驱动,该环境被表示为nxn
网格图(比如100x100
,但将来会更大),我将模拟为2D-array
的ints
。该区域由相机观察。机器人知道哪个摄像机覆盖哪个区域并且能够从稍微超过摄像机FOV范围的范围远程地停用摄像机。它必须提出一个未被注意的环境计划。
现在,我需要知道哪个摄像机捕获了哪个区域。为简单起见,我们假设所有相机都具有圆形FOV。现在,如果是camera 1
捕捉到某个区域,我虽然想在阵列的那个区域放置一个1
。到现在为止还挺好。但是,如果有第二个(也许是第三个)相机的FOV重叠怎么办?我如何在网格图中表示这种重叠?
到目前为止我的想法:
camera 1
覆盖某个FOV,请填写1's
。如果camera 2
的FOV重叠,请用1+2=3
填充重叠区域。缺点:n个摄像机的可能性数量是指数级的,并且很难回溯计算数字的方式 - 例如,6
可能是重叠camera 5
的camera 1
,还有重叠camera 2
的camera 4
。cam 1
和cam 2
的重叠,将12
放入网格中。对于cam 1,2 and 3
的重叠,将123
放入网格中。优点:仅限整数运算,应该快。缺点:只有尽可能多的相机可能作为整数范围有数字(int_max
的32bit
是4294967295
,所以最多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;
};