Использование класса BagOfVisualWord в библиотеке OpenImaj

Так что в моем случае я должен предоставить для метода computeQuantisedFeatures два аргумента, второй тип имеет тип

        List<LocalFeature<Location, ? extends ArrayFeatureVector<byte[]>>>

я пытаюсь передать свой список точек изображения, который имеет тип

    LocalFeatureList<Keypoint>

а также

    List<LocalFeature<KeypointLocation, ByteFV>> features = null;
    for (java.util.Iterator<Keypoint> iter = imageKeypoints.iterator(); iter.hasNext();)
    {features.add((LocalFeature<KeypointLocation, ByteFV>)iter.next());}

но я всегда получаю известную ошибку

    The method computeQuantisedFeatures(HardAssigner<T,?,?>, List<LocalFeature<L,? 
    extends ArrayFeatureVector<T>>>) in the type BagOfVisualWords is not applicable for
    the arguments (HardAssigner<byte[],capture#3-of ?,capture#4-of ?>, 
    List<LocalFeature<KeypointLocation,ByteFV>>)

2 ответа

Примечание: я основал этот ответ на Keypoint источник здесь.

Эта проблема возникает из-за того, что генерики не являются ковариантными. Метод ожидает List<LocalFeature<L, ? extends ArrayFeatureVector<T>>>, но вы предоставляете List<Keypoint>, Если метод взял List<? extends LocalFeature<L, ? extends ArrayFeatureVector<T>>> вместо этого это будет законный вызов.

Самое простое решение - скопировать содержимое imagekeypoints во вновь созданный List<LocalFeature<KeypointLocation, ByteFV>> и вместо этого передать это в вызов.

Как отметил Пол Беллора, это на самом деле ошибка в обобщениях этого метода. Я только что совершил исправление, которое будет доступно в 1.1.1-SNAPSHOT версии в ближайшее время. Временное решение заключается в реализации правильной версии computeQuantisedFeatures метод в вашем классе следующим образом:

public static <L extends Location, T> List<QuantisedLocalFeature<L>> computeQuantisedFeatures(
    HardAssigner<T, ?, ?> assigner,
    List<? extends LocalFeature<L, ? extends ArrayFeatureVector<T>>> features)
{
    final List<QuantisedLocalFeature<L>> out = new ArrayList<QuantisedLocalFeature<L>>(features.size());

    for (final LocalFeature<L, ? extends ArrayFeatureVector<T>> f : features) {
        final int idx = assigner.assign(f.getFeatureVector().values);
        out.add(new QuantisedLocalFeature<L>(f.getLocation(), idx));
    }

    return out;
}
Другие вопросы по тегам