2013-03-14 31 views
4

我只是好奇。我在这里是新来的,所以请体谅我的有点不讨好的问题。图像识别 - Mat中的二进制描述符表示 - OpenCV Android

假设我正在做带有图像识别功能的android应用程序,其中所有进程甚至需要在移动设备cpu上进行大量计算。

我处于已经处理图像的阶段,从图像中提取了一些特征。这组图像来自只有一个建筑物,它应该识别特定的感兴趣物体(不同的窗户,图片,建筑物外的工件)。所以这是一个封闭的领域,我可以从不同的角度提供足够的对象图片。我计划训练神经网络并将其提供给应用程序,而不是图像匹配算法。

我的想法是,提取关键点,计算描述符(使用FREAK的关键点ORB的描述),并从这些描述中,我想最终与单个文件或阵列 它最终会像这样

Desc1 Desc2 Desc3 Desc4 DescN......... Class 
_________________________________________________________________________________ 
Picture 1  0.121 0.923 0.553 0.22 0.28   "object1" 
Picture 2  0.22 0.53 0.54 0.55 0.32 .........."object1" (different scale, angle) 
Picture 3  .... ... ... ... .. .........."object2" 
Picture N 
Picture N+1 

所以我可以把它给神经网络进行训练,但是我被卡住了,因为我不知道如何在Matrice(类Mat - openCV)中表示二进制特征/描述符。以及如何对这些二进制描述符进行归一化处理,以便将其馈送到神经网络(多层感知器)进行培训。 (即使是伪代码也会有很大帮助)

+0

MrCurious,您是否发现过或曾经制作过管理此功能的示例应用程序? – Dale 2016-09-26 13:12:33

回答

2

我不能给出一个完整的答案你的问题,因为我不熟悉神经元网络,但我可以给你一些关于ORB描述符二进制表示的想法。

  1. 当您检测到关键点时,您无法使用FREAK进行此操作。但正如FREAK paper所述,您应该使用FAST角点检测器检测关键点,然后用FREAK对其进行描述。如果您想通过ORB描述符识别对象,则应该使用ORB来进行关键点检测和描述。请注意,ORB关键点检测也可以基于FAST。您可以通过改变OpenCV documentationscoreType的参数来更改它。在您使用android时,您可以按照所述设置此参数here

  2. 关于二进制字符串描述符。我也需要他们用MySQL查询来实现描述符匹配器。由于OpenCV中的Mat-java只有双重描述符表示,我已经实现了将它们转换为二进制的方法。为此目的,描述符的Mat应该转换为List<Double>。你可以使用我的函数来获取描述符的二进制表示。该功能将返回List<String>

下面是代码:

public static List<String> descriptorToBinary(List<Double> desc){ 

    List<String> binary_desc = new ArrayList<String>(); 

    String desc_bin= ""; 
    for(int i = 0; i < desc.size(); i++){ 

     String binary_str_tmp = Integer.toBinaryString((int)((double)desc.get(i))); 
     if (binary_str_tmp.length() < 16) 
     { 
      int number_of_zeros = 16 - binary_str_tmp.length(); 
      String str_tmp = ""; 
      for(int t = 0; t < number_of_zeros; t++){ 
       str_tmp += "0"; 
      } 
      binary_str_tmp = str_tmp + binary_str_tmp; 
     } 

     desc_bin+= binary_str_tmp; 
     binary_desc.add(final_binary_str); 

    } 

    return binary_desc; 

} 

字符串返回的列表将有大小的MatOfKeyPoint列表相同的,如果你将它转换为List<KeyPoint>

所以我怎么核实,如果这些描述是正确的:

  1. 我已经匹配原始Mat描述符与Bruteforce汉明匹配器如在ORB paper
  2. 中说的我已经注册了匹配器返回的距离。
  3. 然后我计算了同一图像的字符串描述符之间的距离。
  4. 验证opencv的汉明距离是否与字符串描述符之间的距离相同。它们是一样的,所以从Mat到List的转换表现得很好。
  5. 相关联的关键点看起来是这样

所以二进制描述:

Picture 1: object1 
    keypoint1 : 512bit binary descriptor (1s and 0s) 
    keypoint2 : 512bit binary descriptor 
    keypoint3 : 512bit binary descriptor 
    ... 
Picture 2: object2 
    keypoint1 : 512bit binary descriptor 
    keypoint2 : 512bit binary descriptor 
    keypoint3 : 512bit binary descriptor 
    ... 

现在关于多层感知。我无法帮助你。这就是为什么我一开始就告诉我的答案是不完整的。但是,我希望我所提出的意见将在未来帮助您解决您的问题。