图像轮廓的获取可参考博文十七

一、相关原理

1,弧长和面积

对于弧长和面积,计算出来的轮廓单位都是像素

2,多边形拟合

每一个轮廓都是一系列的点,然后通过多边形进行拟合,无限的接近真实形状
相关API:cv.approxPolyDP(contour,4, True)
其中参数一:contour几何的轮廓
参数二:epsilon表示折线的大小,越小表示越接近真实形状
参数三:close表示是否为闭合区域,一般默认为True

3,几何矩计算

前景像素f(x,y)
原点矩:
p+q=0称为零阶矩,p+q=1称为一阶矩
中心距:
中心距已经是中心化之后的值,一般都是从一阶矩开始的
图像的重心坐标:
M10表示一阶(1+0=1)

二、将几何图像通过矩形框框出,并求出矩形面积

import cv2 as cv
import numpy as npdef measure_object(image):gray = cv.cvtColor(image, cv.COLOR_BGR2GRAY)ret, binary = cv.threshold(gray, 0, 255, cv.THRESH_BINARY_INV | cv.THRESH_OTSU)print("threshold value : %s"%ret)cv.imshow("binary image", binary)dst = cv.cvtColor(binary, cv.COLOR_GRAY2BGR)outImage, contours, hireachy = cv.findContours(binary, cv.RETR_EXTERNAL, cv.CHAIN_APPROX_SIMPLE)for i, contour in enumerate(contours):area = cv.contourArea(contour)x, y, w, h = cv.boundingRect(contour)rate = min(w, h)/max(w, h)print("rectangle rate : %s"%rate)#矩形面积mm = cv.moments(contour)print(type(mm))cx = mm['m10']/mm['m00']cy = mm['m01']/mm['m00']cv.circle(dst, (np.int(cx), np.int(cy)), 3, (0, 255, 255), -1)#圆心cv.rectangle(dst, (x, y), (x+w, y+h), (0, 0, 255), 2)#矩形框print("contour area %s"%area)cv.imshow("measure-contours", dst)src = cv2.imread(r"G:\Juptyer_workspace\study\opencv\opencv3\number.jpg")
cv.namedWindow("input image", cv.WINDOW_AUTOSIZE)
cv.imshow("input image", src)
measure_object(src)
cv.waitKey(0)cv.destroyAllWindows()

效果图如下:

三、识别圆、矩形、三角形并使用不同的颜色进行区分标记轮廓,并出去轮廓面积

import cv2 as cv
import numpy as npdef measure_object(image):gray = cv.cvtColor(image, cv.COLOR_BGR2GRAY)ret, binary = cv.threshold(gray, 0, 255, cv.THRESH_BINARY_INV | cv.THRESH_OTSU)print("threshold value : %s"%ret)cv.imshow("binary image", binary)dst = cv.cvtColor(binary, cv.COLOR_GRAY2BGR)outImage, contours, hireachy = cv.findContours(binary, cv.RETR_EXTERNAL, cv.CHAIN_APPROX_SIMPLE)for i, contour in enumerate(contours):area = cv.contourArea(contour)x, y, w, h = cv.boundingRect(contour)rate = min(w, h)/max(w, h)print("rectangle rate : %s"%rate)mm = cv.moments(contour)print(type(mm))cx = mm['m10']/mm['m00']cy = mm['m01']/mm['m00']cv.circle(dst, (np.int(cx), np.int(cy)), 3, (0, 255, 255), -1)#圆心#cv.rectangle(dst, (x, y), (x+w, y+h), (0, 0, 255), 2)#外接矩形print("contour area %s"%area)approxCurve = cv.approxPolyDP(contour,4, True)print(approxCurve.shape)if approxCurve.shape[0] > 6:#圆肯定需要多个线段进行无限趋近拟合cv.drawContours(dst, contours, i, (0, 255, 0), 2)if approxCurve.shape[0] == 4:#矩形四条线段即可拟合成功cv.drawContours(dst, contours, i, (0, 0, 255), 2)if approxCurve.shape[0] == 3:#三角形三条线段即可拟合成功cv.drawContours(dst, contours, i, (255, 0, 0), 2)cv.imshow("measure-contours", dst)print("--------- Python OpenCV Tutorial ---------")
src = cv2.imread(r"G:\Juptyer_workspace\study\opencv\opencv3\by.jpg")
cv.namedWindow("input image", cv.WINDOW_AUTOSIZE)
cv.imshow("input image", src)
measure_object(src)
cv.waitKey(0)cv.destroyAllWindows()

效果图如下:

十八、对已经找到轮廓的图像进行测量相关推荐

  1. [Python从零到壹] 五十八.图像增强及运算篇之图像锐化Sobel、Laplacian算子实现边缘检测

    欢迎大家来到"Python从零到壹",在这里我将分享约200篇Python系列文章,带大家一起去学习和玩耍,看看Python这个有趣的世界.所有文章都将结合案例.代码和作者的经验讲 ...

  2. Python遥感图像处理应用篇(十八):GDAL +numpy对遥感图像归一化处理

    1.使用数据 所用输入数据为遥感影像数据,可以是单波段也可以是多波段数据. 运行环境:windows10  pycharm  python3.7.7  GDAL-3.2.3-cp37-cp37m-wi ...

  3. [Python从零到壹] 五十九.图像增强及运算篇之图像锐化Scharr、Canny、LOG实现边缘检测

    欢迎大家来到"Python从零到壹",在这里我将分享约200篇Python系列文章,带大家一起去学习和玩耍,看看Python这个有趣的世界.所有文章都将结合案例.代码和作者的经验讲 ...

  4. OpenCV学习笔记(十六)——CamShift研究 OpenCV学习笔记(十七)——运动分析和物体跟踪Video OpenCV学习笔记(十八)——图像的各种变换(cvtColor*+)imgproc

    OpenCV学习笔记(十六)--CamShift研究 CamShitf算法,即Continuously Apative Mean-Shift算法,基本思想就是对视频图像的多帧进行MeanShift运算 ...

  5. [Python从零到壹] 三十八.图像处理基础篇之图像几何变换(平移缩放旋转)

    欢迎大家来到"Python从零到壹",在这里我将分享约200篇Python系列文章,带大家一起去学习和玩耍,看看Python这个有趣的世界.所有文章都将结合案例.代码和作者的经验讲 ...

  6. OpenCV学习笔记(五十六)——InputArray和OutputArray的那些事core OpenCV学习笔记(五十七)——在同一窗口显示多幅图片 OpenCV学习笔记(五十八)——读《Mast

    OpenCV学习笔记(五十六)--InputArray和OutputArray的那些事core 看过OpenCV源代码的朋友,肯定都知道很多函数的接口都是InputArray或者OutputArray ...

  7. OpenCV学习笔记(十八):凸包,最小包围区域算子:convexHull(),minAreaRect(),minEnclosingTriangle(),minEnclosingCircle()

    OpenCV学习笔记(十八):凸包,最小包围区域算子:convexHull(),minAreaRect(),minEnclosingTriangle(),minEnclosingCircle() 1. ...

  8. 最全的MySQL基础【燕十八传世】

    1.课前准备! 开启mysql服务:1).配置环境变量;2).net start mysql 将该sql文件导入到你的数据库中,以下所有操作都是基于该数据库表操作的!!! [此笔记是本人看着视频加上自 ...

  9. (转载)Android项目实战(二十八):使用Zxing实现二维码及优化实例

    Android项目实战(二十八):使用Zxing实现二维码及优化实例 作者:听着music睡 字体:[增加 减小] 类型:转载 时间:2016-11-21 我要评论 这篇文章主要介绍了Android项 ...

最新文章

  1. java map 结构体_业务代码的救星——Java 对象转换框架 MapStruct 妙用
  2. java与json,java与json
  3. 当前元素_90行代码,15个元素实现无限滚动
  4. MySQL亿级数据量实时同步,小米如何完美hold住
  5. 2020倩女幽魂服务器正在维修,倩女幽魂手游2020年12月3日维护公告
  6. android卫星菜单中间,Android卫星菜单:android-satellite-menu
  7. python socketserver连接数量限制_python中socketserver的一个疑问
  8. pku2406 Power Strings(kmp字符匹配,next数组)
  9. python之math_cmath
  10. 日期插件(jedate)
  11. C++、Java、JavaScript中的正则表达式
  12. 谷歌宣布加入“反微软联盟”
  13. LATEX 罗马数字的输入
  14. 2010年Web网页设计趋势
  15. 八代及以上笔记本发热降频的一般处理办法
  16. Emojify – Create your own emoji with Deep Learning 通过深度学习创建你自己的表情
  17. colorkey口红怎么样_colorkey小众品牌口红唇釉效果好吗 – 爱分享
  18. html单元格上下拆分代码,在HTML / CSS中如何垂直拆分表格单元格(特殊版本)
  19. C语言的3种打桩方法总结
  20. nslookup命令详解和实战例子(全)

热门文章

  1. ios 查询mysql数据库操作系统_iOS数据库FMDB--增删改查(模糊查询)详细介绍
  2. 如何优雅的链式取值之 MayBe 函子
  3. 关于Unity实现AR功能(五)摄像头转换与闪光灯开关控制
  4. Hadoop HA集群的搭建
  5. Django集合Ueditor
  6. 关于源码,反码,补码(正数--负数)---------(-128)自己的理解
  7. LintCode 387: Smallest Difference
  8. 步骤菜单使用css3实现
  9. iBatis入门和开发环境搭建
  10. java打印word_Java jacob调用打印机打印word文档