Окклюзия с камшифтом

Я работаю над отслеживанием объектов по алгоритму смещения. В настоящее время я использую встроенный код opencv, в котором у меня проблемы с окклюзией.

  hsv = cv2.cvtColor(self.frame, cv2.COLOR_BGR2HSV)
  mask = cv2.inRange(hsv, np.array((0., 60., 32.)), np.array((180., 255., 255.)))
  prob = cv2.calcBackProject([hsv], [0], self.hist, [0, 180], 1)
  cv2.imshow('prob_0',prob)
  prob &= mask
  cv2.imshow('prob',prob)
  term_crit = ( cv2.TERM_CRITERIA_EPS | cv2.TERM_CRITERIA_COUNT, 10, 1 )
  track_box, self.track_window = cv2.CamShift(prob, self.track_window, term_crit)

Моя проблема заключается в том, что в этом коде, когда мой объект, который представляет собой красный шар, выходит из поля зрения камеры или если я закрываю какую-то часть шара рукой, он падает и выдает ошибку, которая:

   track_box, self.track_window = cv2.CamShift(prob, self.track_window, term_crit)
   error: ..\..\..\..\opencv\modules\video\src\camshift.cpp:80: error: (-5) Input           
   window has non-positive sizes in function cvMeanShift

Это потому, что мой параметр для cv2.Camshift ->, который является "prob", не имеет значений, соответствующих моему шару (prob - это полученное двоичное изображение, которое состоит из порогового шара)

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

Так может кто-нибудь помочь мне, как бороться с окклюзией в этой ситуации с мячом.

3 ответа

В OpenCV я столкнулся с той же проблемой зависания программы, когда не было объекта для отслеживания. Позже я решил это.

РЕШИТЬ ЭТО:

1) Сначала вычислите meanShift, которое возвращает количество итераций, которое потребовалось для схождения. 2) если (iteration_meanShift!= 0), тогда вычислите CamShift и верните bounding_box+frame. Иначе верните только кадр.

то есть, если и только если средство смещения не равно нулю, рассчитайте смещение, иначе не рассчитывайте смещение.

Убедитесь, что self.track_window не является None. Спасибо

Просто используйте блок try catch или простой оператор if. Выполнить оператор CamShift, только если переменная prob имеет действительное значение

 if not prob:
//do nothing or print an error statement since ball is occluded
else:
track_box, self.track_window = cv2.CamShift(prob, self.track_window, term_crit)
Другие вопросы по тегам