Да, мы тоже думали, что в изображениях всегда будут перекрытия, и удивились, когда оказалось иначе. Можно ли называть это панорамой или это должно называться как-то по-другому — вопрос чисто терминологический. Да, это получается уже другая задача, но это не делает её менее интересной. А зачем именно это нужно было Яндексу — можно только гадать. Может, просто хотел посмотреть, какие идеи смогут придумать участники, если нарушить стандартное условие о наличии перекрытий :)
Спасибо :) Мы тоже сначала думали, что, используя ключевые точки, задача решается тривиально. Но, как оказалось, во многих сериях нет перекрытий и здесь уже важны именно гистограммы.
Зачем это понадобилось Яндексу нам не известно. Если же говорить в целом, то подобную задачу (когда между изображениями панорамы нет пересечений) можно использовать, к примеру, для таких приложений:
Кластеризация фотографий по месту. Например, уехала компания друзей вместе в отпуск и каждый сделал кучу снимков. Будет удобно объединить все фотографии вместе, автоматически разбить на группы по тому месту, где были сделаны снимки, и получить единый альбом со структурированными фотографиями.
В результате работы над конкурсом получилась функция сравнения двух изображений. Её в принципе можно использовать, например для поиска по изображению: пользователь даёт своё изображение и система находит похожие снимки из базы. Причём могут будут найдены не только снимки, скажем, того же дома, но и с той же улицы.
А вообще мы тоже удивились как так вышло, что у Яндекса перепутались фотографии с Яндекс.Карт и им нужно их распутать :)
А также в эти 100k входит месяц работы 60 команд по всей России. Мы участвовали в конкурсе в свободное от работы время и на тот момент были студентами и недавними выпускниками, так что мы тоже остались довольны :)
Официальная документация находится здесь: docs.opencv.org/. По этому адресу всегда доступна документация по последней версии OpenCV — это как раз то, что вам нужно.
Настоятельно рекомендую вам прочитать книгу М. Клайна "Математика. Утрата определённости" (или созвучную ей "Математика. Поиск истины"). Эта популярная книга как раз посвящена философским проблемам в основании математики. В ней вы найдёте частичные ответы на ваши вопросы, а так же ещё больше вопросов.
По-моему, вы смешиваете порядок элементов, в котором они хранятся в списке и порядок, который задаёт функция getnext (итераторы в коде работают с функцией getnext). Для устранения этой двусмысленности нужно заменить в условии список на массив.
Да, но getNext(last_element) должна же что-то вернуть (ну или хотя бы исключение бросить). Если бы мы всегда могли рассматривать результат как элемент списка, то случай без цикла был бы невозможен.
1) По сути дела да. Просто я по хорошей привычке работаю с итераторами (указателями) и ++p1 означает перевести указатель на следующий элемент.
2) Условие будет верное, если цикла в списке нет.
iterator p1 = begin ();
iterator p2 = begin ();
do
{
if (getnext (*p2) == 0) break;
++p2;
if (getnext (*p2) == 0) break;
++p2;
++p1;
}
while (p1 != p2);
if (getnext (*p2) == 0) цикла нет
else цикл есть
А вообще мы тоже удивились как так вышло, что у Яндекса перепутались фотографии с Яндекс.Карт и им нужно их распутать :)
В неё даже вот так можно играть: www.youtube.com/watch?v=PD_eLZbltCs
Если A и A+2 — близнецы, то -A и -(A+2) тоже близнецы. Минус берём, естественно, по модулю произведения простых чисел.
http://turgor.ru/25/turnir25.php#turnir25vos
(в самом низу страницы)
Решение именно этой задачи позволило попасть мне на летнюю конференцию Турнира Городов :-)
После первой итерации p1 указывает на 2, p2 на 1
После второй (и последней) p1 на 1, p2 на 1
Мы получили, что цикл есть.
2) Условие будет верное, если цикла в списке нет.
iterator p2 = begin ();
do
{
if (getnext (*p2) == 0) break;
++p2;
if (getnext (*p2) == 0) break;
++p2;
++p1;
}
while (p1 != p2);
if (getnext (*p2) == 0) цикла нет
else цикл есть
do
{
...
}
while (p1 != p2);