Пересечение траектории в питоне - PullRequest
0 голосов
/ 08 марта 2019

Я обнаруживаю людей и транспортные средства, используя tenorflow и python.Я рассчитываю траектории и прогнозирую их, используя фильтр Калмана, и подгоняю линию для прогнозирования траектории.

Моя проблема заключается в том, как мне найти пересечение и время столкновения между двумя траекториями?

Я пробовал пересечение между линиями, но подобранная линия - это не всегда две точки, это ломаная линия.Вот моя попытка:

 detections = tracker.update(np.array(z_box))

    for trk in detections[0]:
            trk = trk.astype(np.int32)
            helpers.draw_box_label(img, trk, trk[4])  # Draw the bounding boxes on the
            centerCoord = (((trk[1] +trk[3]) / 2), (trk[0] + trk[2]) / 2)
            point_lists[trk[4]].append(centerCoord)
            x = [i[0] for i in point_lists[trk[4]]]
            y = [i[1] for i in point_lists[trk[4]]]
            p = np.polyfit(x, y, deg=1)
            y = p[1] + p[0] * np.array(x)
            fitted = list(zip(x, y))
            cv2.polylines(img, np.int32([fitted]), False, color=(255, 0, 0))
            for other in detections[0]:
                other = other.astype(np.int32)
                if other[4] != trk[4]: # check for self ID
                    x2 = [i[0] for i in point_lists[other[4]]]
                    y2 = [i[1] for i in point_lists[other[4]]]
                    p2 = np.polyfit(x2, y2, deg=1)
                    y2 = p2[1] + p2[0] * np.array(x2)
                    other_fitted = list(zip(x2, y2))
                    if(line_intersection(fitted, other_fitted)):
                        print("intersection")
                    else:
                        print("not intersection")

1 Ответ

0 голосов
/ 12 марта 2019

это немного более широкая тема, поэтому я сосредоточусь только на математике / физике, так как у меня возникло ощущение, что часть CV / DIP уже обработана вами обоими спрашивающими (Андре Ахмедом и chris burgees ).

Для простоты я предполагаю линейное движение с постоянными скоростями. Итак, как это сделать:

  1. получить 2D положениекаждый объект на 2 отдельных кадра по истечении известного времени dt

    , поэтому получите двухмерную центральную (или угловую или любую другую) позицию на изображении для каждого рассматриваемого объекта.

  2. преобразовать их в 3D

    , поэтому, используя известные параметры камеры или известную информацию о фоновом режиме, вы можете отменить проекцию 2D-положения на экране в 3D-положение относительно камеры.Это избавит от нелинейных интерполяций, которые могут понадобиться в противном случае, если они будут обрабатываться точно так же, как в случае с 2D.

    Существует больше возможностей получения 3D-позиции в зависимости от того, что вы получили в свое распоряжение.Например, как это:

  3. получениефактическая скорость объектов

    вектор скорости просто:

    vel = ( pos(t+dt) - pos(t) )/dt
    

    , поэтому просто вычтите положения одного и того же объекта из 2 последовательных кадров и разделите на период частоты кадров (или интервал междуиспользуемые кадры).

  4. проверить каждые 2 объекта на столкновение

    это забавные вещи. Да, вы можете решить систему неравенств, таких как:

    | ( pos0 + vel0 * t ) - (pos1 + vel1 * t ) | <= threshold
    

    , но здесь я использовал более простой способ

    Идея состоит в том, чтобы вычислить t, где тестируемые объекты находятся ближе всего друг к другу (если приближаются друг к другу).

    , чтобы мы могли экстраполировать будущую позицию каждого объекта следующим образом:

    pos(t) = pos(t0) + vel*(t-t0)
    

    , где t - фактическое время, а t0 - сомВремя начала (например, t0=0).

    предположим, что у нас есть 2 объекта (pos0,vel0,pos1,vel1), которые мы хотим проверить, поэтому рассчитайте первые 2 итерации их расстояния так:

    pos0(0) = pos0;
    pos1(0) = pos1;
    dis0 = | pos1(0) - pos0(0) |
    
    pos0(dt) = pos0 + vel0*dt;
    pos1(dt) = pos1 + vel1*dt;
    dis1 = | pos1(dt) - pos0(dt) |
    

    где dt - достаточно малое время (чтобы не пропустить столкновение).Теперь if (dis0<dis1) затем объекты косят, поэтому столкновения нет, if (dis0==dis1) объекты не движутся или не движутся параллельно друг другу и только if (dis0>dis1) объекты приближаются друг к другу, поэтому мы можем оценить:

    dis(t) = dis0 + (dis1-dis0)*t
    

    и столкновение ожидает, что dis(t)=0, поэтому мы можем экстраполировать снова:

    0 = dis0 + (dis1-dis0)*t
    (dis0-dis1)*t = dis0 
    t = dis0 / (dis0-dis1)
    

    , где t - предполагаемое время столкновения.Конечно, все это обрабатывает все движения как линейные и много экстраполирует, поэтому это не точно, но, как вы можете сделать это для более последовательных кадров, и результат будет более точным со временем, близким к столкновению ... Также, чтобы убедиться, что вы должныэкстраполировать положение каждого объекта во время предполагаемого столкновения, чтобы проверить результат (если не столкновение, то экстраполяция была просто числовой, и объекты не сталкивались, просто находились рядом с каждым какое-то время)

    extrapolation

Как упоминалось ранее, преобразование в 3D (пуля # 2 ) не является необходимым, но избавляется отНелинейности, так что простая линейная интерполяция / экстраполяция может быть использована позже, значительно упрощает вещи.

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