• opencv_python学习笔记十八


     
    21 opencv的轮廓
    常用函数:
    def findContours(image, #二值单通道图像
                      mode, #轮廓的检测方式
                      method, #轮廓的近似办法
                      contours=None, #要绘制的边缘数组
                      hierarchy=None, #轮廓个数
                      offset=None)#轮廓点的偏移量
    Mode的检测模式有:
    Cv2.RETR_EXTERNAL  #得到最外面的轮廓
    CV_RETR_LIST
    CV_RETR_TREE
    method轮廓的近似方法
    CV_CHAIN_APPROX_NONE #所有边界点都会被存储
    CV_CHAIN_APPROX_SIMPLE# 会去掉轮廓上的冗余点
    CV_CHAIN_APPROX_TC89_L1
    CV_CHAIN_APPROX_TC89_KCOS
     
    def drawContours(image, #目标图像
                      contours, #要绘制的边缘数组
                      contourIdx, #需要绘制的边缘索引
                      color, #绘制的颜色
                      thickness=None, #画笔宽度
                      lineType=None, #连线类型
                      hierarchy=None, #用于传入层级关系
                      maxLevel=None, #层级中的最大级别
                      offset=None)#每个轮廓点的偏移量
     
    1 绘制轮廓
    示例代码如下:
    #!/usr/bin/env python
    # -*- coding: utf-8 -*-
    # @Time    : 2016/11/22 8:38
    # @Author  : Retacn
    # @Site    : 图像轮廓
    # @File    : imageContuor.py
    # @Software: PyCharm
    
    import cv2
    import numpy as np
    from matplotlib import pyplot as plt
    
    # 读入图像
    img = cv2.imread('../test.jpg')
    img2=cv2.imread('../test1.jpg')
    
    temp_img = img.copy()
    # 变为灰度图像
    imggray = cv2.cvtColor(temp_img, cv2.COLOR_BGR2GRAY)
    # 设定阈值
    ret, thresh = cv2.threshold(imggray, 127, 255, 0)
    # 查找轮廓
    image, contours, hierarchy = cv2.findContours(thresh,#二值单通道图像
                                                  cv2.RETR_TREE,#轮廓的检测方法
                                                  cv2.CHAIN_APPROX_SIMPLE)#轮廓的近似方法
    
    # 绘制轮廓
    image_re = cv2.drawContours(img2,#目标图像
                                contours,#边缘数组
                                263,#要绘制的轮廓的索引
                                (0, 255, 0),#颜色
                                3)#画笔宽度
    
    
    # 源图像
    plt.subplot(131), plt.imshow(img, 'gray')
    plt.title("Original"), plt.xticks([]), plt.yticks([])
    
    # 查询完后图像
    plt.subplot(132), plt.imshow(image, 'gray')
    plt.title("Image"), plt.xticks([]), plt.yticks([])
    
    # 绘制轮廓
    plt.subplot(133), plt.imshow(image_re, 'gray')
    plt.title("Image_re"), plt.xticks([]), plt.yticks([])
    
    plt.show()
     
    2 轮廓特征
    查询轮廓的不同特征 面积 周长 重心 边界
    def moments(array,#二维点列
                 binaryImage=None)#如果是true所有非零值像素置1
     
     
    示例代码如下:
    #!/usr/bin/env python
    # -*- coding: utf-8 -*-
    # @Time    : 2016/11/22 10:15
    # @Author  : Retacn
    # @Site    : 轮廓特征
    # @File    : contuorFeature.py
    # @Software: PyCharm
    
    import cv2
    import numpy as np
    from matplotlib import pyplot as plt
    
    #读入图像
    img=cv2.imread('../test.jpg')
    
    temp_img = img.copy()
    # 变为灰度图像
    imggray = cv2.cvtColor(temp_img, cv2.COLOR_BGR2GRAY)
    # 设定阈值
    ret, thresh = cv2.threshold(imggray, 127, 255, 0)
    # 查找轮廓
    image, contours, hierarchy = cv2.findContours(thresh,#二值单通道图像
                                                  cv2.RETR_TREE,#轮廓的检测方法
                                                  cv2.CHAIN_APPROX_SIMPLE)#轮廓的近似方法
    
    contour=contours[0]
    M=cv2.moments(contour)
    print(M)
    #输出结果:
    #{'m11': 821515965.3333333,  #空间矩形
    'nu11': -2.035886991415788e-05, 
    'mu12': -2124606.8292655945, 
    'm30': 259471192096.6, 
    'nu12': -2.7573417567631675e-06,#中心归一化矩
     'm12': 119381836048.86667, 
    'mu11': -65793.66022455692, #中心矩形
    'nu20': 0.10060818323074136, 
    'nu02': 0.06901872613271595, 
    'm10': 7503469.333333333, 
    'mu21': -2677871.7602539062, 
    'm20': 1315531329.0, 
    'm21': 144022195380.86667, 
    'nu30': 2.0259690085904074e-06, 
    'nu21': -3.475376018798413e-06, 
    'mu20': 325134973.16912174, 
    'm01': 6224491.333333333, 
    'm03': 147891998777.6, 
    'm02': 904589351.6666666, 
    'm00': 56848.0, 
    'mu03': 731122.353302002, 
    'nu03': 9.488598861180405e-07, 
    'mu02': 223047479.327415, 
    'mu30': 1561064.2318725586}
     
    计算对象的重心
    Cx=int(M[‘m10’]/M[‘m00’])
    Cy=int(M[‘m01’]/M[‘m00’])
    
    
    轮廓面积
    def contourArea(contour,#二维点集
                 oriented=None)#面向区域标志,ture有向面积值
                                   False是绝对值
    示例代码如下:
    #轮廓的面积
    area=cv2.contourArea(contour)
    print("轮廓面积:",area)
    #输出结果: 56848.0
     
    轮廓周长
    def arcLength(curve, #图像轮廓
                closed)#指定对像形状是闭合的
     
    #轮廓周长
    perimeter=cv2.arcLength(contour,True)
    print("轮廓周长:",perimeter)
    #输入结果为:963.3137083053589
     
    #轮廓近似
    def approxPolyDP(curve, #输入的点集
                      epsilon, #指定的精度
                      closed, #true为闭合
                      approxCurve=None)#输出的点集
     
    示例代码如下:
     
    # 绘制轮廓
    image_re = cv2.drawContours(temp_img,#目标图像
                                contours,#边缘数组
                                3,#要绘制的轮廓的索引
                                (0, 255, 0),#颜色
                                3)#画笔宽度
    示例代码为:
    # 轮廓的近似
    epsilon = 0.1 * cv2.arcLength(contour, True)
    approx = cv2.approxPolyDP(contour, epsilon, True)
    print('轮廓近似',approx)
    #输出结果:
    #[[[  1   1]]
    #[[  1 218]]
    #[[263 218]]
    #[[263   1]]]
     
     
     
     
     
     
    #凸包
    def convexHull(points, #要求凸包的焦点
                hull=None, #输出的凸点包
                clockwise=None, #顺时针还是逆时针方向
                returnPoints=None)#函数的输出类型
                                   True 返加凸包点上的坐标
                                   False 凸包点对应的轮廓的点
     
    示例代码为:#凸包
    hull=cv2.convexHull(contour)
    print('凸包',hull)
    #输出结果为:矩形的四个角
    #[[[263 218]]
    #[[  1 218]]
    #[[  1   1]]
    #[[263   1]]]
     
    #凸性检测,返回布尔值
    def isContourConvex(contour)#
     
    示例代码如下:
    #凸性检测,返回布尔值
    k=cv2.isContourConvex(contour)
    print('是否凸性',k)
     
    边界矩形
    直边界矩形
    def boundingRect(points)#边界数组
     
    def rectangle(img, #源图像
                pt1, #对角线上的两个顶点
                pt2, #
                color,# 线条的颜色
                thickness=None, #线条的宽度
                lineType=None, #线条的类型
                shift=None)#坐标点的小数点位数
     
    旋转边界矩形
    def minAreaRect(points)#边界数组
  • 相关阅读:
    Java测试用例简介
    Hive使用入门
    Java中的GetOpt操作
    Tomcat的文件列表服务
    Hadoop MapReduce 初步学习总结
    hadoop集群调优-OS和文件系统部分
    02怎么学数据结构?
    01为什么学习数据结构?
    MySQL实战06の锁
    MySQL实战05の索引(下)
  • 原文地址:https://www.cnblogs.com/retacn-yue/p/6194158.html
Copyright © 2020-2023  润新知