Мой код python имел ошибку ValueError при использовании cv2.findContours () в python. -> недостаточно значений для распаковки (ожидается 3, получено 2) - PullRequest
0 голосов
/ 17 апреля 2020

, когда я пытался запустить его, оболочка выдавала ошибку: строка 48, в nada, contours, nada = cv2.findContours (frame5.copy (), cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE) ValueError: недостаточно значений для распаковки (ожидается 3, получено 2)

Пожалуйста, помогите мне исправить это. Заранее спасибо.

# master frame
master = None

while 1:

    # grab a frame
    (grabbed,frame0) = camera.read()

    # end of feed
    if not grabbed:
        break

    # gray frame
    frame1 = cv2.cvtColor(frame0,cv2.COLOR_BGR2GRAY)

    # blur frame
    frame2 = cv2.GaussianBlur(frame1,(15,15),0)

    # initialize master
    if master is None:
        master = frame2
        continue

    # delta frame
    frame3 = cv2.absdiff(master,frame2)

    # threshold frame
    frame4 = cv2.threshold(frame3,15,255,cv2.THRESH_BINARY)[1]

    # dilate the thresholded image to fill in holes
    kernel = np.ones((2,2),np.uint8)
    frame5 = cv2.erode(frame4,kernel,iterations=4)
    frame5 = cv2.dilate(frame5,kernel,iterations=8)

    # find contours on thresholded image
    nada,contours,nada = cv2.findContours(frame5.copy(),cv2.RETR_EXTERNAL,cv2.CHAIN_APPROX_SIMPLE)

    # make coutour frame
    frame6 = frame0.copy()

    # target contours
    targets = []

    # loop over the contours
    for c in contours:

        # if the contour is too small, ignore it
        if cv2.contourArea(c) < 500:
                continue

        # contour data
        M = cv2.moments(c)#;print( M )
        cx = int(M['m10']/M['m00'])
        cy = int(M['m01']/M['m00'])
        x,y,w,h = cv2.boundingRect(c)
        rx = x+int(w/2)
        ry = y+int(h/2)
        ca = cv2.contourArea(c)

        # plot contours
        cv2.drawContours(frame6,[c],0,(0,0,255),2)
        cv2.rectangle(frame6,(x,y),(x+w,y+h),(0,255,0),2)
        cv2.circle(frame6,(cx,cy),2,(0,0,255),2)
        cv2.circle(frame6,(rx,ry),2,(0,255,0),2)

        # save target contours
        targets.append((cx,cy,ca))

    # make target
    mx = 0
    my = 0
    if targets:

        # average centroid adjusted for contour size
        #area = 0
        #for x,y,a in targets:
        #    mx += x*a
        #    my += y*a
        #    area += a
        #mx = int(round(mx/area,0))
        #my = int(round(my/area,0))

        # centroid of largest contour
        area = 0
        for x,y,a in targets:
            if a > area:
                mx = x
                my = y
                area = a


    # plot target
    tr = 50
    frame7 = frame0.copy()
    if targets:
        cv2.circle(frame7,(mx,my),tr,(0,0,255,0),2)
        cv2.line(frame7,(mx-tr,my),(mx+tr,my),(0,0,255,0),2)
        cv2.line(frame7,(mx,my-tr),(mx,my+tr),(0,0,255,0),2)

    # update master
    master = frame2

    # display
    cv2.imshow("Frame0: Raw",frame0)
    cv2.imshow("Frame1: Gray",frame1)
    cv2.imshow("Frame2: Blur",frame2)
    cv2.imshow("Frame3: Delta",frame3)
    cv2.imshow("Frame4: Threshold",frame4)
    cv2.imshow("Frame5: Dialated",frame5)
    cv2.imshow("Frame6: Contours",frame6)
    cv2.imshow("Frame7: Target",frame7)

    # key delay and action
    key = cv2.waitKey(1) & 0xFF
    if key == ord('q'):
        break
    elif key != 255:
        print('key:',[chr(key)])

# release camera
camera.release()

# close all windows
cv2.destroyAllWindows()

1 Ответ

0 голосов
/ 17 апреля 2020

Проблема основана на очень простой просьбе с вашей стороны.

nada,contours,nada = cv2.findContours(frame5.copy(),cv2.RETR_EXTERNAL,cv2.CHAIN_APPROX_SIMPLE)

Вы ожидаете 3 переменные от этой функции, но она возвращает только две. Вы можете прочитать спецификации библиотеки и, возможно, увидеть, что вы сделали не так.

...