Бета-версия OpenCV 3.0.0: ошибка рисования контуров

Я изучал бета-документацию OpenCV 3.0.0 о начале работы с контурами и столкнулся с несколькими ошибками при попытке использовать код контура из документации. Я понятия не имею, как это исправить, может ли кто-нибудь мне помочь?

Документация Я скопировал код из: http://docs.opencv.org/trunk/doc/py_tutorials/py_imgproc/py_contours/py_contours_begin/py_contours_begin.html#contours-getting-started

Тестовая картинка для нанесения контура:

http://www.k6-geometric-shapes.com/image-files/pyramid-base-rectangle.jpg

Строка кода, вызвавшая ошибку:

cv2.drawContours(img, contours, 3, (0,255,0), 3)

Ошибка:

Traceback (most recent call last):
  File "/home/anthony/Documents/Programming/Python/Computer-Vision/OpenCV-Doc/contour-draw.py", line 13, in <module>
    cv2.drawContours(img, contours, 3, (0,255,0), 3)
error: /home/anthony/Downloads/opencv-3.0.0-beta/modules/imgproc/src/drawing.cpp:2160: error: (-215) 0 <= contourIdx && contourIdx < (int)last in function drawContours

Есть еще одна функция drawContour, которая не работает. Как только я прокомментирую вышеприведенную и прокомментирую другую функцию (ниже), она выдаст другую ошибку.

Строка кода:

cnt = contours[4]
cv2.drawContours(img, [cnt], 0, (0,255,0), 3)

Ошибка: трассировка (последний последний вызов): файл «/home/anthony/Documents/Programming/Python/Computer-Vision/OpenCV-Doc/contour-draw.py», строка 15, в cnt = контуры [4] IndexError: индекс списка вне допустимого диапазона

Есть две другие функции drawContours, которые закомментированы. Есть бордюрный, который может успешно создавать контур картинки, но по каким-то причинам выдает контур окна.

Код:

import numpy as np
import cv2

img = cv2.imread('rectangle-pink.jpg')
imgray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
ret,thresh = cv2.threshold(imgray,127,255,0)
_,contours, hierarchy = cv2.findContours(thresh,cv2.RETR_TREE,cv2.CHAIN_APPROX_SIMPLE)

#Displays the border
#cv2.drawContours(img, contours, -1, (0,255,0), 3)


cv2.drawContours(img, contours, 3, (0,255,0), 3)

#cnt = contours[4]
#cv2.drawContours(img, [cnt], 0, (0,255,0), 3)

cv2.imshow('Contour Pic', img)
cv2.waitKey(0)
cv2.destroyAllWindows()

person user3377126    schedule 06.01.2015    source источник
comment
если он не нашел никаких контуров, контуры[4] недействительны. вам всегда нужно проверять len(contours) перед индексацией.   -  person berak    schedule 06.01.2015
comment
Я проверил длину контуров, и длина оказалась равной 2. Однако контуры[4] я взял из официальной документации OpenCV. Что я делаю? Это из-за тестового изображения, которое я выбрал?   -  person user3377126    schedule 06.01.2015
comment
да, это определенно зависит от содержимого изображения. просто поймите, что len(contours) - 1 - это самый большой допустимый индекс, к которому вы можете получить доступ.   -  person berak    schedule 06.01.2015
comment
Изображение, которое использовалось в документации OpenCV, было прямоугольником, и моя фотография тоже была прямоугольником. Я думал, что программа будет работать с изображением так же, как в документации OpenCV. Любые идеи о том, почему эта картинка будет работать (k6-geometric -shapes.com/image-files/pyramid-base-rectangle.jpg)?   -  person user3377126    schedule 06.01.2015


Ответы (1)


В моем случае, если я использую индекс как len(contours)-1, в какой-то момент len(contours) становится равным нулю, и отображается ошибка:

indexError: индекс списка вне допустимого диапазона

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

if len(contours)>0 :
   cnt=contours[len(contours)-1]
   cv2.drawContours(img, [cnt], 0, (0,255,0), 3)
person Rohitsam    schedule 13.07.2016