Пример программы OpenCV lkdemo - PullRequest
2 голосов
/ 04 декабря 2008

ссылка, OpenCv \ samples \ c \ lkdemo.c

Кто-нибудь знает, что делает следующий фрагмент кода?

Код извлечен из lkdemo.c

 for( i = k = 0; i < count; i++ )
            {
                if( add_remove_pt )
                {
                    double dx = pt.x - points[1][i].x;
                    double dy = pt.y - points[1][i].y;

                    if( dx*dx + dy*dy <= 25 )
                    {
                        add_remove_pt = 0;
                        continue;
                    }
                }

                if( !status[i] )
                    continue;

                points[1][k++] = points[1][i];
                cvCircle( image, cvPointFrom32f(points[1][i]), 3, CV_RGB(0,255,0), -1, 8,0);
            }
            count = k;

Q1.

Что делает жирная линия? >> баллов [1] [k ++] = баллов [1] [i];

Почему к ++? Я смущен, думая, что следующий пункт перезаписан текущая точка

Q2.

Когда cvCircle id отображается как петли кадра, где очищаются старые точки и рисуется новая точка?

Я с нетерпением жду ваших отзывов.

Спасибо =)

Ответы [ 5 ]

3 голосов
/ 04 декабря 2008

1:

Возможно, это помогло бы, если бы я рефакторинг кода:

if( status[i] ) {
    points[1][k++] = points[1][i];  // <---- Q1
    cvCircle( image, cvPointFrom32f(points[1][i]), 3, CV_RGB(0,255,0), -1, 8,0);
}

Таким образом, в строке для вопроса 1, я всегда увеличивается (он увеличивается на цикл), но k увеличивается только тогда, когда состояние [i] истинно. Короче говоря, он удаляет все точки в массиве, где состояние [i] ложно, копируя их, а затем устанавливая длину массива (счетчика) равной k, числу, прошедшему исключение.

1 голос
/ 04 декабря 2008

Это устраняет любые точки, которые сместились более чем на 5 пикселей (5 * 5 = 25). k используется для отслеживания выходного индекса при удалении точек.

0 голосов
/ 19 ноября 2013

Дай мне посмотреть, получу ли я это. Этот блочный код исключает любые точки, где статус [i] равен false, то есть те, которые были на предыдущем изображении и не были найдены на текущем изображении. Но при этом мы теряем эти очки в нашем слежении, не так ли? Я имею в виду, что если мы отслеживаем объект с N px, на каждой итерации мы отбрасываем очки. Это хороший подход? Зачем это делать?

0 голосов
/ 10 апреля 2011

Устаревший, но ради протокола -

Теперь для iPhone есть приложение с открытым исходным кодом Lucas Kanade - http://www.success -ware.com / 150842 / Lucas-Kanade-Detection-for-the-iPhone

Он также использует код lkdemo и добавляет некоторые дополнительные функции.

Вы найдете ссылки как на приложение в AppStore, так и на исходный код проекта по ссылке выше.

HTH кто угодно, Cheers,

Одед

0 голосов
/ 04 декабря 2008

Мне удается выяснить, где производится очистка точек. По мере зацикливания кадра новые точки отражаются на новом кадре и новом кадр обновляет предыдущий.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...