2016-01-30 4 views
2

Я выполняю отслеживание движения объекта, и я пытаюсь идентифицировать переднюю и заднюю части объекта. Объект асимметричен, что означает, что центр тяжести контура ближе к фронту, чем сзади. Используя эту информацию, я подхожу это следующим образом:Как получить начальную и конечную координаты (x, y) главной оси вращающегося эллипса в opencv?

  1. Нарисуйте контуры объекта

  2. Поиск медиан

    centroidx, centroidy = int(moments['m10']/moments['m00']), int(moments['m10']/moments['m00'])
  3. Draw ограничивающего эллипс

    cv2.fitEllipse(contour)
  4. Расчет основных длины оси следующим образом (и, как показано в fi фигура)

    MAx, MAy = int(0.5 * ellipseMajorAxisx*math.sin(ellipseAngle)), int(0.5 * ellipseMajorAxisy*math.cos(ellipseAngle))
  5. Вычислить начало и окончание х, у координаты главной оси

    MAxtop, MAytop = int(ellipseCentrex + MAx), int(ellipseCentrey + MAy) 
    MAxbot, MAybot = int(ellipseCentrex - MAx), int(ellipseCentrey - MAy)
  6. определить, какие из точек находится ближе к центру тяжести контура

    distancetop = math.sqrt((centroidx - MAxtop)**2 + (centroidy - MAytop)**2) 
    distancebot = math.sqrt((centroidx - MAxbot)**2 + (centroidy - MAybot)**2) 
    min(distancetop, distancebot)

Проблема, с которой я сталкиваюсь, в то время как я получаю «передний» конец эллипса правильно в большинстве случаев, иногда это немного. Насколько я заметил, это похоже на то, что значение x верное, но значение y отличается (по сути, я думаю, что это представляет собой большую ось эллипса, перпендикулярную моей). Я не уверен, что это проблема с вычислением углов opencv или (более чем вероятно) мои вычисления неверны. Я понимаю, что это сложный пример, надеюсь, что мои цифры помогут!

Position1 Position2

EDIT: Когда я получаю неправильный момент, это не от перпендикулярного эллипса, но зеркальное отражение моего эллипса. И это происходит со значениями х, а не только у.

Следующее предложение ssm ниже, я получаю желаемую точку большую часть времени. Точка по-прежнему происходит неправильно, но «быстро возвращается» на место вскоре после этого. Например, это несколько кадров, когда это происходит: improved

Кстати, вышеуказанные изображения после «коррекции» для угла, используя этот код:

 if angle > 90: 
      angle = 180 - angle 

Если я не делаю коррекция, я получаю неправильную точку в другое время, как показано ниже для тех же кадров. angle not corrected

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

(Белая точка внутри эллипса центр тяжести контура, в то время как точка или вне эллипса точки я получаю)

ответ

1

Я думаю, что ваша единственная проблема заключается в MAytop. Вы можете рассмотреть возможность сделать следующее:

if ycen<yc: 
    # switch MAytop and MAybot 
    temp = MAytop 
    MAytop = MAybot 
    MAybot = temp 

Вы, возможно, придется сделать аналогичную проверку на х - масштаб

+3

В питона, вы можете сделать 'MAytop, MAybot = MAybot, MAytop'. –

+0

Ох. Я этого не понимал. Но теперь, когда вы говорите, что я вижу внутреннее преобразование в кортеж и обратно. Это так очевидно, и я даже не думал об этом все это время. Благодаря!! – ssm

+0

@ssm Спасибо, это улучшает отслеживание, но проблема сохраняется, и похоже, что это может быть связано с углом? (см. мое редактирование в оригинальном вопросе). – srao

Смежные вопросы