2013-05-02 6 views
-1

Я делаю приложение, в котором можно сравнить 2 изображения (2 картинки на моем смартфоне). Там я использую детектор FAST и дескриптор FREAK на ограниченном количестве ключевых точек (я отфильтровал 300 лучших в соответствии с ответом). Когда я пытаюсь сопоставить его с BRUTEFORCE_HAMMING, он возвращает 0 совпадений.Bruteforce и сопоставление дают результаты с обратным/неправильным результатом

Matching происходит с

 MatOfDMatch matches = new MatOfDMatch(); 

     matcher = DescriptorMatcher.create(DescriptorMatcher.BRUTEFORCE_HAMMING); 
     matcher.match(descriptors,descriptors1,matches); 
     MatOfDMatch goedematches = new MatOfDMatch(); 

     double max_dist = 0; 
     double min_dist = 100; 
     //if (descriptors.cols() == descriptors1.cols()) 
     //{ 
     for(int i = 0; i < descriptors.rows(); i++) 
     { double dist = matches.toArray()[i].distance; 
      if(dist < min_dist) min_dist = dist; 
      if(dist > max_dist) max_dist = dist; 
     } 
     // should only draw good matches 
     for(int i = 0; i < descriptors.rows(); i++) 
     { MatOfDMatch temp = new MatOfDMatch(); 
      if(matches.toArray()[i].distance < 2*min_dist) 
      { temp.fromArray(matches.toArray()[i]); 
       goedematches.push_back(temp); 
       }   
     // } 
     } 

     Log.d("LOG!", "Number of good matches= " + goedematches.size()); 

Когда я сравниваю изображение себе, я получаю следующий результат. Результат равен 0x0 хороших совпадений. enter image description here

05-02 15:52:30.325: D/LOG!(17866): Number of Descriptors image 1= 64x286 
05-02 15:52:30.325: D/LOG!(17866): Number of Descriptors image 2= 64x286 
05-02 15:52:30.325: D/LOG!(17866): description time elapsed 339 ms 
05-02 15:52:30.555: D/LOG!(17866): Minimum distance = 0.0 
05-02 15:52:30.560: D/LOG!(17866): Maximum distance= 0.0 
05-02 15:52:30.560: D/LOG!(17866): Number of good matches= 0x0 

Когда я использую ту же картину, и тот, который не имеет ничего общего с ним, я получаю около 471 матчей. В коде есть что-то не так, но я не могу понять, что не так (код, кажется, резерв, потому что все одно и то же не соответствует, и оно соответствует, когда оно совершенно другое. Где код, я делать это неправильно?)

ВАЖНО: Не против красных точек на правой картинке, это просто старая фотография, которую я взял, когда я нарисовал ключевые точки на экране. Это не соответствует самому совпадению! Это может быть любая другая картина, которая не имеет ничего общего с первым изображением.

enter image description here

05-02 16:03:06.120: D/LOG!(19025): Number of Descriptors image 1= 64x259 
05-02 16:03:06.120: D/LOG!(19025): Number of Descriptors image 2= 64x286 
05-02 16:03:06.420: D/LOG!(19025): Minimum distance= 93.0 
05-02 16:03:06.420: D/LOG!(19025): Maximum distance = 183.0 
05-02 16:03:06.420: D/LOG!(19025): Number of good matches= 1x286 

ответ

1
if(matches.toArray()[i].distance < 2*min_dist) 

В вашем первом случае вы сравниваете те же изображения, поэтому значение Min_Dist поэтому 0 и ваш, если заявление будет отвергать все матчи в расстоянии не меньше 0.


в вашем втором случае Min_Dist составляет 93 * 2 = 186 и поскольку ваш maximum_distance 183 это приведет к принятию всех матчей вместо того, чтобы отвергать тыс Эм.

Рассмотрите возможность использования в поварской книге opencv для компьютерного зрения в главе 9, где есть хороший подход для хранения только хороших совпадений на основе теста отношения и симметрии.

+0

Спасибо за хорошую информацию, я обязательно посмотрю на нее. Кажется, мне действительно нужно найти другой подход. Есть ли coockbook, который использует Java-обертки, потому что все написано для C, и я не использую родную часть. – user1393500

+0

Вот случайная идея: если я сменил строку на <=, то она примет значение 0 как привет, и она не просто выбросит ее. Затем я сделаю фильтрацию более строгой, создав 'if (matches.toArray() [i] .distance <= 2 * min_dist)' от 2 до 1,5 или что-то еще? Или это плохая идея? – user1393500

+0

всем, кто читает это: это плохая идея: DI все еще получает больше совпадений для случайного изображения, а затем изображение, которое очень похоже – user1393500