求类似std::bitset的非拥有式引用,实现ORB特征高效汉明距离计算
为ORB特征实现可移植高效汉明距离函数的问题
std::bitset的问题
std::bitset<N>提供了性能优于__builtin_popcount的位运算和计数标准实现,但它是带所有权的容器类型,无法直接由cv::ORB::detectAndCompute生成的、存储在cv::Mat中的256位向量转换而来。
有帖子讨论将cv::Mat转换为std::bitset<256>,但我认为其中用memcpy的做法并不正确:cppreference并未规定std::bitset的内存布局;此外std::bitset的构造函数不支持初始化超过sizeof(unsigned long long)长度的位。
我的实现存在的问题
为避免数据拷贝,我当前实现了一个类span结构:
struct ORB_view { inline static constexpr int length = 256 / sizeof(uint32_t) / 8; const uint32_t* data; };
但该结构无法直接使用位运算和popcount,导致实现中需要显式编写SIMD指令,而我希望借助std::bitset<N>::count()来避免这一点。
期望的解决方案
我需要一个支持位运算和计数的非拥有式引用,具备以下特性:
- 无数据拷贝
- 与
std::bitset一样的固定长度 - 支持按位异或运算和popcount
- 无需为x86或ARM编写显式SIMD代码
据我所知,标准库中暂无此类工具。
内容的提问来源于stack exchange,提问作者fcc
相关产品推荐
相关产品推荐

