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

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

一、相关原理

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()

效果图如下:在这里插入图片描述

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/377975.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Linux 终端登录SSH:解决SSH的Access Denied 和 make xconfig的使用

对于SSH: 可以不是用putty,尤其是putty出现 Access denied 的时候,请换用konsole 或者其他终端 (如 terminal)在command line中: # ssh 要访问的主机ip eg : ssh 192.168.111 然后确定…

LeetCode 513. 找树左下角的值 思考分析

题目 给定一个二叉树,在树的最后一行找到最左边的值。 递归解 左下角要满足两个条件: 1、深度最大的叶子结点 2、最左结点:使用前序遍历,优先左边搜索。 1、确定递归函数的参数和返回值 参数:树的根结点&#xff…

利用MyBatis的动态SQL特性抽象统一SQL查询接口

1. SQL查询的统一抽象 MyBatis制动动态SQL的构造,利用动态SQL和自定义的参数Bean抽象,可以将绝大部分SQL查询抽象为一个统一接口,查询参数使用一个自定义bean继承Map,使用映射的方法构造多查询参数.在遇到多属性参数(例如order by,其参数包括列名,升序降序类型,以及可以多个列及…

ctype函数_PHP Ctype(字符类型)函数

ctype函数Ctype功能 (Ctype functions) PHP provides some of the built-in functions, which are used to verify the characters in the string i.e. to check whether a string contains the characters of specific types. PHP提供了一些内置函数,这些函数用于验…

Linux 平台下 MySQL 5.5 安装 说明 与 示例

一.下载说明前期的一些准备说明,参考:MySQL 发展史http://blog.csdn.net/tianlesoftware/article/details/6999245Mysql 不同版本 说明http://blog.csdn.net/tianlesoftware/article/details/6723117 MySQL 分为Community Server 和 Enterprise Edition。…

开始python之旅

接触python缘于工作所需,曾经接触过C、C等语言,对于编程语言在学习上大体是一个套路,当然套路因人而异,适合就好。接下来,我将不断分享python的知识和学习技巧,共同学习。 起源 初识一门语言善于先了解语言…

LeetCode 112. 路径总和 、113. 路径总和 II 思考分析

目录112. 路径总和题目递归解递归解,其他人的解法迭代解,其他人的解法113. 路径总和 II题目递归解递归解,参考别人的思路112. 路径总和 题目 给定一个二叉树和一个目标和,判断该树中是否存在根节点到叶子节点的路径,…

kotlin 查找id_Kotlin程序查找矩阵的转置

kotlin 查找idA transpose of a matrix is simply a flipped version of the original matrix. We can transpose a matrix by switching its rows with its columns 矩阵的转置只是原始矩阵的翻转形式。 我们可以通过切换矩阵的行和列来转置矩阵 Given a matrix, we have to…

[mongodb翻译]分片和故障转移

一个配置恰当的mongodb 分片集群不会有单点失效。 本章节描述了集群服务器中可能出现的故障,及相应的对策。 1. 某个mongos路由进程故障 每一个mongos会运行每一台应用服务器上面,该应用服务器只能通过这个mongos进程和集群进行通信。mongos进程不是…

看张子阳的书真是收获很多,也醒悟了很多(一)

摘录: 这是有一次开会时,我的老总跟我们说了这样一个事例:通常来说,医生是很高尚的职业(暂不考虑国内医生的负面新闻),尤其是牙科医生, 他们有着体面的工作并且收入不菲。但是&#…

【C++ grammar】抽象、封装与this指针

目录1、Abstraction and Encapsulation(抽象与封装)1. Data Field Encapsulation (数据域封装)2. Accessor and Mutator (访问器与更改器)2.1. To read/write private data, we need get/set function (为读写私有数据,需要get/set函数)2.2. …

java创建临时文件_用Java创建一个临时文件

java创建临时文件The task is to create a temporary file in Java. 任务是用Java创建一个临时文件。 Creating a temporary file 创建一个临时文件 To create a temporary file in java – we use createTempFile() method of "File" class. The createTempFile()…

十九、图像的形态学操作

一、图像形态学 图像形态学是图像处理学科的一个单独分支学科 主要针对的是灰度图和二值图像 是由数学的集合论以及数学中的拓扑几何原理发展而来 二、膨胀操作(dilate) 33的卷积核 以33为卷积核从左往右(从上往下)开始运行,若这卷积核…

X名称空间(WPF)

笔记简述 闲话x名称空间简要x名称空间的Attributex名称空间的标签扩展x名称空间的XAML指令元素闲话 本笔记参考与《深入浅出WPF》、MSDN、Some Blog… MSDN的飞机票点这里。 x名称空间简要 在VS中新建个WpfApplication都会自动生成xmlns:x"http://schemas.microsoft.com/w…

基于Bresenham和DDA算法画线段

直线:ykxb 为了将他在显示屏上显示出来,我们需要为相应的点赋值,那么考虑到计算机的乘法执行效率,我们肯定不会选择用Ykxb这个表达式求值,然后进行画线段。 我们应当是将它转化为加法运算。 下面提供两种常见的算法&am…

leetcode 106. 从中序与后序遍历序列构造二叉树 105. 从前序与中序遍历序列构造二叉树思考分析

目录1、106题目2、参考思路:递归切割数组3、105题目4、同样思路的代码1、106题目 2、参考思路:递归切割数组 代码参考:公众号:代码随想录 后序数组中序数组 以 后序数组(左右中)的最后一个元素作为切割点,先切中序数组…

按频率对元素进行排序

Prerequisite: 先决条件: Hashing data structure 散列数据结构 How to write user-defined comparator for priority queue STL in C? 如何在C 中为优先级队列STL编写用户定义的比较器? How to sort a map based on values instead of value? 如何根…

二十、分水岭算法

一、基本原理 分水岭算法主要是基于距离变换(distance transform),找到mark一些种子点,从这些种子点出发根据像素梯度变化进行寻找边缘并标记 分水岭:可以简单的理解成一座山,然后来洪水了,水开…

细数WOW里暴雪的“亲儿子”们

. 不知何时,魔兽世界的词汇中忽然出现了一个新玩意:亲儿子。虽说这个称呼现在大多是拿来调侃法爷的,但江山代有儿子出,各领风骚一两天,今天风光无限的法爷们也经历过被其他职业压得抬不起头的小媳妇生涯。那么今天…

Linux下串口ttyS2,ttyS3不能用的问题解决办法

PC104,Xlinux下,突然发现串口3,4不能用。。。 以为是硬件的问题,换成wince后,3,4工作正常,排除电路问题 在linux下查看dmesg: serial8250: ttyS0 at I/O 0x3f8 (irq 4) is a 16550Aserial8250: ttyS1 at I/O 0x2f8 (i…