Я получаю в реальном времени контуры движущихся объектов с помощью камеры и 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](https://i.stack.imgur.com/wHdyg.png)
Маленькие белые кружки являются точками контура. Их координаты отображаются правильно (я проверил вручную).
Большой зеленый круг имеет фиксированное положение в (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