图像识别 - Mat中的二进制描述符表示 - OpenCV Android

时间:2013-03-14 01:29:19

标签: java android image opencv orb

我只是好奇。我是新来的,所以请体谅我有点虚伪的问题。

假设我正在使用图像识别的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(Class Mat - openCV)中是如何表示二进制特征/描述符的。以及如何对这些二进制描述符进行规范化,以便将其提供给神经网络(Multi-Layer Perceptron)进行训练。 (甚至伪代码也会有很大帮助)

2 个答案:

答案 0 :(得分:2)

而不是尝试从头开始实现分类器。你有没有考虑过HaarTraining?您可以训练它来检测图像中的多个对象。

但培训过程很长。

http://note.sonots.com/SciSoftware/haartraining.html

希望它有所帮助!

答案 1 :(得分:2)

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

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

  2. 所述设置此参数
  3. 关于二进制字符串描述符。我还需要它们用MySQL查询实现描述符匹配器。由于OpenCV-java中的Mat只有双描述符表示,我实现了将它们转换为二进制的方法。为此,描述符的Mat应该转换为List<Double>。并且您可以使用我的函数来获取描述符的二进制表示。该函数将返回List<String>

  4. 以下是代码:

    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 Hamming匹配器匹配,如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
        ...
      

      现在关于多层感知器。我无法帮助你。这就是为什么我在开始时告诉我答案是不完整的。但是我希望我给出的评论将来会帮助你解决问题。