Определение положения круглого объекта в видео opencv

#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)
 

Максимальные значения красного цвета

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