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

  • 色差仪维修生产(色差仪维修)(色差仪如何使用及维护)

    色差仪维修生产(色差仪维修)(色差仪如何使用及维护)

  • 惠普410打印机怎么连接无线Wi-Fi(惠普410打印机怎么打印照片)

    惠普410打印机怎么连接无线Wi-Fi(惠普410打印机怎么打印照片)

  • 华为荣耀10的型号是(华为荣耀10的型号代码)

    华为荣耀10的型号是(华为荣耀10的型号代码)

  • vivoy81怎么把应用移到内存卡(vivoy83怎么把应用移到内存卡)

    vivoy81怎么把应用移到内存卡(vivoy83怎么把应用移到内存卡)

  • 小爱语音唤醒支持机型(小爱语音呼唤)

    小爱语音唤醒支持机型(小爱语音呼唤)

  • 手机充值卡是不卖了吗(手机充值卡不记名实体卡能用吗)

    手机充值卡是不卖了吗(手机充值卡不记名实体卡能用吗)

  • 领取红包封面序号是什么意思(领取红包封面序列号的号码是多少)

    领取红包封面序号是什么意思(领取红包封面序列号的号码是多少)

  • 硅胶手机壳味道刺鼻怎么办(硅胶手机壳味道刺鼻)

    硅胶手机壳味道刺鼻怎么办(硅胶手机壳味道刺鼻)

  • 苹果手机一台手机只能用一个ID 吗(苹果手机一台手机怎么登两个微信)

    苹果手机一台手机只能用一个ID 吗(苹果手机一台手机怎么登两个微信)

  • 华为p20是不是快充(华为p20支持快充电吗)

    华为p20是不是快充(华为p20支持快充电吗)

  • oppoa9手机是不是双卡双待(oppoa9系列手机)

    oppoa9手机是不是双卡双待(oppoa9系列手机)

  • 京东商家不发货平台会怎么处理(京东商家不发货怎么申请赔付)

    京东商家不发货平台会怎么处理(京东商家不发货怎么申请赔付)

  • 带格式的突出显示什么意思(格式突出显示怎么设置)

    带格式的突出显示什么意思(格式突出显示怎么设置)

  • 手机拦截的信息在哪里可以找到(手机拦截的信息怎么看)

    手机拦截的信息在哪里可以找到(手机拦截的信息怎么看)

  • 华为手机能不能定位别人位置(华为手机能不能下载空调遥控器)

    华为手机能不能定位别人位置(华为手机能不能下载空调遥控器)

  • 快手原视频怎么保存(快手原视频怎么去水印)

    快手原视频怎么保存(快手原视频怎么去水印)

  • 华为手机上面有个月亮是什么意思(华为手机上面有个耳机图标怎么取消)

    华为手机上面有个月亮是什么意思(华为手机上面有个耳机图标怎么取消)

  • 微信怎么让附近的人搜到我(微信怎么让附近的人加我)

    微信怎么让附近的人搜到我(微信怎么让附近的人加我)

  • 英文双引号怎么打出来(英文双引号怎么替换成中文的)

    英文双引号怎么打出来(英文双引号怎么替换成中文的)

  • 转转保卖订单怎么取消(转转保卖订单取消不了怎么办)

    转转保卖订单怎么取消(转转保卖订单取消不了怎么办)

  • 迅雷ios验证过期怎么办(迅雷验证过期了怎么恢复)

    迅雷ios验证过期怎么办(迅雷验证过期了怎么恢复)

  • 手机手电筒在哪里设置(手机手电筒在哪里打开)

    手机手电筒在哪里设置(手机手电筒在哪里打开)

  • 闲鱼怎么删除评论(闲鱼怎么删除评价内容)

    闲鱼怎么删除评论(闲鱼怎么删除评价内容)

  • 在win7系统中鼠标右击桌面没反应怎么办?(在windows7中,使用鼠标拖放功能)

    在win7系统中鼠标右击桌面没反应怎么办?(在windows7中,使用鼠标拖放功能)

  • 免税收入是什么票据类型
  • 累计预扣法计算公式
  • 分摊房屋租赁费计入什么科目
  • 长期借款利息费用计算
  • 餐费补贴要交个人所得税吗
  • 收到损坏赔偿款怎么入账
  • 股利支付率怎么找数据
  • 没有销售收入可以有销售费用吗
  • 个体工商户该如何交税
  • 无偿受让股权的股东对发起股东没有出资承担责任
  • 资产负债表和利润表和现金流量表的关系
  • 已抵扣的发票怎么开红字发票申请单
  • 注册资本变更增加意味着什么
  • 个人房产税征收标准
  • 增普票付款要不要从公户走?
  • 开发票六位代码
  • 资金流量表的解读
  • 母子公司可以汇资金吗
  • 收取技术服务费
  • 小型微利企业普惠性减税政策
  • 分期收款销售的商品属于存货吗
  • 1697510742
  • 无法收回的账务处理
  • 股份公司注销流程及费用
  • 办理营业执照费用和流程
  • vmware怎么安装iso
  • php file_exists 检查文件或目录是否存在的函数
  • php获取多选框的值
  • linux中怎么安装GUI
  • php更新数据
  • 建造合同完工百分比法
  • php ftp函数
  • php实现日历
  • php类型转换的两种方法
  • php获取当前页面
  • 材料成本差异属于流动资产吗
  • 一文讲清资产负债表中各个项目的来龙去脉
  • php自定义变量的方法是
  • 大前端最新
  • yolov3 pytorch详解
  • window11预览版怎么样
  • ajax提交表单数据
  • 个体户办营业执照网上怎么申请
  • 企业所得税申报更正怎么操作
  • php上传文件代码iapp
  • 货代一般一个柜利润多少
  • 如何在sql server中建立一个表
  • 那怎么才能恢复
  • 个人购销合同范本
  • 甲供材的卸料由谁负责
  • 专利技术转让损失会计分录
  • 进项税额转出期限是多久
  • 冲销以前年度多计提的费用分录
  • 作业成本多用于直接成本的核算
  • 提前报废固定资产会导致账面价值减少吗
  • 已计提教育费附加但是未扣除个税
  • 设备折旧怎么记账
  • 在建工程不做了发生的费用如何做账?
  • 资产负债表中的货币资金怎么算
  • 自产产品赠送会计处理
  • mysql8.0并行复制
  • 计算机上没有运行windows无线服务
  • win8怎么连接
  • win8无法修复你的电脑
  • win10的ghost
  • windows缓存写入失败,数据怎么找回
  • win10增加右键菜单
  • win102020h2怎么样
  • centos 安装方法
  • win7开始菜单在哪里
  • imac怎么查使用时间
  • 双击windows 7桌面上的快捷图标可以干嘛
  • nodejs 用途
  • shell section
  • 使用jquery
  • jquery mobile demo
  • jquery日期选择器
  • 浅谈JQuery+ajax+jsonp 跨域访问
  • js跨域访问页面控件
  • jQuery基本选择器总结
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

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

    友情链接: 武汉网站建设