python opencv入门 轮廓(17)
来源:互联网 发布:sql数据库开发教程 编辑:程序博客网 时间:2024/06/05 04:09
内容来自OpenCV-Python Tutorials 自己翻译整理
目标
理解什么是轮廓
找轮廓、绘制轮廓
学习如下函数cv2.findContours(), cv2.drawContours()
什么是轮廓?
轮廓可以理解为将所有连续的像素点(沿着边界)连接咋我一起的曲线,这些像素有相同的颜色或者灰度。轮廓在形状分析和物体识别上有重要应用。
- 为了提高精确度、要使用二值图像。寻找轮廓前,要进行阈值化处理或者canny边缘检测
- 查找轮廓会修改原始图像,所以原始图像要备份
- 要找的物体应该是白色的,在黑色的背景当中
import numpy as npimport cv2im = cv2.imread('3.jpg')imgray = cv2.cvtColor(im,cv2.COLOR_BGR2GRAY)ret,thresh = cv2.threshold(imgray,127,255,0)image, contours, hierarchy = cv2.findContours(thresh,cv2.RETR_TREE,cv2.CHAIN_APPROX_SIMPLE)cv2.imshow('res',image)cv2.waitKey(0)
cv2.findContours()输入三个参数,第一个参数是输入图像,第二个参数是轮廓查找方式,第三个参数是轮廓近似方法。
返回值有三个,第一个是图像(二值),第二个是纯轮廓,第三个是轮廓层次
返回的纯轮廓是一个python的列表,此处存储所有图像中的轮廓,每一个轮廓都是numpy数组,包含检测物体边界点
如何绘制轮廓?
cv2.drawContours()函数来绘制轮廓,根据用户提供的边界点绘制任何形状。
输入参数为,原始图像,轮廓(列表),轮廓索引(绘制独立轮廓时有用,-1绘制所有轮廓)
,轮廓颜色,轮廓厚度等等。
在图像中绘制所有轮廓
import numpy as npimport cv2im = cv2.imread('1.jpg')imgray = cv2.cvtColor(im,cv2.COLOR_BGR2GRAY)ret,thresh = cv2.threshold(imgray,127,255,0)image, contours, hierarchy = cv2.findContours(thresh,cv2.RETR_TREE,cv2.CHAIN_APPROX_SIMPLE)img = cv2.drawContours(im, contours, -1, (0,255,0), 3)cv2.imshow('res',img)cv2.waitKey(0)
绘制第四个轮廓
import numpy as npimport cv2im = cv2.imread('1.jpg')imgray = cv2.cvtColor(im,cv2.COLOR_BGR2GRAY)ret,thresh = cv2.threshold(imgray,127,255,0)image, contours, hierarchy = cv2.findContours(thresh,cv2.RETR_TREE,cv2.CHAIN_APPROX_SIMPLE)img = cv2.drawContours(im, contours, 3, (0,255,0), 3)cv2.imshow('res',img)cv2.waitKey(0)
多数情况下这样使用,与上面结果一样
import numpy as npimport cv2im = cv2.imread('1.jpg')imgray = cv2.cvtColor(im,cv2.COLOR_BGR2GRAY)ret,thresh = cv2.threshold(imgray,127,255,0)image, contours, hierarchy = cv2.findContours(thresh,cv2.RETR_TREE,cv2.CHAIN_APPROX_SIMPLE)cnt = contours[3]img = cv2.drawContours(im, [cnt], 0, (0,255,0), 3)cv2.imshow('res',img)cv2.waitKey(0)
轮廓近似方法
cv2.findCountours() 函数的第三个参数,是什么意思?
轮廓是形状具有相同灰度的边界值,在轮廓中会存储所有边界上的(x,y)坐标。但是不一定需要全部存储,这时用参数来控制。
参数在设置为 cv2.CHAIN_APPROX_NONE时所有边界点会被存储,但是事实上并不一定需要那么多,例如边界是一条直线时,你不需要直线上的所有点,有两个端点即可,这就是cv2.CHAIN_APPROX_SIMPLE参数提供的,它会去电多余的点。
- python opencv入门 轮廓(17)
- python opencv入门 轮廓特征(18)
- python opencv入门 轮廓的性质(19)
- python opencv入门 更多关于轮廓的函数(20)
- python opencv入门 轮廓的层次结构(21)
- Opencv(Python) 教程-轮廓(2)轮廓特征求取
- Opencv(Python) 教程-轮廓(3)轮廓的性质
- OpenCV入门(二十六)-- 轮廓检测
- OpenCV入门笔记(五) 轮廓检测
- OpenCV-Python教程(11、轮廓检测)
- OpenCV-Python教程(11、轮廓检测)
- OpenCV-Python教程(11、轮廓检测)
- python-opencv-轮廓检测
- opencv-python(15):轮廓
- Python-OpenCV轮廓检测
- Python OpenCV -- 轮廓检测 (十四)
- Opencv-python接口:轮廓检测
- OpenCV实现图片轮廓检测(Python实现)
- Python线程之threading.Event
- java.lang.IllegalArgumentException: An AccessDecisionManager is required
- 0802 Java面向对象基础:类和对象
- KahaDB持久化性能
- 人脸检测中的AdaBoost算法
- python opencv入门 轮廓(17)
- Flask-Login的使用
- 【转】 原生JS与jQuery操作DOM对比
- Nicescroll滚动条插件的用法
- Java反射机制及实例
- 线程安全的tomicInteger
- 我对CSS vertical-align的一些理解与认识(一)
- linux screen 命令详解(转载)
- ASP.NET – DataList 控件