函数调用:
void findContours ( InputOutputArray image,OutputArrayOfArrays contours,int mode,int method,Point offset = Point())
参数详解如下:
image - Source,一个8位单通道图像。非零像素被视为1。零像素保持为0,因此图像被视为 二进制。您可以使用 compare(), inRange(), threshold(), adaptiveThreshold(), Canny()等来从灰度或彩色图像中创建二进制图像。该功能 在提取轮廓时修改 图像。如果mode等于CV_RETR_CCOMP或CV_RETR_FLOODFILL,则输入也可以是标签的32位整数图像(CV_32SC1)。
轮廓 - 检测到的轮廓。每个轮廓都存储为点矢量。
hierarchy - 可选输出向量,包含有关图像拓扑的信息。它具有与轮廓数量一样多的元素。对于每个第i个轮廓 轮廓[i],元素 层次[i] [0], 层次[i] [1], 层次[i] [2]和 层次[i] [3] 被设置为0-基于指数 的轮廓 下一个和先前轮廓在同一层次,第一个孩子轮廓和母轮廓,分别。如果轮廓 i 没有下一个,前一个,父级或嵌套轮廓,则层次结构[i]的相应元素 将为负数。
mode -
轮廓检索模式(如果使用Python,请参阅下面的注释)。
CV_RETR_EXTERNAL查找外边缘,各边缘以指针h_next相连,它设置所有的轮廓hierarchy[i][2=hierarchy[i][3]]=-1。
CV_RETR_LIST检索所有轮廓而不建立任何层次关系。
CV_RETR_CCOMP检索所有轮廓并将它们组织成两级层次结构。在顶层,组件有外部边界。在第二层,有孔的边界。如果连接组件的孔内有另一个轮廓,它仍然位于顶层。
CV_RETR_TREE检索所有轮廓并重建嵌套轮廓的完整层次结构。这个完整的层次结构是在OpenCV contours.c 演示中构建和显示的 。
方法 -
轮廓近似方法(如果使用Python,请参见下面的注释)。
CV_CHAIN_APPROX_NONE绝对存储所有轮廓点。也就是说,轮廓的任何2个后续点(x1,y1)和(x2,y2)将是水平,垂直或对角线邻居,即max(abs(x1-x2),abs(y2-y1)) == 1。
CV_CHAIN_APPROX_SIMPLE压缩水平,垂直和对角线段,仅留下其端点。例如,右上方的矩形轮廓用4个点编码。
CV_CHAIN_APPROX_TC89_L1,CV_CHAIN_APPROX_TC89_KCOS应用了Teh-Chin链式近似算法的一种风格。有关详细信息,请参阅 [TehChin89]。
offset - 每个轮廓点移动的可选偏移量。如果从图像ROI中提取轮廓然后应在整个图像上下文中分析轮廓,则这非常有用。
实际应用:
findContours( canny_output, contours, hierarchy, CV_RETR_TREE, CV_CHAIN_APPROX_SIMPLE, Point(0, 0) );
函数调用:
cv2.findContours(image, mode, method[, contours[, hierarchy[, offset]]]) → image, contours, hierarchy
python调用cv2.findContours时报错:ValueError: not enough values to unpack (expected 3, got 2)
原因:OpenCV旧版,返回三个参数:
img, contours, hierarchy = cv2.findContours(mask, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)
OpenCV 新版调用,返回两个参数:
contours, hierarchy = cv2.findContours(mask, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)
实际应用-----Python:
image , contours , hierarchy = cv2.findContours ( binary , cv2.RETR_EXTERNAL , cv2.CHAIN_APPROX_SIMPLE )
函数调用:
void drawContours ( InputOutputArray image,InputArrayOfArrays contours,int contourIdx,const Scalar&color,int thickness = 1,int lineType = LINE_8,InputArray hierarchy = noArray(),int maxLevel = INT_MAX,Point offset = Point())
参数详解如下:
image - 目标图像。
contours - 所有输入轮廓。每个轮廓都存储为点矢量。
contourIdx - 指示要绘制的轮廓的参数。如果是负数,则绘制所有轮廓。
Scalar&color- 轮廓的颜色。
thickness - 绘制轮廓线条的粗细。如果它是负的(例如, 厚度= CV_FILLED),则绘制轮廓内部。
lineType - 线路连接。有关 详细信息,请参阅 line()。
hierarchy - 有关层次结构的可选信息。只有在想要绘制一些轮廓时才需要它(参见 maxLevel)。
maxLevel - 绘制轮廓的最大级别。如果为0,则仅绘制指定的轮廓。如果为1,则该函数绘制轮廓和所有嵌套轮廓。如果为2,则该函数绘制轮廓,所有嵌套轮廓,所有嵌套到嵌套轮廓,等等。仅当有 可用的层次结构时才考虑此参数 。
offset - 可选的轮廓偏移参数。按指定的方式移动所有绘制的轮廓 \ texttt {偏移量} =(DX,DY)。
contour - 指向第一个轮廓的指针。
external_color - 外部轮廓的颜色。
hole_color - 内部轮廓(孔)的颜色。
实际应用:
Mat drawing = Mat::zeros( canny_output.size(), CV_8UC3 );
函数调用:
cv2.drawContours(image, contours, contourIdx, color[, thickness[, lineType[, hierarchy[, maxLevel[, offset]]]]]) → image
实际应用-----Python:
cv2.drawContours(img,contours,-1,(0,0,255),3)
import cv2
img=cv2.imread('github1.jpg')
img = cv2.resize(img,(400, 400), interpolation = cv2.INTER_CUBIC)
cv2.imshow("img",img)
gray=cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
ret,binary=cv2.threshold(gray,127,255,cv2.THRESH_BINARY)
contours,hierarchy=cv2.findContours(binary,cv2.RETR_TREE,cv2.CHAIN_APPROX_SIMPLE)
cv2.drawContours(img,contours,-1,(0,0,255),3)
cv2.imshow("findContours",img)
cv2.waitKey(0)