OpenCV: сбой вычисления расстояния от точек контура до объекта-пигмея - PullRequest
1 голос
/ 05 апреля 2020

Я получаю в реальном времени контуры движущихся объектов с помощью камеры и OpenCV. Он запускается в окне Pygame:

           # Find contours on thresholded image
           nada, contours, nada = cv2.findContours(frame5.copy(), cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)

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

           for i in contours:
              for j in range(len(i)):
                 coordinates = i[j][0]
                 pygame.draw.circle(screen, WHITE, coordinates, 1, 0)

enter image description here

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

Большой зеленый круг имеет фиксированное положение в (960, 540).

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

Для этого я рассчитываю расстояние каждой точки контура до зеленого круга, а тот, у которого наименьшее расстояние, отображается в виде большого синего круга. Однако, как вы можете видеть на рисунке, синий круг находится далеко от зеленого круга.

Что я делаю не так? Функция расстояния работает, я проверил ее вручную, рассчитав расстояние только в 1 пункт до зеленого круга.

Вот соответствующий фрагмент кода:

     ...

     while True:

        ...

        screen.fill(BLACK)

        # Find contours on thresholded image
        nada, contours, nada = cv2.findContours(frame5.copy(), cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)

        if len(contours) != 0:
            distanceList = []

            for i in contours:
                for j in range(len(i)):
                    coordinates = i[j][0]

                    # rigidbody.x and .y represents green circle's coordinates
                    distanceList.append(math.sqrt((rigidbody.x - coordinates[0]) ** 2 + (rigidbody.y - coordinates[1]) ** 2))
                    minDistance = distanceList[0]

                    # Find smallest distance of all contour points
                    if distanceList[j] < minDistance:
                        minCoordinates = coordinates

            for i in contours:
                for j in range(len(i)):
                    coordinates = i[j][0]
                    pygame.draw.circle(screen, WHITE, coordinates, 1, 0) # Render white contour points
                    pygame.draw.circle(screen, BLUE, minCoordinates, 50, 0)  # Render closest contour point to game object

EDIT

Я понял, что минимизатор расстояния не минимизирует:

                # Find smallest distance of all contour points
                if distanceList[j] < minDistance:
                    print(frame)
                    print(distanceList[j])
                    minCoordinates = coordinates

Так что для кадра № 106 значения увеличиваются и уменьшаются. Но оно должно только уменьшаться.

Frame: 106
Distance:365.6364314452268

Frame: 106
Distance: 357.816992329878

Frame: 106
Distance: 359.133679846377

1 Ответ

2 голосов
/ 06 апреля 2020

Вам не нужно отслеживать все расстояния, чтобы найти минимальное расстояние, вы можете сделать это только с текущим / последним расстоянием.

Инициализируйте minDistance с помощью float('inf') вне циклов.

Тогда используйте это условие:

if distanceList[-1] < minDistance:
   minDistance = distanceList[-1]
   minCoordinates = coordinates
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...