Opencv meanshift и camshift: (-5: неверный аргумент) Окно ввода имеет неположительные размеры в функции 'cv :: meanShift' - PullRequest
1 голос
/ 23 января 2020

Я проверил вопрос здесь , но не нашел решения. Я пытаюсь использовать 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), но пример работает как со списком, так и с кортежем, поэтому я не уверен, в чем именно заключается проблема.

...