Opencv meanshift和camshift:(5:参数不正确)输入窗口在函数“cv::meanshift”中具有非正大小

2024-05-15 11:09:14 发布

您现在位置:Python中文网/ 问答频道 /正文

我检查了问题{a1},但没有找到解决办法。我正在尝试使用meanshift和camshift进行多面跟踪,并且我已经将代码从here修改为使用多处理(输入和输出队列作为进程)。 对于所有检测(使用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()

在这里,对图像中找到的所有边界框执行此操作

meanshift和camshift的代码取自here

我正在使用的修改函数是:

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

camshift也一样。我已经检查了track_窗口,它始终是一个矩形,我试图每次都将所有值保持在大于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'

编辑: 我将track_窗口转换为tuple,它以某种方式工作(track_window = [startX, startY, endX-startX, endY-startY] to track_window = (startX, startY, endX-startX, endY-startY)),但是这个示例同时适用于list和tuple,所以我不确定实际的问题是什么


Tags: trackwindowmultiprocessingcv2hsvframestarthist