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

Я работаю над отслеживанием объектов по алгоритму camshift. В настоящее время я использую встроенный код 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 ->, который является «вероятностью», не имеет значений, соответствующих моему шару (вероятность — это полученное двоичное изображение, состоящее из шара с порогом)

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

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


person kushal    schedule 30.07.2014    source источник


Ответы (3)


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

Чтобы РЕШИТЬ ЭТО:

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

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

person Gautam Krishna    schedule 05.01.2015

Просто используйте блок 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)
person Darshan    schedule 31.07.2014
comment
prob - это массив. Таким образом, истинное значение массива будет неоднозначным. Я пробовал это перед этим.. Не сработало - person kushal; 31.07.2014

Убедитесь, что значение self.track_window не равно None. спасибо

person Gabriel Bursztyn    schedule 18.07.2016