Я выполняю отслеживание движения объекта, и я пытаюсь идентифицировать переднюю и заднюю части объекта. Объект асимметричен, что означает, что центр тяжести контура ближе к фронту, чем сзади. Используя эту информацию, я подхожу это следующим образом:Как получить начальную и конечную координаты (x, y) главной оси вращающегося эллипса в opencv?
Нарисуйте контуры объекта
Поиск медиан
centroidx, centroidy = int(moments['m10']/moments['m00']), int(moments['m10']/moments['m00'])
Draw ограничивающего эллипс
cv2.fitEllipse(contour)
Расчет основных длины оси следующим образом (и, как показано в fi фигура)
MAx, MAy = int(0.5 * ellipseMajorAxisx*math.sin(ellipseAngle)), int(0.5 * ellipseMajorAxisy*math.cos(ellipseAngle))
Вычислить начало и окончание х, у координаты главной оси
MAxtop, MAytop = int(ellipseCentrex + MAx), int(ellipseCentrey + MAy) MAxbot, MAybot = int(ellipseCentrex - MAx), int(ellipseCentrey - MAy)
определить, какие из точек находится ближе к центру тяжести контура
distancetop = math.sqrt((centroidx - MAxtop)**2 + (centroidy - MAytop)**2) distancebot = math.sqrt((centroidx - MAxbot)**2 + (centroidy - MAybot)**2) min(distancetop, distancebot)
Проблема, с которой я сталкиваюсь, в то время как я получаю «передний» конец эллипса правильно в большинстве случаев, иногда это немного. Насколько я заметил, это похоже на то, что значение x верное, но значение y отличается (по сути, я думаю, что это представляет собой большую ось эллипса, перпендикулярную моей). Я не уверен, что это проблема с вычислением углов opencv или (более чем вероятно) мои вычисления неверны. Я понимаю, что это сложный пример, надеюсь, что мои цифры помогут!
EDIT: Когда я получаю неправильный момент, это не от перпендикулярного эллипса, но зеркальное отражение моего эллипса. И это происходит со значениями х, а не только у.
Следующее предложение ssm ниже, я получаю желаемую точку большую часть времени. Точка по-прежнему происходит неправильно, но «быстро возвращается» на место вскоре после этого. Например, это несколько кадров, когда это происходит:
Кстати, вышеуказанные изображения после «коррекции» для угла, используя этот код:
if angle > 90:
angle = 180 - angle
Если я не делаю коррекция, я получаю неправильную точку в другое время, как показано ниже для тех же кадров.
Похоже, что я получаю это правильно для некоторых углов с коррекцией угла, а другие углы без коррекции. Как получить все правильные точки в обоих условиях?
(Белая точка внутри эллипса центр тяжести контура, в то время как точка или вне эллипса точки я получаю)
В питона, вы можете сделать 'MAytop, MAybot = MAybot, MAytop'. –
Ох. Я этого не понимал. Но теперь, когда вы говорите, что я вижу внутреннее преобразование в кортеж и обратно. Это так очевидно, и я даже не думал об этом все это время. Благодаря!! – ssm
@ssm Спасибо, это улучшает отслеживание, но проблема сохраняется, и похоже, что это может быть связано с углом? (см. мое редактирование в оригинальном вопросе). – srao