findContours
Finds contours in a binary image.
- C++:
findContours
(InputOutputArray image, OutputArrayOfArrays contours, OutputArray hierarchy, int mode, int method, Point offset=Point())
- C++:
findContours
(InputOutputArray image, OutputArrayOfArrays contours, int mode, int method, Point offset=Point())
- Python:
cv2.
findContours
(image, mode, method[, contours[, hierarchy[, offset]]]) → contours, hierarchy
- C:
cvFindContours
(CvArr* image, CvMemStorage* storage, CvSeq** first_contour, int header_size=sizeof(CvContour), int mode=CV_RETR_LIST, int method=CV_CHAIN_APPROX_SIMPLE, CvPoint offset=cvPoint(0,0) )
- Python:
cv.
FindContours
(image, storage, mode=CV_RETR_LIST, method=CV_CHAIN_APPROX_SIMPLE, offset=(0, 0)) → contours Parameters: - image – Source, an 8-bit single-channel image. Non-zero pixels are treated as 1’s. Zero pixels remain 0’s, so the image is treated as
binary
. You can usecompare()
,inRange()
,threshold()
,adaptiveThreshold()
,Canny()
, and others to create a binary image out of a grayscale or color one. The function modifies theimage
while extracting the contours. If mode equals toCV_RETR_CCOMP
orCV_RETR_FLOODFILL
, the input can also be a 32-bit integer image of labels (CV_32SC1
). - contours – Detected contours. Each contour is stored as a vector of points.
- hierarchy – Optional output vector, containing information about the image topology. It has as many elements as the number of contours. For each i-th contour
contours[i]
, the elementshierarchy[i][0]
,hiearchy[i][1]
,hiearchy[i][2]
, andhiearchy[i][3]
are set to 0-based indices incontours
of the next and previous contours at the same hierarchical level, the first child contour and the parent contour, respectively. If for the contouri
there are no next, previous, parent, or nested contours, the corresponding elements ofhierarchy[i]
will be negative. - mode –
Contour retrieval mode (if you use Python see also a note below).
- CV_RETR_EXTERNAL retrieves only the extreme outer contours. It sets
hierarchy[i][2]=hierarchy[i][3]=-1
for all the contours. - CV_RETR_LIST retrieves all of the contours without establishing any hierarchical relationships.
- CV_RETR_CCOMP retrieves all of the contours and organizes them into a two-level hierarchy. At the top level, there are external boundaries of the components. At the second level, there are boundaries of the holes. If there is another contour inside a hole of a connected component, it is still put at the top level.
- CV_RETR_TREE retrieves all of the contours and reconstructs a full hierarchy of nested contours. This full hierarchy is built and shown in the OpenCV
contours.c
demo.
- CV_RETR_EXTERNAL retrieves only the extreme outer contours. It sets
- method –
Contour approximation method (if you use Python see also a note below).
- CV_CHAIN_APPROX_NONE stores absolutely all the contour points. That is, any 2 subsequent points
(x1,y1)
and(x2,y2)
of the contour will be either horizontal, vertical or diagonal neighbors, that is,max(abs(x1-x2),abs(y2-y1))==1
. - CV_CHAIN_APPROX_SIMPLE compresses horizontal, vertical, and diagonal segments and leaves only their end points. For example, an up-right rectangular contour is encoded with 4 points.
- CV_CHAIN_APPROX_TC89_L1,CV_CHAIN_APPROX_TC89_KCOS applies one of the flavors of the Teh-Chin chain approximation algorithm. See [TehChin89] for details.
- CV_CHAIN_APPROX_NONE stores absolutely all the contour points. That is, any 2 subsequent points
- offset – Optional offset by which every contour point is shifted. This is useful if the contours are extracted from the image ROI and then they should be analyzed in the whole image context.
- image – Source, an 8-bit single-channel image. Non-zero pixels are treated as 1’s. Zero pixels remain 0’s, so the image is treated as
The function retrieves contours from the binary image using the algorithm [Suzuki85]. The contours are a useful tool for shape analysis and object detection and recognition. See squares.c
in the OpenCV sample directory.
Note
Source image
is modified by this function. Also, the function does not take into account 1-pixel border of the image (it’s filled with 0’s and used for neighbor analysis in the algorithm), therefore the contours touching the image border will be clipped.
Note
If you use the new Python interface then the CV_
prefix has to be omitted in contour retrieval mode and contour approximation method parameters (for example, use cv2.RETR_LIST
and cv2.CHAIN_APPROX_NONE
parameters). If you use the old Python interface then these parameters have the CV_
prefix (for example, use cv.CV_RETR_LIST
and cv.CV_CHAIN_APPROX_NONE
).
Note
- An example using the findContour functionality can be found at opencv_source_code/samples/cpp/contours2.cpp
- An example using findContours to clean up a background segmentation result at opencv_source_code/samples/cpp/segment_objects.cpp
- (Python) An example using the findContour functionality can be found at opencv_source/samples/python2/contours.py
- (Python) An example of detecting squares in an image can be found at opencv_source/samples/python2/squares.py
'OpenCV' 카테고리의 다른 글
형태 넓이 구하기 - contourArea (0) | 2017.11.15 |
---|---|
윤곽선 그리기 - DrawContours (0) | 2017.11.15 |
ROI설정 (0) | 2017.11.11 |
블러함수들 (0) | 2017.11.11 |
merge, split 함수 (0) | 2017.11.11 |