千万注意opencv的轮廓检测和边缘检测是两码事

1 获取轮廓

OpenCV2获取轮廓主要是用 cv2.findContours()

import cv2

img = cv2.imread('wujiaoxing.png')

gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

ret,binary = cv2.threshold(gray, 127, 255, cv2.THRESH_BINARY)

_,contours, hierarchy = cv2.findContours(binary, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)

draw_img0 = cv2.drawContours(img.copy(),contours,0,(0,255,255),3)

draw_img1 = cv2.drawContours(img.copy(),contours,1,(255,0,255),3)

draw_img2 = cv2.drawContours(img.copy(),contours,2,(255,255,0),3)

draw_img3 = cv2.drawContours(img.copy(), contours, -1, (0, 0, 255), 3)

print ("contours:类型:",type(contours))

print ("第0 个contours:",type(contours[0]))

print ("contours 数量:",len(contours))

print ("contours[0]点的个数:",len(contours[0]))

print ("contours[1]点的个数:",len(contours[1]))

cv2.imshow("img", img)

cv2.imshow("draw_img0", draw_img0)

cv2.imshow("draw_img1", draw_img1)

cv2.imshow("draw_img2", draw_img2)

cv2.imshow("draw_img3", draw_img3)

cv2.waitKey(0)

cv2.destroyAllWindows()

输出:

contours:类型:

第0 个contours:

contours 数量: 3

contours[0]点的个数: 6

contours[1]点的个数: 74

其中,cv2.findContours() 的第二个参数主要有

cv2.RETR_LIST:检测的轮廓不建立等级关系

cv2.RETR_TREE:L建立一个等级树结构的轮廓。

cv2.RETR_CCOMP:建立两个等级的轮廓,上面的一层为外边界,里面的一层为内孔的边界信息。

cv2.RETR_EXTERNAL:表示只检测外轮廓

cv2.findContours() 的第三个参数 method为轮廓的近似办法

cv2.CHAIN_APPROX_NONE存储所有的轮廓点,相邻的两个点的像素位置差不超过1,即max(abs(x1-x2),abs(y2-y1))==1

cv2.CHAIN_APPROX_SIMPLE压缩水平方向,垂直方向,对角线方向的元素,只保留该方向的终点坐标,例如一个矩形轮廓只需4个点来保存轮廓信息

cv2.CHAIN_APPROX_TC89_L1,CV_CHAIN_APPROX_TC89_KCOS使用teh-Chinl chain 近似算法

1.1 返回值:image, contours, hierarchy

contour返回值

cv2.findContours()函数首先返回一个list,list中每个元素都是图像中的一个轮廓,用numpy中的ndarray表示。

hierarchy返回值

该函数还可返回一个可选的hiararchy结果,这是一个ndarray,其中的元素个数和轮廓个数相同,每个轮廓contours[i]对应4个hierarchy元素hierarchy[i][0] ~hierarchy[i][3],分别表示后一个轮廓、前一个轮廓、父轮廓、内嵌轮廓的索引编号,如果没有对应项,则该值为负数。

2 绘出轮廓

cv2.drawContours()函数

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

第一个参数是指明在哪幅图像上绘制轮廓;

第二个参数是轮廓本身,在Python中是一个list。

第三个参数指定绘制轮廓list中的哪条轮廓,如果是-1,则绘制其中的所有轮廓。后面的参数很简单。其中thickness表明轮廓线的宽度,如果是-1(cv2.FILLED),则为填充模式。绘制参数将在以后独立详细介绍。

为了看到自己画了哪些轮廓,可以使用 cv2.boundingRect()函数获取轮廓的范围,即左上角原点,以及他的高和宽。然后用cv2.rectangle()方法画出矩形轮廓

"""

x, y, w, h = cv2.boundingRect(img)

参数:

img 是一个二值图

x,y 是矩阵左上点的坐标,

w,h 是矩阵的宽和高

cv2.rectangle(img, (x,y), (x+w,y+h), (0,255,0), 2)

img: 原图

(x,y): 矩阵的左上点坐标

(x+w,y+h):是矩阵的右下点坐标

(0,255,0): 是画线对应的rgb颜色

2: 线宽

"""

for i in range(0,len(contours)):

x, y, w, h = cv2.boundingRect(contours[i])

cv2.rectangle(image, (x,y), (x+w,y+h), (153,153,0), 5)

3 获取轮廓区域

new_image=image[y+2:y+h-2,x+2:x+w-2] # 先用y确定高,再用x确定宽

input_dir=("E:/cut_image/")

if not os.path.isdir(input_dir):

os.makedirs(input_dir)

cv2.imwrite( nrootdir+str(i)+".jpg",newimage)

print (i)

4 获取物体最小外界矩阵

使用 cv2.minAreaRect(cnt) ,返回点集cnt的最小外接矩形,cnt是所要求最小外接矩形的点集数组或向量,这个点集不定个数。

其中:cnt = np.array([[x1,y1],[x2,y2],[x3,y3],[x4,y4]]) # 必须是array数组的形式

rect = cv2.minAreaRect(cnt) # 得到最小外接矩形的(中心(x,y), (宽,高), 旋转角度)

box = np.int0(cv2.boxPoints(rect)) #通过box会出矩形框

python opencv 识别圆角矩形_OpenCV—Python 轮廓检测 绘出矩形框(findContours\ boundingRect\rectangle...相关推荐

  1. python+OpenCV图像处理(十一)图像轮廓检测

    图像轮廓检测 (一)检测轮廓 在OpenCV-python中,使用cv2.findContours()函数来对图像进行轮廓检测. 返回三个值:image,contours,hierarchy cont ...

  2. python opencv视频处理教程_OpenCV+Python详细教程-图片+视频(一)-Go语言中文社区...

    环境 Python3以上的版本+OpenCV+PyCharm 图片 目标 读入,显示,保存图像 对应的函数:cv2.imread(),cv2.imshow(),cv.imwrite() 1.1读取图像 ...

  3. python opencv 图像添加噪声_opencv+python同时加椒盐噪声和随机杂点噪声

    同时生成椒盐代码如下: 通过pertotal 设置噪声总数  persalt盐噪声比例 #同时加椒盐 总占比 pertotal ,persalt盐占比image = cv.imread('c:\\me ...

  4. python opencv改变图片亮度_opencv+python 如何改变图片亮度?

    addWeighted函数:计算两个图像(原图和全黑图)的加权和 dst = cv2.addWeighted(img1, c, blank, 1-c, b) 亮度就是每个像素所有通道都加上b (bri ...

  5. Python+OpenCV 识别银行卡卡号

    Python+OpenCV 识别银行卡卡号 今天尝试一下用python+OpenCV,使用模板匹配的方式做个简单地识别银行卡卡号(大部分参考网上的,自己改了一部分,代码写的有点不太好,但是思路很清晰, ...

  6. Python OpenCV识别行人入口进出人数统计

     程序示例精选 Python OpenCV识别行人入口进出人数统计 如需安装运行环境或远程调试,见文章底部微信名片,由专业技术人员远程协助! 前言 这篇博客针对<Python OpenCV识别行 ...

  7. 使用Python,OpenCV在视频中进行实时条形码检测

    使用Python,OpenCV在视频中进行实时条形码检测 1. 步骤 2. 适用场景及优化 3. 总结 4. 源码 参考 上一篇博客介绍了如何检测和查找图像中的条形码.这篇博客将进行一些优化以检测实时 ...

  8. OpenCV(六)之图像轮廓检测

    OpenCV(六)之图像轮廓检测 Contour detection系列 Contour detection-图像金字塔 图像金字塔-高斯金字塔 图像金字塔-拉普拉斯金字塔 Contour detec ...

  9. python opencv 轮廓检测_opencv之轮廓检测与处理

    查找图像的轮廓在图像处理及应用中扮演着重要的角色. opencv中 查找轮廓的函数提供的是cv::findContours() 把查找的轮廓划到图像上cv::drawContours() 1.轮廓的查 ...

  10. python opencv 直方图均衡_详解python OpenCV学习笔记之直方图均衡化

    本文介绍了python OpenCV学习笔记之直方图均衡化,分享给大家,具体如下: 官方文档 – https://docs.opencv.org/3.4.0/d5/daf/tutorial_py_hi ...

最新文章

  1. 第2关:实现一个链接存储的栈
  2. Python matplotlib可视化:用Matplotlib的bar_label函数自定义条形图的数值标签、用Matplotlib的bar_label函数为条形图添加数值标记(在每一个条形的中部)
  3. 计算机音乐刚好遇见你乐谱,刚好遇见你曲谱_刚好遇见你乐谱
  4. html css js调用dll,js调用Activex的dll
  5. SpringMVC+RestFul详细示例实战教程
  6. 基于Flask开发企业级REST API应用(一)
  7. scanf( )函数的返回值
  8. html发送qq邮件消息,Python3实现发送QQ邮件功能(html)_python
  9. windows系统 ping Telnet等系统自带命令无法使用原因及解决方法
  10. 使用CSS按比例调整图像大小? [重复]
  11. debian 8 和centos 配置java 环境变量的正确姿态
  12. VS2013 MFC 直接将 OpenCV2.0/3.0 库中的 Mat 结构的图像传递到 Picture Control(图片控件)
  13. c 语言是一种以解释方式实现的高级语言,高级语言按照计算机执行方式不同可以分为哪两类?它们的执行方式有什么不同,请进行概要说明。...
  14. 关于Spring.net+NHibernate的事务控制
  15. [WP8.1UI控件编程]Windows Phone XAML页面的编译
  16. Selenium模拟浏览器获取爬取QQ音乐歌词、评论等。
  17. USB驱动之常规usb鼠标驱动
  18. 2021全国人工智能大赛(NAIC)视觉编码赛道初赛一阶段baseline分享
  19. NLP之语义自动匹配emoji
  20. 无线AP概念功率mW、灵敏度dBm、增益dBi

热门文章

  1. 股票大作手回忆录读书笔记
  2. 《股票大作手操盘术》读书笔记
  3. 用大数据感知美德的力量
  4. Some Thoughts
  5. 可测函数列的依测度收敛性
  6. python接收163邮件以及下载附件(以163邮箱为例)
  7. R语言 —— 包(package)的下载和使用
  8. 超详细的cookie属性HttpOnly和SameSite引起的漏洞解决方案
  9. URL 长链地址转短链 URL地址
  10. kettle 使用excel模板导出数据