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)#边界数组
posted @ 2016-12-13 12:39  retacn_yue  阅读(243)  评论(0编辑  收藏  举报