位置: IT常识 - 正文

【OpenCV-Python】:查找物体轮廓+计算轮廓面积、长度、重心(python的opencv)

编辑:rootadmin
【OpenCV-Python】:查找物体轮廓+计算轮廓面积、长度、重心

推荐整理分享【OpenCV-Python】:查找物体轮廓+计算轮廓面积、长度、重心(python的opencv),希望有所帮助,仅作参考,欢迎阅读内容。

文章相关热门搜索词:opencv用python,opencv opencv-python,python opencv3,python opencv2,python opencv pil,python opencv3,opencv opencv-python,opencv opencv-python,内容如对您有帮助,希望把文章链接给更多的朋友!

✨博客主页:米开朗琪罗~🎈 ✨博主爱好:羽毛球🏸 ✨年轻人要:Living for the moment(活在当下)!💪 🏆推荐专栏:【图像处理】【千锤百炼Python】【深度学习】【排序算法】

目录😺一、查找并绘制物体轮廓🐶1.1 查找轮廓🦄1.1.1 函数API🦄1.1.2 程序设计🐶1.2 绘制轮廓🦄1.2.1 函数API🦄1.2.2 全部轮廓绘制程序设计及结果可视化🦄1.2.2 逐个轮廓绘制程序设计及结果可视化🐶1.3 统计轮廓信息🦄1.3.1 函数API🦄1.3.2 程序设计😺一、查找并绘制物体轮廓🐶1.1 查找轮廓🦄1.1.1 函数API

函数:img, contours, hierarchy = cv2.findContours(image, mode, method[, contours[, hierarchy[, offset ]]])

参数介绍:

参数image:寻找轮廓的图像;参数mode:表示轮廓的检索模式cv2.RETR_EXTERNAL:只检测外轮廓cv2.RETR_LIST:检测的轮廓不建立等级关系cv2.RETR_CCOMP:建立两个等级的轮廓,上面的一层为外边界,里面的一层为内孔的边界信息。如果内孔内还有一个连通物体,这个物体的边界也在顶层。cv2.RETR_TREE:建立一个等级树结构的轮廓。参数method:表示轮廓的近似方法:cv2.CHAIN_APPROX_NONE:存储所有的轮廓点, 相邻的两个点的像素位置差不超过1, 即max(abs(x1-x2), abs(y2-y1)) == 1cv2.CHAIN_APPROX_SIMPLE:压缩水平方向,垂直方向,对角线方向的元素,只保留该方向的终点坐标,例如一个矩形轮廓只需4个点来保存轮廓信息。cv2.CHAIN_APPROX_TC89_L1,CV_CHAIN_APPROX_TC89_KCOS:用teh-Chinl chain 近似算法返回值img:返回原图的灰度图;返回值contour:返回一个列表,列表中包含了检测到的所有轮廓,每个轮廓用ndarray表示;返回值hierarchy:这是一个ndarray,其中的元素个数和轮廓个数相同,每个轮廓contours[i]对应4个hierarchy元素,分别为hierarchy[i][0] ~hierarchy[i][3],分别表示后一个轮廓、前一个轮廓、父轮廓、内嵌轮廓的索引编号,如果没有对应项,则该值为负数。

https://blog.csdn.net/hjxu2016/article/details/77833336

🦄1.1.2 程序设计

注意:在查找物体轮廓之前要先对图像进行灰度化与二值化操作!

实验使用图像:

import cv2import numpy as nporiginal = cv2.imread(r'C:\Users\Lenovo\Desktop\contour.jpg')print(original.shape)# 查找物体轮廓def findcontour(img): gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) # 图像灰度化 ret, binary = cv2.threshold(gray, 127, 255, cv2.THRESH_BINARY) # 图像二值化 image, contours, hierarchy = cv2.findContours(binary, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE) # 查找物体轮廓 return image, contours, hierarchyimage, contours, hierarchy = findcontour(original)

我们打印轮廓数量:

print('轮廓数:', len(contours))

得到:轮廓数: 3

注意:findcontours函数会“原地”修改输入的图像!!!

🐶1.2 绘制轮廓🦄1.2.1 函数API

函数:img = cv2.drawContours(image, contours, contourIdx, color, thickness=None, lineType=None, hierarchy=None, maxLevel=None, offset=None)

参数介绍:

参数image:要绘制轮廓的图像,必须是三通道;参数contours:表示轮廓本身,存储方式为list;参数contourIdx:轮廓索引,表示要绘制哪条轮廓,若为-1,则绘制所有轮廓;返回值img:绘制完轮廓的图像。🦄1.2.2 全部轮廓绘制程序设计及结果可视化contours = cv2.drawContours(original, contours, -1, (255, 0, 0), 5)# 绘制所有轮廓cv2.imshow("contour", contours)cv2.waitKey()

所有轮廓绘制的结果如下:

🦄1.2.2 逐个轮廓绘制程序设计及结果可视化nums = len(contours)color = [(255, 0, 0), (0, 255, 0), (0, 0, 255)]contourssplit=[]for i in range(nums): temp = np.zeros(original.shape, np.uint8) contourssplit.append(temp) contourssplit[i] = cv2.drawContours(contourssplit[i], contours, i, color[i], 2) cv2.imwrite(r'C:\\Users\\Lenovo\\Desktop\\%d.jpg' % i, contourssplit[i]) cv2.imshow("contours" + str(i), contourssplit[i])cv2.waitKey()【OpenCV-Python】:查找物体轮廓+计算轮廓面积、长度、重心(python的opencv)

逐个轮廓绘制的结果如下:

🐶1.3 统计轮廓信息🦄1.3.1 函数API

计算轮廓面积

函数:area= cv2.contourArea(contour,oriented)

参数介绍:

参数contour:轮廓信息;参数oriented:有方向的区域标志true:此函数依赖轮廓的方向(顺时针或逆时针)返回一个已标记区域的值。false:默认值。意味着返回不带方向的绝对值。

该函数有个缺点:由于其计算方式是利用格林公式计算轮廓面积,所以如果遇到具有自交点的轮廓,该函数会给出错误的结果。

统计轮廓信息

⬇️⬇️⬇️⬇️⬇️⬇️⬇️⬇️重点⬇️⬇️⬇️⬇️⬇️⬇️⬇️⬇️ 函数:moment = cv2.moments(contour)

参数介绍:

参数contour:轮廓信息;参数moment:图像的矩。

函数返回一个字典,你可以从中得到有关轮廓的各种信息,包括面积、重心等!

计算轮廓周长 函数:perimeter=cv2.arcLength(contour, closed)

参数介绍:

参数contour:轮廓信息;参数closed:用于指示轮廓是否封闭。True:轮廓封闭。False:轮廓不封闭。🦄1.3.2 程序设计

我们先看cv2.moments中的信息,使用debug看a中的数据: a是一个具有24个键值对的字典,包含了轮廓的各个信息。

使用cv2.moments(contours[i])['m00']得到轮廓面积;

使用int(cv2.moments(contours[i])['m10']/cv2.moments(contours[i])['m00'])和 int(cv2.moments(contours[i])['m01']/cv2.moments(contours[i])['m00'])得到轮廓重心;

使用cv2.arcLength(contours[i], True)得到轮廓的长度。

nums = len(contours)color = [(255, 0, 0), (0, 255, 0), (0, 0, 255)]contourssplit=[]for i in range(nums): temp = np.zeros(original.shape, np.uint8) contourssplit.append(temp) contourssplit[i] = cv2.drawContours(contourssplit[i], contours, i, color[i], 2) a = cv2.moments(contours[i]) print("轮廓" + str(i) + "的面积:%d" % cv2.moments(contours[i])['m00']) print("轮廓" + str(i) + "的重心:%d" % int(cv2.moments(contours[i])['m10']/cv2.moments(contours[i])['m00']), int(cv2.moments(contours[i])['m01']/cv2.moments(contours[i])['m00'])) print("轮廓" + str(i) + "的长度:%d" % cv2.arcLength(contours[i], True))

结果如下:

轮廓0的面积:3214轮廓0的重心:69 199轮廓0的长度:403轮廓1的面积:4752轮廓1的重心:202 142轮廓1的长度:336轮廓2的面积:8019轮廓2的重心:69 67轮廓2的长度:336
本文链接地址:https://www.jiuchutong.com/zhishi/298680.html 转载请保留说明!

上一篇:css 如何实现文本竖排、横排展示(css如何实现文字循环滚动左到右,再从右到左衔接循环)

下一篇:【蓝桥杯Web】第十四届蓝桥杯Web模拟赛 3 期 | 精品题解(下)(蓝桥杯2021出结果)

  • iphone13pro和12pro手机壳通用吗(iphone13pro和12pro外观区别)

    iphone13pro和12pro手机壳通用吗(iphone13pro和12pro外观区别)

  • 钉钉日志怎么写(前台钉钉日志怎么写)

    钉钉日志怎么写(前台钉钉日志怎么写)

  • 微信会备份到iCloud吗(微信备份数据会覆盖原来的数据吗)

    微信会备份到iCloud吗(微信备份数据会覆盖原来的数据吗)

  • 苹果手机如何禁止拍照显示位置信息(苹果手机如何禁止删除app)

    苹果手机如何禁止拍照显示位置信息(苹果手机如何禁止删除app)

  • iphone xr支持指纹解锁吗(xr能指纹吗)

    iphone xr支持指纹解锁吗(xr能指纹吗)

  • 华为手机怎样组合照片成一张(华为手机怎么组合应用)

    华为手机怎样组合照片成一张(华为手机怎么组合应用)

  • 拼多多访客下降原因(拼多多没有访客量怎么办)

    拼多多访客下降原因(拼多多没有访客量怎么办)

  • 微信被移出群聊怎么加回去(微信被移出群聊还能加群里的人吗)

    微信被移出群聊怎么加回去(微信被移出群聊还能加群里的人吗)

  • 电子邮件可以发附件吗(电子邮件可以发送声音和视频吗)

    电子邮件可以发附件吗(电子邮件可以发送声音和视频吗)

  • iphone6splus解决卡顿(苹果6splus手机卡)

    iphone6splus解决卡顿(苹果6splus手机卡)

  • 苹果手机左侧第一个开关是什么(苹果手机左侧第二个开关是什么)

    苹果手机左侧第一个开关是什么(苹果手机左侧第二个开关是什么)

  • 硬盘hdd什么意思(机械硬盘hdd什么意思)

    硬盘hdd什么意思(机械硬盘hdd什么意思)

  • lioal00是什么手机(liion00是什么型号手机)

    lioal00是什么手机(liion00是什么型号手机)

  • lio al00是华为什么型号(华为lio al00是什么型号的手机)

    lio al00是华为什么型号(华为lio al00是什么型号的手机)

  • ipadwps怎么导出(ipadwps怎么导出文件)

    ipadwps怎么导出(ipadwps怎么导出文件)

  • 安卓手机可以投屏到ipad上吗(安卓手机可以投屏到电脑上吗)

    安卓手机可以投屏到ipad上吗(安卓手机可以投屏到电脑上吗)

  • 手机wps页面设置在哪(手机wps页面设置竖的显示横的)

    手机wps页面设置在哪(手机wps页面设置竖的显示横的)

  • iphone5s几核(iphone 5s什么处理器)

    iphone5s几核(iphone 5s什么处理器)

  • 抖音拉黑有什么作用(抖音拉黑有什么拉出来对方能看到吗)

    抖音拉黑有什么作用(抖音拉黑有什么拉出来对方能看到吗)

  • 佳能90d是全画幅吗(佳能90d相机价格)

    佳能90d是全画幅吗(佳能90d相机价格)

  • 怎样删除有页脚的空白页(怎样删除页脚线)

    怎样删除有页脚的空白页(怎样删除页脚线)

  • 黑鲨2支持无线充电吗(黑鲨支持无线充电功能吗)

    黑鲨2支持无线充电吗(黑鲨支持无线充电功能吗)

  • 微信发不了动图吗(微信发不了动图是怎么回事)

    微信发不了动图吗(微信发不了动图是怎么回事)

  • 一品威客网注册地在哪里(一品威客注册了还是参加不了任务)

    一品威客网注册地在哪里(一品威客注册了还是参加不了任务)

  • 鼠标底下的灯不亮了(鼠标底下的灯不亮了如何更换)

    鼠标底下的灯不亮了(鼠标底下的灯不亮了如何更换)

  • 基于骨骼关键点的动作识别(OpenMMlab学习笔记,附PYSKL相关代码演示)(基于骨骼关键点的动作识别)

    基于骨骼关键点的动作识别(OpenMMlab学习笔记,附PYSKL相关代码演示)(基于骨骼关键点的动作识别)

  • 支付给境外个人的租金
  • 小型中央空调机
  • 财政应返还额度与财政拨款收入的关系
  • 税费退库怎么做凭证
  • 工会经费如何申报?
  • 研发费用辅助账谁来做
  • 计提印花税走什么科目
  • 什么情况下纳税调减
  • 有哪些税收政策类型
  • 房地产公司预收账款明细科目
  • 库存商品报废进项转出
  • 工程项目分包需要缴纳企业所得税吗
  • 发票从7月1日起开
  • 公办幼儿园食堂21项制度
  • 小规模未开票收入如何申报增值税
  • 投资性房地产处置时公允价值变动损益
  • 增值税小规模纳税人减免增值税
  • 企业接收股东划入资产作为收入处理有所得税差异吗
  • 汽车过户费包括
  • 定金算营业收入吗
  • 无偿赠送产品如何处理
  • PHP:xml_set_external_entity_ref_handler()的用法_XML解析器函数
  • 圣米歇尔山 (© Leroy Francis/Getty Images)
  • 购买性支出和转移性支出的区别可以归纳为()
  • 免征的增值税账务处理
  • 股东年终利润分录怎么写
  • php毫秒转换时分秒
  • top命令可以看到哪些信息
  • 转销股票会计分录
  • laravel框架最新版本
  • 个税申报中是否婚前各自首套贷款
  • css选择器分哪几类
  • 原材料用于在建工程增值税如何处理
  • 政府返回税款是否计入收入
  • 纳什理论是什么
  • wordpress怎么用
  • 基于个人同意处理个人信息的个人什么撤回其同意
  • 本期应补退税额和期末未缴税额
  • day10-Tomcat02
  • 水电费用属于会计的什么费用
  • 暂估入账后续处理
  • 土地使用权被政府收回没有注销怎么样缴土地使用税
  • 固定资产加速折旧的方法有哪些
  • 公司出售二手车要交哪些税
  • 收到股东的投资款现金流量表
  • 评估价计入什么科目
  • 车辆处置如何缴纳企业所得税
  • 幼儿园收取的生活费免税吗
  • 以前多计提的税款怎么办
  • 在会计中,结转材料实际采购成本时什么意思
  • 房产税减按70%的政策
  • 建筑业有收入没有成本
  • 银行日记账的登记依据有哪些
  • 企业计提坏账准备遵循的会计信息质量要求是
  • 长期待摊费用是经营性资产吗
  • sql2005生成脚本
  • 备份数据还原不了怎么办
  • windows7如何获得正版
  • nvidia专业卡性能对比
  • win7系统怎么用键盘开机
  • win7手动装系统步骤
  • mac系统有txt吗
  • windows远程连接是什么协议
  • win8怎么固定桌面
  • mysql删除key
  • centos打包文件
  • nodejs获取post数据
  • androidserviceslibrary设置
  • opengl光线跟踪代码
  • asp.net runat
  • 如何删除命令
  • js控制style
  • linux的ftp命令
  • 执行shell脚本方式
  • jqueryui easyui
  • javascript对象和方法
  • 浙江省电子税务局手机开票入口
  • 出口退税的汇率按什么时候的汇率
  • 个人所得税减免标准及明细
  • 北京税务代办
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

    网站地图: 企业信息 工商信息 财税知识 网络常识 编程技术

    友情链接: 武汉网站建设