cv2.convexityDefects выгоняет меня из al oop без ошибок - PullRequest
0 голосов
/ 11 марта 2020

Итак, я пытался выявить дефекты контура и его корпуса. Изучив несколько уроков, я натолкнулся на похожий код, но, как бы я его ни реализовывал, строка cv2.convexityDefects, кажется, выбивает меня из l oop, не отображая видео. Программа работает без части дефектов, и я не получаю никаких ошибок с частью дефектов, но кажется, что она заканчивается кодом.

    contours, H = cv2.findContours(thresh, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)

    contours = sorted(contours, key=cv2.contourArea, reverse=True)

    max_area = 0
    for i in range(len(contours)):  # finding largest contour by area [3]
        contour = contours[i]
        area = cv2.contourArea(contour)
        if area > max_area:
            max_area = area
            ci = i
    if len(contours) > 0:
        (x, y, w, h) = cv2.boundingRect(contours[ci])
        # cv2.rectangle(resized, (x, y), (x + w, y + h), (0, 255, 0), 2)
        moments = cv2.moments(contours[ci])
        if moments['m00'] != 0:  # this gives the centre of the moments [3]
            cx = int(moments['m10'] / moments['m00'])  # cx = M10/M00
            cy = int(moments['m01'] / moments['m00'])  # cy = M01/M00
        center = (cx, cy)
        cv2.circle(resized, center, 5, [0, 0, 255], 2)  # draws small circle at the center moment
        hull = cv2.convexHull(contours[ci])
        defects = cv2.convexityDefects(contours[ci], hull)

        if len(defects) > 0:
            for i in range(defects.shape[0]):
                s, e, f, d = defects[i, 0]
                start = tuple(contours[ci][s][0])
                end = tuple(contours[ci][e][0])
                far = tuple(contours[ci][f][0])
                cv2.line(resized, start, end, [0, 255, 0], 2)
                cv2.circle(resized, far, 5, [0, 0, 255], -1)
        else:
            cv2.drawContours(resized, [contours[ci]], 0, (0, 255, 0), 2)
            cv2.drawContours(resized, [hull], 0, (0, 0, 255), 2)

Если кто-то сталкивался с подобной проблемой или знает, где я Я ошибаюсь, это будет большая помощь.

1 Ответ

0 голосов
/ 12 марта 2020

Таким образом, причина, по которой вы не видите никаких ошибок, заключается в том, что вы пытаетесь поймать блок. Обычно с помощью блока catch вы должны «ловить» ошибки. У вас есть два варианта, чтобы увидеть вашу ошибку:

  1. Удалите операторы try, catch. Вы увидите полную ошибку здесь

  2. Запись

catch Exception as e:
     print(e)
     break

Тогда вы увидите, что у вас есть ValueError: too many values to unpack (expected 2). Из того, что я видел в Интернете, кажется, что вы можете основывать свой код на примере, который использует версию OpenCV, отличную от вашей. Я не уверен, что вы используете, но имейте в виду, что есть OpenCV2, OpenCV3 и OpenCV4, а затем они имеют свои второстепенные версии.

Редактировать:
На самом деле, я только что понял, что у вас может быть другая версия OpenCV. Я использую Opencv 3.4.2 с Python3, который я установил с pip3. У вас может быть другая ошибка. Я действительно обнаружил, что проблема в cv2.findContours, а не cv2.convexityDefects, поэтому у вас может не быть ValueError. Поймайте исключение или удалите операторы try, catch, и вы сможете найти свою проблему и найти решение в Google.

...