package photogrammetry.util; import java.io.File; import java.io.IOException; import java.util.ArrayList; import java.util.Collection; import java.util.List; import java.util.Set; import photogrammetry.util.model.Feature; import photogrammetry.util.model.Image; import photogrammetry.util.model.SceneView; /** * Class for choosing image pairs for reconstruction using multiple views. * * @author Piotr */ public class ImageChooser { public List<Pair<SceneView, SceneView>> pairs; public ImageChooser(List<SceneView> views) { double n = getAverageNumberOfCommonFeatures(views); pairs = imagesWithCommonFeatures(n, views); } /** * Returns list of pairs of images with common features * * @param n average number of common features * @param imgList list of all images * @return List of images with common features */ private List<Pair<SceneView, SceneView>> imagesWithCommonFeatures(double n, List<SceneView> imgList) { List<Pair<SceneView, SceneView>> images = new ArrayList<>(); for (int i = 0; i < imgList.size(); i++) { SceneView imgI = imgList.get(i); for (int j = 0; j < imgList.size(); j++) { if (j > i) { SceneView imgJ = imgList.get(j); Collection<Feature> f = imgJ.getCommonFeatures(imgI); if (f.size() >= n) { images.add(new Pair<>(imgI, imgJ)); } } } } return images; } /** * Computes average number of common features for all images * * @param imgList the list of all images * @return average number of common features */ private double getAverageNumberOfCommonFeatures(List<SceneView> imgList) { int numberOfFeatures = 0; for (int i = 0; i < imgList.size(); i++) { SceneView imgI = imgList.get(i); for (int j = 0; j < imgList.size(); j++) { if (j > i) { SceneView imgJ = imgList.get(j); Collection<Feature> f = imgJ.getCommonFeatures(imgI); numberOfFeatures += f.size(); } } } return numberOfFeatures / (imgList.size() / 2.0 * (imgList.size() - 1)); } /** * Return the selected pairs of images. * * @return list of pairs of images. */ public List<Pair<SceneView, SceneView>> getPairs() { return pairs; } }