Я делаю приложение, в котором можно сравнить 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 хороших совпадений.
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 матчей. В коде есть что-то не так, но я не могу понять, что не так (код, кажется, резерв, потому что все одно и то же не соответствует, и оно соответствует, когда оно совершенно другое. Где код, я делать это неправильно?)
ВАЖНО: Не против красных точек на правой картинке, это просто старая фотография, которую я взял, когда я нарисовал ключевые точки на экране. Это не соответствует самому совпадению! Это может быть любая другая картина, которая не имеет ничего общего с первым изображением.
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
Спасибо за хорошую информацию, я обязательно посмотрю на нее. Кажется, мне действительно нужно найти другой подход. Есть ли coockbook, который использует Java-обертки, потому что все написано для C, и я не использую родную часть. – user1393500
Вот случайная идея: если я сменил строку на <=, то она примет значение 0 как привет, и она не просто выбросит ее. Затем я сделаю фильтрацию более строгой, создав 'if (matches.toArray() [i] .distance <= 2 * min_dist)' от 2 до 1,5 или что-то еще? Или это плохая идея? – user1393500
всем, кто читает это: это плохая идея: DI все еще получает больше совпадений для случайного изображения, а затем изображение, которое очень похоже – user1393500