#python #opencv #image-processing
#python #opencv #обработка изображений
Вопрос:
У меня есть видео с движущимся красным шаром посередине, и я хочу, чтобы программа возвращала положение этого объекта на протяжении всего видео. Я прочитал много примеров в Интернете, но я не уверен, какой лучший способ сделать это в opencv.
import cv2
import numpy as np
coords = []
# Open the video
cap = cv2.VideoCapture('video-4.mp4')
# Initialize frame counter
while(1):
# Take each frame
_, frame = cap.read()
# Convert BGR to HSV
hsv = cv2.cvtColor(frame, cv2.COLOR_BGR2HSV)
# define range of blue color in HSV
lower_red = np.array([100, 150, 0])
upper_red = np.array([140, 255, 255])
imgThreshHigh = cv2.inRange(hsv, lower_red, upper_red)
thresh = imgThreshHigh.copy()
countours,_ = cv2.findContours(thresh, cv2.RETR_LIST,cv2.CHAIN_APPROX_SIMPLE)
for cnt in countours:
area = cv2.contourArea(cnt)
best_cnt = cnt
M = cv2.moments(best_cnt)
cx,cy = int(M['m10']/M['m00']), int(M['m01']/M['m00'])
coord = cx, cy
print(coord)
cv2.imshow('frame',frame)
cv2.imshow('Object',thresh)
k = cv2.waitKey(5) amp; 0xFF
if k == 27:
break
cv2.destroyAllWindows()
Я не уверен, почему, но он обрабатывает только несколько кадров видео, а не все.
Комментарии:
1. Считывайте видео кадр за кадром. Для каждого кадра определите красную точку (центроид кластера красного цвета)
2. @Epsi95 спасибо, но какой точный метод я должен использовать, должен ли я использовать cv2.moment или что-то в этом роде
3. проверьте этот блог pyimagesearch.com/2014/07/21 /…
4. Вы хотите просто «отслеживать» или «обнаруживать отслеживать»? Если координаты в первом кадре определяются вручную, это становится гораздо более простой проблемой. Если вы также хотите автоматическое обнаружение … пожалуйста, обновите вопрос…
Ответ №1:
Мне непонятно, как best_cnt
выбирается контур. Сейчас он просто выбирает последний. Я думаю, что он предназначался для фильтрации по размеру, чтобы убедиться, что был выбран маленький красный круг, но он этого не делает. Возможно, отброшенные кадры происходят из-за того, что последний контур в списке не является красным кругом. Я бы попытался отфильтровать по размеру и сохранить контур меньше заданной максимальной области.
Кроме того, похоже, что диапазон фильтров красного цвета отключен. Я мог обнаружить только шар, меняющий значения красного фильтра на:
lower_red = np.array([170, 0, 190])
upper_red = np.array([179, 255, 255])
Для этого я вычислил минимальные и максимальные значения в небольшой области вокруг красного круга:
plt.imshow(hsv[255:275, 170:190, :])
np.min(hsv[255:275, 170:190, :], axis=0)
np.max(hsv[255:275, 170:190, :], axis=0)
И выбрал минимальные и максимальные значения, чтобы дать некоторое пространство для маневра для изменения красного цвета в разных кадрах. Для этого потребуется точная настройка с использованием всех кадров в вашем видео, чтобы убедиться, что ни один оттенок красного не пропущен с использованием этих ограничений.