python opencv 识别圆角矩形_OpenCV—Python 轮廓检测 绘出矩形框(findContours\ boundingRect\rectangle...
千万注意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...相关推荐
- python+OpenCV图像处理(十一)图像轮廓检测
图像轮廓检测 (一)检测轮廓 在OpenCV-python中,使用cv2.findContours()函数来对图像进行轮廓检测. 返回三个值:image,contours,hierarchy cont ...
- python opencv视频处理教程_OpenCV+Python详细教程-图片+视频(一)-Go语言中文社区...
环境 Python3以上的版本+OpenCV+PyCharm 图片 目标 读入,显示,保存图像 对应的函数:cv2.imread(),cv2.imshow(),cv.imwrite() 1.1读取图像 ...
- python opencv 图像添加噪声_opencv+python同时加椒盐噪声和随机杂点噪声
同时生成椒盐代码如下: 通过pertotal 设置噪声总数 persalt盐噪声比例 #同时加椒盐 总占比 pertotal ,persalt盐占比image = cv.imread('c:\\me ...
- python opencv改变图片亮度_opencv+python 如何改变图片亮度?
addWeighted函数:计算两个图像(原图和全黑图)的加权和 dst = cv2.addWeighted(img1, c, blank, 1-c, b) 亮度就是每个像素所有通道都加上b (bri ...
- Python+OpenCV 识别银行卡卡号
Python+OpenCV 识别银行卡卡号 今天尝试一下用python+OpenCV,使用模板匹配的方式做个简单地识别银行卡卡号(大部分参考网上的,自己改了一部分,代码写的有点不太好,但是思路很清晰, ...
- Python OpenCV识别行人入口进出人数统计
程序示例精选 Python OpenCV识别行人入口进出人数统计 如需安装运行环境或远程调试,见文章底部微信名片,由专业技术人员远程协助! 前言 这篇博客针对<Python OpenCV识别行 ...
- 使用Python,OpenCV在视频中进行实时条形码检测
使用Python,OpenCV在视频中进行实时条形码检测 1. 步骤 2. 适用场景及优化 3. 总结 4. 源码 参考 上一篇博客介绍了如何检测和查找图像中的条形码.这篇博客将进行一些优化以检测实时 ...
- OpenCV(六)之图像轮廓检测
OpenCV(六)之图像轮廓检测 Contour detection系列 Contour detection-图像金字塔 图像金字塔-高斯金字塔 图像金字塔-拉普拉斯金字塔 Contour detec ...
- python opencv 轮廓检测_opencv之轮廓检测与处理
查找图像的轮廓在图像处理及应用中扮演着重要的角色. opencv中 查找轮廓的函数提供的是cv::findContours() 把查找的轮廓划到图像上cv::drawContours() 1.轮廓的查 ...
- python opencv 直方图均衡_详解python OpenCV学习笔记之直方图均衡化
本文介绍了python OpenCV学习笔记之直方图均衡化,分享给大家,具体如下: 官方文档 – https://docs.opencv.org/3.4.0/d5/daf/tutorial_py_hi ...
最新文章
- 第2关:实现一个链接存储的栈
- Python matplotlib可视化:用Matplotlib的bar_label函数自定义条形图的数值标签、用Matplotlib的bar_label函数为条形图添加数值标记(在每一个条形的中部)
- 计算机音乐刚好遇见你乐谱,刚好遇见你曲谱_刚好遇见你乐谱
- html css js调用dll,js调用Activex的dll
- SpringMVC+RestFul详细示例实战教程
- 基于Flask开发企业级REST API应用(一)
- scanf( )函数的返回值
- html发送qq邮件消息,Python3实现发送QQ邮件功能(html)_python
- windows系统 ping Telnet等系统自带命令无法使用原因及解决方法
- 使用CSS按比例调整图像大小? [重复]
- debian 8 和centos 配置java 环境变量的正确姿态
- VS2013 MFC 直接将 OpenCV2.0/3.0 库中的 Mat 结构的图像传递到 Picture Control(图片控件)
- c 语言是一种以解释方式实现的高级语言,高级语言按照计算机执行方式不同可以分为哪两类?它们的执行方式有什么不同,请进行概要说明。...
- 关于Spring.net+NHibernate的事务控制
- [WP8.1UI控件编程]Windows Phone XAML页面的编译
- Selenium模拟浏览器获取爬取QQ音乐歌词、评论等。
- USB驱动之常规usb鼠标驱动
- 2021全国人工智能大赛(NAIC)视觉编码赛道初赛一阶段baseline分享
- NLP之语义自动匹配emoji
- 无线AP概念功率mW、灵敏度dBm、增益dBi