FindContours and drawContours errors in opencv 3 beta / python

I am trying to run an example from here .

import numpy as np import cv2 img = cv2.imread('final.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) cv2.drawContours(img, contours, -1, (0,255,0), 3) 

Mistake

  Traceback (most recent call last): File "E:\PC\opencv3Try\findCExample.py", line 7, in <module> contours, hierarchy = cv2.findContours(thresh,cv2.RETR_TREE,cv2.CHAIN_APPROX_SIMPLE) ValueError: too many values to unpack (expected 2) 

If I remove the "hierarchy", an error occurs in drawContours:

 TypeError: contours is not a numpy array, neither a scalar 

If I use the contours [0] in drawContours

 cv2.error: E:\opencv\opencv\sources\modules\imgproc\src\drawing.cpp:2171: error: (-215) npoints > 0 in function cv::drawContours 

What problems could be here?

+9
python opencv
source share
4 answers

opencv 3 has a slightly modified syntax here, return values ​​are different:

 cv2.findContours(image, mode, method[, contours[, hierarchy[, offset]]]) β†’ image, contours, hierarchy 
+12
source share

After answering berak, just adding calls [-2:] to findContours() makes them work for both OpenCV 2.4 and 3.0:

 contours, hierarchy = cv2.findContours(...)[-2:] 
+12
source share

I am facing the same problem before I use this code to fix this. Im using 3.1 anyway.

 (_,contours,_) = cv2.findContours( thresh.copy(), cv2.RETR_LIST, cv2.CHAIN_APPROX_SIMPLE ) 
+1
source share

cv2.findContours() may have different return signatures depending on the version of OpenCV.

In OpenCV 3.4.X, cv2.findContours() returns 3 elements

 image, contours, hierarchy = cv.findContours(image, mode, method[, contours[, hierarchy[, offset]]]) 

In OpenCV 2.X and 4.1.X, cv2.findContours() returns 2 elements

 contours, hierarchy = cv.findContours(image, mode, method[, contours[, hierarchy[, offset]]]) 

You can easily get outlines regardless of a version like this:

 cnts = cv2.findContours(image, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE) cnts = cnts[0] if len(cnts) == 2 else cnts[1] for c in cnts: ... 
+1
source share

All Articles