OpenCV关于图片语法(轮廓角点)小结④

前言:
轮廓可以简单认为成连续的点(连着边界)连在一起的曲线,具有相同的颜色或者灰度。

1. cv2.arcLength()

retval=cv.arcLength(curve, closed)

参数解释;
① curve 轮廓周长 输入二维向量 可以为std::vector or Mat类型
② closed 是否闭合 bool ture或者flase

2. cv2.contourArea()

cv2.contourArea(contour,[oriented])

参数解释;
① contour 轮廓周长 输入二维向量 可以为std::vector or Mat类型
② 面向区域标志。如果属实,该函数会根据轮廓方向(顺时针或逆时针)返回签名区域值。使用此 功能 ,您可以通过获取区域标志来确定轮廓的方向。默认情况下,参数是假的,这意味着绝对值被返回。

3. cv2.approxPolyDP()

cv2.approxPolyDP(curve, epsilon, closed[, approxCurve]) → approxCurve

参数解释;
① curve:输入二维向量。python:Nx2 numpy array (Python interface)
② approxCurve:输出折线,数据类型可以为vector。近似结果。该类型应匹配输入曲线的类型。在 C 接口的情况下,近似曲线存储在内存存储中,并返回指向该曲线的指点。
③ epsilon:指定近似精度的参数。这是原始曲线与其近似度之间的最大距离。(距离大于此阈值则舍弃,小于此阈值则保留,epsilon越小,折线的形状越“接近”曲线。)
④ closed:曲线是否闭合 bool类型
例如approx = cv2.approxPolyDP(i,0.02*peri,True)

4. cv.BoundingRect()

cv.BoundingRect(points, update=0) → CvRect

参数解释;
① points 输入二维向量 可以为std::vector or Mat类型
例如:
cv2.boundingRect(img)
img是一个二值图。
返回四个值,分别是 x,y,w,h。
其中 x,y 是矩阵左上点的坐标。
w,h 是矩阵的宽和高。
康康实战一下
请添加图片描述
代码:

import cv2
import numpy as np

webcam = False
path = '11.png'

minArea=1000
while True:
    if webcam:success,img = cap.read()# 选择实时与否
    else: img = cv2.imread(path)
    
    imgGray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
    imgBlur = cv2.GaussianBlur(imgGray,(5,5),1)
    imgCanny = cv2.Canny(imgBlur,100,100)
    kernel = np.ones((5,5))
    imgDial = cv2.dilate(imgCanny,kernel,iterations=3)
    imgThre = cv2.erode(imgDial,kernel,iterations=2)
    cv2.imshow('Canny',imgThre)
    contours,hiearchy = cv2.findContours(imgThre,cv2.RETR_EXTERNAL,cv2.CHAIN_APPROX_SIMPLE)
    finalCountours = []
    for i in contours:
        area = cv2.contourArea(i)
        if area > minArea:
            peri = cv2.arcLength(i,True)
            approx = cv2.approxPolyDP(i,0.02*peri,True)
            bbox = cv2.boundingRect(approx)
    print(contours)
    print(peri)
    print(bbox)
    print(approx)
    cv2.waitKey(0)
    cv2.destroyAllWindows()

有点迷了,这输出怎么和文档描述得不一样有明白的留个言,谢谢
原图:
在这里插入图片描述

5.cv2.findContours()

findContours(image, mode, method, contours=None, hierarchy=None, offset=None): 

参数解释;
① mode:
cv2.RETR_EXTERNAL 只检测外轮廓
cv2.RETR_LIST 检测的轮廓不建立等级关系,都是同级
cv2.RETR_CCOMP 建立两个等级的轮廓,上面一层为外边界,里面一层为内孔的边界信息
cv2.RETR_TREE 建立一个等级树结构的轮廓
② method:
cv2.CHAIN_APPROX_NONE 存储所有边界点
cv2.CHAIN_APPROX_SIMPLE 压缩垂直、水平、对角方向,只保留端点
cv2.CHAIN_APPROX_TX89_L1 使用teh-Chini近似算法
cv2.CHAIN_APPROX_TC89_KCOS 使用teh-Chini近似算法
作用略述:
返回的是两个参数一个是轮廓本身,还有一个是每条轮廓对应的属性。

6. cv2.drawContours()

cv2.drawContours(image, contours, contourIdx, color[, thickness[, lineType[, hierarchy[, maxLevel[, offset]]]]]	)

参数解释;
① image 要检测的图像。
② contours 所有输入轮廓。每个轮廓都存储为点向量。
③ contourIdx 参数表示要绘制的轮廓。如果是负数,则绘制所有轮廓。
④ color 轮廓的颜色。
⑤ thickness 轮廓绘制的线条厚度。如果它是负的(例如thickness=CV_FILLED),轮廓内饰被绘制。
⑥ lineType 线路连接。。
⑦ hierarchy 有关层次结构的可选信息。它只需要,如果你想画一些轮廓(maxlevel)。
⑧ maxlevel 绘制轮廓的最大水平 。如果是 0,则只绘制指定的轮廓。如果是 1,则函数绘制轮廓和所有嵌套轮廓。如果是 2,则函数绘制轮廓、所有嵌套轮廓、所有嵌套到嵌套轮廓等。此参数仅在可用的层次结构(hierarchy)时考虑。
⑨ offset 可选轮廓移位参数。将所有绘制的轮廓按指定的轮廓移动。
⑩ contour指向第一个轮廓的指点。
① externalColor 外部轮廓的颜色。
② holeColor 内部轮廓的颜色(孔)。

//
我们添加三行代码

print (type(contours))
print (type(contours[0]))
print (len(contours))

①注意ndarray
请添加图片描述
我们用简单图形做一下实测
请添加图片描述
如果用到右上图我们已知2 可以单独绘制(contourldx)

cv2.drawContours(image, contours, contourIdx, color[, thickness[, lineType[, hierarchy[, maxLevel[, offset]]]]]	)

如图
请添加图片描述
②注意contours
轮廓点,以三维数组的列表格式,“个数” “坐标”
已知此图形有两个轮廓点
输入:

print (contours)
print (len(contours[0]))
print (len(contours[1]))

得到
请添加图片描述
③注意hierarchy
轮廓间的层次关系,为三维数组,形状为(1,n,4),其中n表示轮廓总个数,4指的是用4个数表示各轮廓间的相互关系。第一个数表示同级轮廓的下一个轮廓编号,第二个数表示同级轮廓的上一个轮廓的编号,第三个数表示该轮廓下一级轮廓的编号,第四个数表示该轮廓的上一级轮廓的编号。
输入代码:

print (type(hierarchy))
print (hierarchy.ndim)
print (hierarchy[0].ndim)
print (hierarchy.shape)

得到:
请添加图片描述

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值