int main()
{
	FeaturesService featuresService = FeaturesService();
	string imagename = "0";
	vector<string> imagenames;
	vector<Mat> images, imagesnocolor;
	vector<vector<Matches>> imagesmatches;
	vector<vector<int>> relatedImages;
	vector<set<int>> panoramas;
	vector<vector<Matches>> panoramasmatches;

	unsigned int numImages;
	while (imagename.compare("") != 0 && imagename.compare("-1") != 0) {
			cout << "Insert image path to load (insert -1 to start loading predetermined images or just ENTER to finish the list of images): ";
			cin >> imagename;
			imagenames.push_back(imagename);
	}
	if (imagename.compare("-1") == 0) {
		imagenames.push_back("./yosemite2.jpg");
		imagenames.push_back("./yosemite1.jpg");
		imagenames.push_back("./b.JPG");
		imagenames.push_back("./yosemite3.jpg");
		imagenames.push_back("./a.JPG");			 
		imagenames.push_back("./yosemite4.jpg");
		imagenames.push_back("./yosemite5.jpg");
		imagenames.push_back("./raufusskauz.JPG");
		imagenames.push_back("./yosemite6.jpg");
		imagenames.push_back("./yosemite7.jpg");
		imagenames.push_back("./c.JPG");
		

	}

	cout << "Loading images" << endl;
	imagenames = featuresService.loadImagesArray(imagenames, images, imagesnocolor);
	numImages = imagenames.size();
	cout << "Computing homographies" << endl;
	featuresService.computeMatchesAndHomography(imagesnocolor, imagesmatches);
	featuresService.computeRelatedImages(imagesmatches, relatedImages);
	featuresService.computePanoramas(relatedImages, panoramasmatches, imagesmatches);
	cout << "Related images" << endl;
	
	vector<Panorama> panoramasfinales;
	int lastadded;
	cout << "Creating panoramas" << endl;
	for (int itout = 0; itout < panoramasmatches.size(); itout++) {
		Panorama newpanorama;
		newpanorama.addImage(panoramasmatches[itout][0].getImage2(), images[panoramasmatches[itout][0].getImage2().getImgNumber()]);
		lastadded = panoramasmatches[itout][0].getImage2().getImgNumber();
		panoramasmatches[itout].erase(panoramasmatches[itout].begin());
		int size = panoramasmatches[itout].size();
		for (int i = 0; i < size; i++) {
			for (int itin = 0; itin < panoramasmatches[itout].size(); itin++) {
				if (panoramasmatches[itout][itin].getImage1().getImgNumber() == lastadded) {
					newpanorama.addImage(panoramasmatches[itout][itin].getImage2(), images[panoramasmatches[itout][itin].getImage2().getImgNumber()]);					
					lastadded = panoramasmatches[itout][itin].getImage2().getImgNumber();
					break;
				}
			}
		}
		Mat destiny;
		bilateralFilter(newpanorama.getPanorama(), destiny, 5, 20,20);
		newpanorama.setPanorama(destiny);
		panoramasfinales.insert(panoramasfinales.end(), newpanorama);
	}

	cout << "Showing panoramas" << endl;
	for (unsigned int i = 0; i < panoramasfinales.size(); i++) {
		string nombre = "Resultado";
		nombre.append(to_string(i));
		imshow(nombre, panoramasfinales[i].getPanorama());
	}

	waitKey(0);
	system("pause");
}