OpenCV入门(二十)快速学会OpenCV 19 对象测量

OpenCV入门(二十)快速学会OpenCV 19 对象测量

  • 1.对象测量
  • 2.多边形拟合
  • 3.计算对象中心

作者:Xiou

1.对象测量

opencv 中对象测量包括:
如面积,周长,质心,边界框等。
弧长与面积测量;
多边形拟合;
获取轮廓的多边形拟合结果。

python-opencv提供的方法:

cv2.moments() 用来计算图像中的中心矩(最高到三阶),

cv2.HuMoments() 用于由中心矩计算Hu矩,同时配合函数cv2.contourArea()函数计算轮廓面积,和cv2.arcLength()来计算轮廓或曲线长度

cv.approxPolyDP(多边形逼近)
-contour
-epsilon 越小越折 线越逼近真实形状
-close 是否为闭合区域

函数cv2.boundingRect返回四个参数(x,y)为矩形左上角的坐标,(w,h)是矩形的宽和高。 函数cv2.rectangle是绘制矩形函数

函数cv2.minAreaRect返回的是一个 Box2D 结构,
其中包含 :矩形左上角角点的坐标(x,y),矩形的宽和高(w,h),以及旋转角度。
但是要绘制这个矩形需要矩形的 4 个角点,可以通过函数 cv2.boxPoints() 获得,最后绘制得到旋转边界矩形。

函数cv2.minEnclosingCircle可以帮我们找到一个对象的外切圆。它是所有能够完全包括对象的圆中面积最小的一个。

函数cv2.fitEllipse返回值其实就是旋转边界矩形的内切圆。

几何矩计算

一幅M×N的数字图像ƒ(i,j),其p+q阶 几何矩mpq 和 中心矩 μpq为:

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

2.多边形拟合

步骤:

(1)读取图片;
(2)转换成灰度图;
(3)二值化;
(4)轮廓检测;
(5)计算轮廓周长;
(6)多边形拟合;

格式:

cv2.approxPolyDP(curve, epsilon, closed, approxCurve=None)

参数:

curve: 输入轮廓;
epsilon: 逼近曲率, 越小表示相似逼近越厉害;
closed: 是否闭合。

代码实例:

import cv2
from matplotlib import pyplot as plt

# 读取图片
image = cv2.imread("logo.png")
image_gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)

# 二值化
ret, thresh = cv2.threshold(image_gray, 127, 255, cv2.THRESH_OTSU)

# 计算轮廓
contours, hierarchy = cv2.findContours(thresh, cv2.RETR_TREE, cv2.CHAIN_APPROX_NONE)

# 轮廓近似
perimeter = cv2.arcLength(contours[0], True)
approx = cv2.approxPolyDP(contours[0], perimeter * 0.1, True)

# 绘制轮廓
result1 = cv2.drawContours(image.copy(), contours, 0, (0, 0, 255), 2)
result2 = cv2.drawContours(image.copy(), [approx], -1, (0, 0, 255), 2)

# 图片展示
f, ax = plt.subplots(1, 2, figsize=(12, 8))

# 子图
ax[0].imshow(cv2.cvtColor(result1, cv2.COLOR_BGR2RGB))
ax[1].imshow(cv2.cvtColor(result2, cv2.COLOR_BGR2RGB))

# 标题
ax[0].set_title("contour")
ax[1].set_title("approx")

plt.show()

输出结果:

在这里插入图片描述

3.计算对象中心

cv2.moments()可以帮助我们得到轮距, 从而进一步计算图片对象的中心。

cv2.moments(array, binaryImage=None)

参数:
array: 轮廓;
binaryImage: 是否把 array 内的非零值都处理为 1, 默认为 None。

代码实例:

import numpy as np
import cv2

# 读取图片
image = cv2.imread("logo.png")
image_gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)

# 二值化
ret, thresh = cv2.threshold(image_gray, 0, 255, cv2.THRESH_OTSU)

# 获取轮廓
contours, hierarchy = cv2.findContours(thresh, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)

# 遍历每个轮廓
for i, contour in enumerate(contours):

    # 面积
    area = cv2.contourArea(contour)

    # 外接矩形
    x, y, w, h = cv2.boundingRect(contour)

    # 获取论距
    mm = cv2.moments(contour)
    print(mm, type(mm))  # 调试输出 (字典类型)

    # 获取中心
    cx = mm["m10"] / mm["m00"]
    cy = mm["m01"] / mm["m00"]

    # 获取
    cv2.circle(image, (np.int(cx), np.int(cy)), 3, (0, 255, 255), -1)
    cv2.rectangle(image, (x, y), (x + w, y + h), (0, 0, 255), 2)

# 图片展示
cv2.imshow("result", image)
cv2.waitKey(0)
cv2.destroyAllWindows()

# 保存图片
cv2.imwrite("result1.jpg", image)

输出结果:

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

《LKD3粗读笔记》(4)进程调度

1、多任务 什么是多任务操作系统? 能同时并发地交互执行多个进程。注意是并发而不是并行。特别地,在多处理机机器上可以实现真正意义上的并行,因为它长了多个脑子多任务操作系统有哪些分类? 非抢占式多任务(cooperati…

【云原生】Kubernetes(k8s)部署 MySQL+Dubbo+Nacos服务

一、说明二、部署 MySQL三、部署 Nacos四、部署 Dubbo 服务4.1. 创建镜像仓库的密钥4.2. 部署 provider 服务4.3. 部署 consumer 服务五、测试一、说明 本文介绍基于 Kubernetes(k8s) 环境集成阿里云 私有镜像仓库 来部署一套 Dubbo Nacos 的微服务系统,并使用 Ku…

7个最好的PDF编辑器,帮你像编辑Word一样编辑PDF

PDF 是具有数字思维的组织的重要交流工具。提供高效的工作流程和更好的安全性,可以创建重要文档并与客户、同事和员工共享。文档的布局已锁定,因此无论在什么设备上查看,格式都保持不变。这是让每个人保持一致的好方法——尤其是那些使用Micr…

C++中的引用

个人主页:平行线也会相交 欢迎 点赞👍 收藏✨ 留言✉ 加关注💓本文由 平行线也会相交 原创 收录于专栏【C】 接下来就要开始进行C的学习路线了,听说这块的内容稍微难一些,不过我相信只要自己好好学习,态度…

java与Spring的循环依赖

java与Spring的循环依赖一、循环依赖是什么有什么危害二、循环依赖在Spring中的体现和类型三、Spirng如何解决循环依赖四、总结一、循环依赖是什么有什么危害 什么是循环依赖 java中循环依赖用一张图来说就是下图:在对象的创建过程中多个对象形成了依赖闭环&#xf…

初识linux之管道

一、进程间通信的概念大家都知道,进程是具有独立性的,因为一个程序运行起来生成进程时,也会生成它的进程结构体,即PCB,然后然后通过进程结构体中的结构体指针找到它的虚拟地址空间,然后再通过它的页表映射到…

C语言——字符函数和字符串函数【详解】(一)

文章目录函数介绍1.strlen2.strcpy3. strcat4. strcmp5. strncpy6. strncat7. strncmp8. strstr函数介绍 求字符串长度 strlen 长度不受限制的字符串函数(使用时不安全) strcpy strcat strcmp 长度受限制的字符串函数介绍(与长度不受限制函数…

【洛谷刷题】蓝桥杯专题突破-深度优先搜索-dfs(9)

目录 写在前面: 题目:P1025 [NOIP2001 提高组] 数的划分 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) 题目描述: 输入格式: 输出格式: 输入样例: 输出样例: 解题思路: 代…

【数据结构】哈希表

目录 1、哈希表 1.1 哈希表的简介 1.2 降低哈希冲突率 1.3 解决哈希冲突 1.3.1 闭散列 1.3.2 开散列(哈希桶) 1、哈希表 1.1 哈希表的简介 假设我们目前有一组数据,我们要从这组数据中找到指定的 key 值,那么咱们目…

【Java集合面试宝典】HashMap的put流程和特性?HashMap的扩容机制?原理— day08

目录 数组和链表分别适用于什么场景,为什么? 数组 链表 List和Set的区别 List和Map、Set的区别 HashMap 、HashTable 和TreeMap有什么区别? hashmap的特性 HashMap和HashTable有什么区别?(必会) J…

【数据结构】树的介绍

文章目录前言树的概念及结构树的概念树的表示树在实际中的运用二叉树的概念及结构二叉树的概念现实中的二叉树特殊的二叉树二叉树的性质二叉树的储存结构顺序存储链式存储写在最后前言 🚩本章给大家介绍一下树。树的难度相对于前面的数据结构来说,又高了…

ESP32设备驱动-HDC1080温度湿度传感器驱动

HDC1080温度湿度传感器驱动 文章目录 HDC1080温度湿度传感器驱动1、HDC1080介绍2、硬件准备3、软件准备4、驱动实现1、HDC1080介绍 HDC1080 是一款集成温度传感器的数字湿度传感器,可在极低功耗下提供出色的测量精度。 HDC1080 在很宽的电源范围内工作,是一种低成本、低功耗…

“提效”|教你用ChatGPT玩数据

ChatGPT与数据分析(二) 上文给简单聊了一下为什么ChatGPT不能取代数据分析师,本文我们来深入感受一下如何让GPT帮助数据分析师“提效”。 场景一:SQL取数 背景:多数数据分析师都要用SQL语言从数据库中提取数据&#x…

ctfshow web入门 命令执行29-33

1.web29eval()函数是把所有字符串当作php代码去执行,这题过滤了flag,使用通配符绕过过滤应该要注意文件中没有重名的文件,或一部分是一样的文件payload:cecho%20nl flag.php; #官方解法,反引号表示执行系统命令,nl为linux系统命令…

springboot智慧外贸平台

053-springboot智慧外贸平台演示录像2022开发语言:Java 框架:springboot JDK版本:JDK1.8 服务器:tomcat7 数据库:mysql 5.7(一定要5.7版本) 数据库工具:Navicat11 开发软件&#xff…

干货:浅谈主数据管理项目建设思路

“主数据是数据之源,是数据资产管理的核心,是信息系统互联互通的基石,是信息化和数字化的重要基础。 ——《主数据管理实践白皮书》” 近期,国家印发《数字中国建设整体布局规划》,提出数字中国建设的整体框架…

I2C协议简介 Verilog实现

I2C协议 IIC 协议是三种最常用的串行通信协议(I2C,SPI,UART)之一,接口包含 SDA(串行数据线)和 SCL(串行时钟线),均为双向端口。I2C 仅使用两根信号线&#xf…

Django 实现瀑布流

需求分析 现在是 "图片为王"的时代,在浏览一些网站时,经常会看到类似于这种满屏都是图片。图片大小不一,却按空间排列,就这是瀑布流布局。 以瀑布流形式布局,从数据库中取出图片每次取出等量(7 …

Educational Codeforces Round 145 (Rated for Div. 2) (A~E)

Problem - B - Codeforces 思路: 我们选择长度后,其特定长度会构成一个正方形,因为点与点距离大于1,所以偶数的正方形里面只能包含偶数的正方形,奇数的包含奇数。计算每个长度容纳最大点数: 发现cnt[0]1,…

WPF毛笔字实现过程

✅作者简介:2022年博客新星 第八。热爱国学的Java后端开发者,修心和技术同步精进。 🍎个人主页:Java Fans的博客 🍊个人信条:不迁怒,不贰过。小知识,大智慧。 💞当前专栏…