Окклюзия с камшифтом
Я работаю над отслеживанием объектов по алгоритму смещения. В настоящее время я использую встроенный код 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. Иначе верните только кадр.
то есть, если и только если средство смещения не равно нулю, рассчитайте смещение, иначе не рассчитывайте смещение.
Просто используйте блок 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)