Визуализация оптического потока

Я пытаюсь визуализировать вывод calcOpticalFlowPyrLK() (OpenCv v3.0.0). Я не пытаюсь нарисовать все изображение оптическим потоком, только стрелку направления. Проблема в том, что я не могу получить вывод, как в примерах. Каждые 10 кадров обновляю очки для подсчета потока. Сама функция

calcOpticalFlowPyrLK(CentroidFrOld, CentroidFrNow, mc, CornersCentroidNow, feat_found, feat_errors, Size(15, 15), 2, cvTermCriteria(CV_TERMCRIT_ITER | CV_TERMCRIT_EPS, 10, 0.03), 0);

Где CentroidFrOld — это кадр в градациях серого, CentroidFrNow — это кадр в градациях серого + 1, mc — это массив vector<Point2f> точек, а CornersCentroidNow — пустой массив, ожидающий заполнения новыми точками.

При их рисовании я использую простой код:

for (size_t i = 0; i < CornersCentroidNow.size(); i++){             
    if (feat_errors[i] > MAX_ERR || feat_found[i] == 0) continue; 
    Point p0(ceil(mc[i].x), ceil(mc[i].y)); // are the points of interest (centroids of contours)
    Point p1(ceil(CornersCentroidNow[i].x), ceil(CornersCentroidNow[i].y));     
    arrowedLine(empty, p0, p1, Scalar(0, 0, 255), 2, 8, 0, 0.2);
}

после этого блока кода. Когда я рисую их в каждом кадре, я получаю следующий вывод: Первый шаг

Если я обновлю предыдущий кадр, используемый для функции calcOpticalFlowPyrLK()

CentroidFrOld = CentroidFrNow.clone();

Я получаю этот вывод (линия короткая и движется вперед каждые 10 кадров - как указано для получения новых точек) Второй шаг

Если предыдущие точки также являются следующими точками

CentroidFrOld = CentroidFrNow.clone();
mc = CornersCentroidNow;

Я получаю этот вывод (линия короткая, но она движется вместе с объектом) Третий шаг

Желаемый результат, которого я не могу достичь,

Желаемый выход

Нужно ли вручную удлинять линию? Никто не делает этого в подобных примерах реализации Optical Flow.


person Croolman    schedule 14.02.2016    source источник
comment
comment
Совершенно не связанный - я не пытаюсь рисовать все изображение с помощью OF, и предложенный алгоритм в конце поста в основном такой же, как и у меня, но в более новой версии Opencv, в 2013 году была версия 2.3.1, совершенно другая из того, что сейчас   -  person Croolman    schedule 15.02.2016
comment
вам нужно будет показать больше кода для устранения этой проблемы - в частности, фактический вызов функции calcOpticalFlowPyrLK. Если вы настроили его правильно, он должен работать, чтобы просто рисовать линии между точками в массиве prevPts и массиве nextPts. Я бы порекомендовал вам уменьшить arrowedLine до более простого line рисования во время отладки - эти короткие линии могут быть ошибочно нарисованными стрелками.   -  person foundry    schedule 15.02.2016
comment
@foundry Я отредактировал вопрос   -  person Croolman    schedule 15.02.2016