位置: 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出结果)

  • 粉丝流失,原因出在哪里(为什么我的粉丝掉粉)

    粉丝流失,原因出在哪里(为什么我的粉丝掉粉)

  • 小米之家可以换电池吗(小米之家可以换网卡吗)

    小米之家可以换电池吗(小米之家可以换网卡吗)

  • realme gt neo2怎么显示流量(realmegtneo2怎么强制关机)

    realme gt neo2怎么显示流量(realmegtneo2怎么强制关机)

  • 苹果手机屏幕清晰度怎么调整(苹果手机屏幕清理功能在哪设置)

    苹果手机屏幕清晰度怎么调整(苹果手机屏幕清理功能在哪设置)

  • yy怎么搜索频道(yy怎么搜索频道房间电脑)

    yy怎么搜索频道(yy怎么搜索频道房间电脑)

  • 微信好友隐藏了怎么弄出来(微信好友隐藏了步数怎么看)

    微信好友隐藏了怎么弄出来(微信好友隐藏了步数怎么看)

  • 华为p40有什么新科技(华为p40新款手机)

    华为p40有什么新科技(华为p40新款手机)

  • 计算器的clock键是什么键(计算器lock键是什么意思)

    计算器的clock键是什么键(计算器lock键是什么意思)

  • 苹果xsmax分辨率怎么调节(苹果xsmax分辨率变低了)

    苹果xsmax分辨率怎么调节(苹果xsmax分辨率变低了)

  • 斐讯k2支持200m宽带么(斐讯k2支持多少兆)

    斐讯k2支持200m宽带么(斐讯k2支持多少兆)

  • iphone7正在搜索无服务(iphone7 正在搜索)

    iphone7正在搜索无服务(iphone7 正在搜索)

  • 联想lj2605d硒鼓清零方法(联想lj2605d硒鼓型号)

    联想lj2605d硒鼓清零方法(联想lj2605d硒鼓型号)

  • 小米摄像头扫描二维码扫不上怎么办(小米摄像头扫描不到设备)

    小米摄像头扫描二维码扫不上怎么办(小米摄像头扫描不到设备)

  • 淘宝采集是什么意思(淘宝采集是什么软件)

    淘宝采集是什么意思(淘宝采集是什么软件)

  • 企业微信和个人微信是同一个账号吗(企业微信和个人微信能分开吗)

    企业微信和个人微信是同一个账号吗(企业微信和个人微信能分开吗)

  • 手机突然不能投屏了是什么原因(手机突然不能投屏了怎么解决)

    手机突然不能投屏了是什么原因(手机突然不能投屏了怎么解决)

  • 红米note8pro有没有指示灯(红米note8pro有没有红外遥控)

    红米note8pro有没有指示灯(红米note8pro有没有红外遥控)

  • 微信为什么被限制收款1000(微信为什么被限制)

    微信为什么被限制收款1000(微信为什么被限制)

  • 知乎怎么设置动态隐私(知乎怎么设置动态)

    知乎怎么设置动态隐私(知乎怎么设置动态)

  • 苹果手机充电器电压(苹果手机充电器没坏但是充不上电)

    苹果手机充电器电压(苹果手机充电器没坏但是充不上电)

  • iphone剪贴板历史在哪(iphone剪贴板历史可以找回来吗)

    iphone剪贴板历史在哪(iphone剪贴板历史可以找回来吗)

  • 华为手机放大镜怎么开(华为手机放大镜怎么取消设置功能)

    华为手机放大镜怎么开(华为手机放大镜怎么取消设置功能)

  • 芒果tv如何退出帐号(芒果tv如何退出会员账号)

    芒果tv如何退出帐号(芒果tv如何退出会员账号)

  • 魅族16怎么隐藏应用(魅族16怎么隐藏应用软件)

    魅族16怎么隐藏应用(魅族16怎么隐藏应用软件)

  • Mail.app增强插件:Universal Mailer介绍

    Mail.app增强插件:Universal Mailer介绍

  • 夕阳下的大白鲨过山车,美国新泽西州 (© John Van Decker/Alamy)

    夕阳下的大白鲨过山车,美国新泽西州 (© John Van Decker/Alamy)

  • 增值税的专用发票有几联
  • 应交城建税分录
  • 资本公积转增资本的要求
  • 吸收合并需要编制报表吗
  • 账面价值与计税基础之间没有差别只是计价的两种名称
  • 工会经费个人绩效计入缴费基数吗
  • 企业所得税1季度申报季初从业人数个税所属期12月
  • 发票清单可以用a4
  • 抬头 个人
  • 个税中的住房租金扣除什么意思
  • 收款收据写着投诉有效吗
  • 进项税抵扣销项税
  • 银行支付结算工作内容
  • 业务招待费取得的专票可以抵扣吗
  • 标书费收据丢失怎么办
  • 核定征收所得税税率
  • 营改增后装修行业税率
  • 城市建设维护税是什么意思
  • 公司发生的费用需要交税吗
  • 企业短期投资的计划和管理过程叫做资本预算
  • 公司对外汇款需要什么手续
  • 制作费用怎么转入成本
  • 企业所得税税率2.5% 5% 25%
  • 跨月的成本费用如何,调整
  • 什么情况下可以认定为工伤
  • 公司借法人的钱超过一年
  • PHP:oci_result()的用法_Oracle函数
  • 鸿蒙系统怎么设置双击亮屏
  • 桌面图标归纳
  • Win11 Build 22000.65更新体验:汉化更完善,右下角返回桌面回归
  • 扣扣斗图在哪里设置
  • musirc4.71.exe - musirc4是什么进程文件 有什么作用
  • 稀有品种茅膏菜
  • php怎么执行sql语句
  • json对象和js对象
  • 审计项目种类
  • php制作验证码
  • yolov3图像识别
  • js-cookie vue
  • phptime函数
  • java中通配符作用
  • 发票去税务局认证了就可以直接抵扣了吗
  • 工资直接计入管理费用了怎么办
  • 织梦设置的关键词看不到
  • 什么是外勤会计制度
  • 农产品来源用途是什么
  • 预收帐款
  • 固定资产折旧如何影响利润
  • 银行开出的发票可以进行税抵扣吗?
  • 代扣代缴的社保为什么是其他应付款
  • 待报解预算收入什么意思
  • 工商年报认缴时间过期了怎么办
  • 无法收回的应收账款怎么做分录
  • 个体户是否要做账务处理
  • 小规模建筑公司开劳务费发票税率
  • 工程审图费入什么会计科目
  • 一般纳税人取得普票怎么做账
  • 公司视同销售产品确认收入分录?
  • 票据质押如何做账
  • 减免的增值税要交所得税吗
  • 劳务支出如何做账
  • 货款已付,货未收到分录
  • 银行存款明细账借方代表什么
  • 什么是固定资产?其特征有哪些
  • 明细账填制要求
  • 此数据库中不存在用户或角色
  • mysql 5.7.9 winx64在windows上安装遇到的问题
  • windows server 2003 密钥
  • 系统死锁或资源管理器崩溃时让xp系统自动重启的方法
  • win8换win10系统步骤
  • avgcc32.exe进程是什么文件产生的 avgcc32进程信息查询
  • win7操作系统安装日期
  • win8系统电脑没声音怎么办
  • win10系统打游戏
  • Unity3D游戏开发引擎
  • 批处理设置dns
  • 成品油消费税税率2023
  • 辽宁交管12123能用微信支付吗
  • 13%增值税发票怎么抵扣
  • 怎样登录市地税局网站
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

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

    友情链接: 武汉网站建设