Использование класса 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;
}