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)#边界数组
分享到:
相关推荐
OpenCV-python 学习笔记 OpenCV图像阈值1
1. openCV-python 环境搭建: 2. OpenCV 的图像读取显示及保存 1. 导入图像: 2. 显示图像: 3. 保存图像: 3. OpenCV
2. 平均 3. 高斯模糊 4. 双边滤波 5. 中值模糊
1. 使用摄像头捕获视频 2. 从文件中播放视频 3. 保存视频
1. 扩展缩放 2. 平移 3. 旋转 4. 仿射变换 5. 透视变换
1. 腐蚀 2. 膨胀 3. 开运算 4. 闭运算 5. 形态学梯度 6. 礼帽 7. 黑帽 8. 形态学操作之间关系及结构化元素
1. 转换色彩空间 2. 物体跟踪 3. 寻找跟踪对象的HSV值
lp__Python学习笔记之人脸识别
基于Python和OpenCV的目标跟踪学习笔记
本篇文章主要介绍了详解python OpenCV学习笔记之直方图均衡化,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
https://www.bilibili.com/video/BV1PV411774y?p=47
学习笔记python+opencv利用拉普拉斯算子锐化与sobel算子锐化(csdn)————程序
Opencv现在支持与计算机视觉和机器学习有关的多种算法,并且正在日益扩展。 Opencv支持多种编程语言,例如C++, Python, Java等,并且可以再Windows , Linux , OS X , Android和IOS等不同平台上使用。基于CUDA和...
之前曾经写过一道数米粒的作业,当时用的是c++中的opencv,这次用python试了一下。 原图及效果图 咦?水印怎么去啊 程序流程 程序的大致流程为: 1.读取图片 2.灰度化 3.二值化 4.膨胀、腐蚀等 5.边缘检测 6....
Learning-OpenCV-3-Computer-Vision-with-Python 书本PDF以及代码
主要介绍了OpenCV+python实现实时目标检测功能,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
大多数应用程序都是用Python编写的,但是,我很快将为所有应用程序添加C ++版本。 应用菜单 应用领域 相关话题 演示版 绿屏色度键控 Alpha混合,模糊 进行中 文件扫描仪 影像透视变换 进行中 淡斑卸妆水 无缝克隆 ...
本文介绍了python OpenCV学习笔记实现二维直方图,分享给大家,具体如下: 官方文档 – https://docs.opencv.org/3.4.0/dd/d0d/tutorial_py_2d_histogram.html 在前一篇文章中,我们计算并绘制了一维的直方图。它被...
学习python_OpenCV的笔记及代码,bilibili上的某个视频的代码,可以借鉴一下,以便节省一部分时间