JavaCV:如何获取描述符&x27;s二进制字符串

JavaCV:如何获取描述符&x27;s二进制字符串,java,image-processing,opencv,image-recognition,javacv,Java,Image Processing,Opencv,Image Recognition,Javacv,我正在尝试使用JavaCV实现使用ORB算法的图像识别。根据一些论文,ORB关键点描述符是一个二进制字符串。那么,在获得图像的关键点之后,如何获得这个二进制字符串呢 这是我用来获取关键点的代码 KeyPoint keypoints = new KeyPoint(); ORB orb = new ORB(MAX_FEATURES, (float) 1.2, 8, 1, 0, 2, 5, 31); orb.detect(originalImg, greyScaleImg, keypoints);

我正在尝试使用JavaCV实现使用ORB算法的图像识别。根据一些论文,ORB关键点描述符是一个二进制字符串。那么,在获得图像的关键点之后,如何获得这个二进制字符串呢

这是我用来获取关键点的代码

KeyPoint keypoints = new KeyPoint();
ORB orb = new ORB(MAX_FEATURES, (float) 1.2, 8, 1, 0, 2, 5, 31);
orb.detect(originalImg, greyScaleImg, keypoints);
获取描述符的代码应为:

DescriptorExtractor descriptor = orb.getDescriptorExtractor();
descriptor.compute(greyScaleImg, keypoints, descriptors);

因为没有关于描述符函数的文档,javadocs也没有。我不知道参数描述符应该是什么类型,以及如何打印二进制字符串。非常感谢您的帮助。

描述符参数应该是2D矩阵
Mat
(来自
org.opencv.core.Mat
):

  • 维度:
    NxD
    其中
    N=关键点的数量
    (行)和
    D=描述符维度=32
    (列)
  • 类型:
    CV_8UC1
    ,即每个矩阵值是一个字节(也称为8位单通道矩阵)
每个描述符都可以通过将32个字节连接到由256位组成的字节数组来表示,这就是论文将其称为二进制字符串的原因


有关更多详细信息,请参见
ORBDescriptorExtractorTest.java

我不明白如何“将32个字节连接到由256位组成的字节数组中”,如果要将第I个描述符加载到字节数组中,应执行以下操作:
byte[]desc=新字节[descriptors.cols()]然后
描述符。获取(i,0,desc)。使用它,您可以自由创建字符串(
string descStr=new string(desc);
)或以您想要的方式操作它。也就是说,你不应该这样做,因为你应该通过汉明距离来比较描述符,你可以通过
double dist=Core.norm(descA,descB,Core.norm_-Hamming)来进行比较。如果我安装的opencv不包含核心模块,有什么建议吗?如果你的目标是匹配描述符,检查您的JavaCV版本是否提供了
DescriptorMatcher
:您可能希望使用
DescriptorMatcher.BRUTEFORCE\u HAMMING
模式创建一个匹配器,并使用它匹配一对查询和训练描述符。