Я проверил вопрос здесь , но не нашел решения. Я пытаюсь использовать meanshift и camshift для отслеживания нескольких лиц, и я изменил код с здесь , чтобы использовать многопроцессорность (входные и выходные очереди как процессы). для всех обнаружений (выполняется с помощью детектора лица openvino):
iq = multiprocessing.Queue()
oq = multiprocessing.Queue()
inputQueues.append(iq)
outputQueues.append(oq)
p = multiprocessing.Process(
target=start_tracker_meanshift, #the function
args=(bb, confidence, frame, iq, oq))
p.daemon = True
p.start()
Здесь это делается для всех ограничивающих рамок, найденных на изображении.
Код для средних и распределенных сдвигов взят из здесь .
Я использую модифицированную функцию:
def start_tracker_meanshift(box, label, frame, inputQueue, outputQueue):
startX, startY, endX, endY = box
roi = frame[startY: endY, startX:endX]
hsv_roi = cv2.cvtColor(roi, cv2.COLOR_BGR2HSV)
mask = cv2.inRange(hsv_roi, np.array((0., 60., 32.)),
np.array((180., 255., 255.)))
roi_hist = cv2.calcHist([hsv_roi], [0], mask, [180], [0, 180])
cv2.normalize(roi_hist, roi_hist, 0, 255, cv2.NORM_MINMAX)
# Setup the termination criteria, either 10 iteration or move by atleast 1 pt
term_crit = (cv2.TERM_CRITERIA_EPS | cv2.TERM_CRITERIA_COUNT, 10, 1)
track_window = [startX, startY, endX-startX, endY-startY]
while(True):
frame = inputQueue.get()
plt.imshow(frame)
plt.show()
# print("got frame")
hsv = cv2.cvtColor(frame, cv2.COLOR_BGR2HSV)
if hsv is None:
continue
dst = cv2.calcBackProject([hsv], [0], roi_hist, [0, 180], 1)
# apply camshift to get the new location
print(track_window)
if track_window != []:
track_window[0] = max(1,track_window[0])
track_window[1] = max(1,track_window[1])
track_window[2] = max(1,track_window[2])
track_window[3] = max(1,track_window[3])
print(track_window)
ret, track_window = cv2.meanShift(dst, track_window,term_crit)
print("excepted")
else:
continue
# Draw it on image
pts = cv2.boxPoints(ret)
pts = np.int0(pts)
outputQueue.put((label, (startX, startY, endX, endY)))
return
То же самое для распредвала. Я проверил track_window и всегда являюсь прямоугольником, я пытался сохранить все значения больше 0, но все равно получаю сообщение об ошибке.
Полный возврат:
[894, 155, 123, 126]
Process Process-2:
Traceback (most recent call last):
File "C:\Users\sajan\AppData\Local\Programs\Python\Python36\lib\multiprocessing\process.py", line 258, in _bootstrap
self.run()
File "C:\Users\sajan\AppData\Local\Programs\Python\Python36\lib\multiprocessing\process.py", line 93, in run
self._target(*self._args, **self._kwargs)
File "F:\Semester 8\GeekyBee\Object_tracking\multi_object_tracking_fast.py", line 88, in start_tracker_meanshift
ret, track_window = cv2.meanShift(dst, track_window,term_crit)
cv2.error: OpenCV(4.1.2-openvino) C:\jenkins\workspace\OpenCV\OpenVINO\build\opencv\modules\video\src\camshift.cpp:64: error: (-5:Bad argument) Input window has non-positive sizes in function 'cv::meanShift'
Редактировать: I преобразовал track_window в кортеж, и он каким-то образом сработал (track_window = [startX, startY, endX-startX, endY-startY] to track_window = (startX, startY, endX-startX, endY-startY)
, но пример работает как со списком, так и с кортежем, поэтому я не уверен, в чем именно заключается проблема.