当前位置: 首页 > news >正文

【python】OpenCV—Sort the Point Set from Top Left to Bottom Right

在这里插入图片描述

文章目录

  • 1、功能描述
  • 2、代码实现
  • 3、效果展示
  • 4、更多例子
  • 5、参考

1、功能描述

在这里插入图片描述

给出一张图片,里面含有各种图形,取各种图形的中心点,从左到右从上到下排序

例如

在这里插入图片描述

2、代码实现

import cv2
import numpy as npdef process_img(img):img_gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)img_canny = cv2.Canny(img_gray, 100, 100)kernel = np.ones((2, 3))img_dilate = cv2.dilate(img_canny, kernel, iterations=1)img_erode = cv2.erode(img_dilate, kernel, iterations=1)return img_erodedef get_centeroid(cnt):length = len(cnt)sum_x = np.sum(cnt[..., 0])sum_y = np.sum(cnt[..., 1])return int(sum_x / length), int(sum_y / length)def get_centers(img):contours, hierarchies = cv2.findContours(img, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_NONE)for cnt in contours:if cv2.contourArea(cnt) > 100:yield get_centeroid(cnt)def get_rows(img, centers, row_amt, row_h):centers = np.array(centers)d = row_h / row_amt  # 每行的间距for i in range(row_amt):  # 遍历行数f = centers[:, 1] - d * i  # 行首纵坐标a = centers[(f < d) & (f > 0)]  # 一行内的 xyield a[a.argsort(0)[:, 0]]img = cv2.imread("shape.png")
img_processed = process_img(img)cv2.imwrite("shape_processed.png", img_processed)centers = list(get_centers(img_processed))
print(centers)"""
[(478, 466), (38, 454), (478, 432), (159, 442), (646, 436), (157, 403), (317, 430), (161, 369), (139, 368), (523, 385), 
(64, 381), (690, 355), (636, 366), (341, 325), (506, 329), (212, 319), (86, 283), (180, 275), (674, 283), (379, 322), 
(525, 256), (299, 311), (434, 254), (634, 212), (316, 203), (233, 204), (567, 172), (148, 228), (59, 199), (418, 158), 
(478, 171), (363, 109), (549, 88), (281, 89), (211, 58), (441, 50), (21, 75), (104, 62), (677, 86), (621, 39), 
(485, 32), (323, 24)]
"""
print(len(centers))  # 42h, w, c = img.shape
count = 0for row in get_rows(img, centers, 4, h):cv2.polylines(img, [row], False, (255, 0, 255), 2)  # 绘制每一行的点连成线for x, y in row:count += 1cv2.circle(img, (x, y), 10, (0, 0, 255), -1)  # 绘制每个点cv2.putText(img, str(count), (x - 10, y + 5), 1, cv2.FONT_HERSHEY_PLAIN, (0, 255, 255), 2)# 每个点上写上序号cv2.imshow("Ordered", img)
cv2.waitKey(0)

process_img 后图像为

在这里插入图片描述

get_centers 函数找轮廓,面积较大的轮廓经过 get_centeroid 函数找轮廓中心

找轮廓中心的方法是遍历轮廓点,求横坐标和纵坐标的平均值

轮廓中心 centers 的长度为 42,可以看到我们找出来了图片中 42 个中心 ,也即找出来了 42 个轮廓

[(478, 466), (38, 454), (478, 432), (159, 442), (646, 436), (157, 403), (317, 430), (161, 369), (139, 368), (523, 385), 
(64, 381), (690, 355), (636, 366), (341, 325), (506, 329), (212, 319), (86, 283), (180, 275), (674, 283), (379, 322), 
(525, 256), (299, 311), (434, 254), (634, 212), (316, 203), (233, 204), (567, 172), (148, 228), (59, 199), (418, 158), 
(478, 171), (363, 109), (549, 88), (281, 89), (211, 58), (441, 50), (21, 75), (104, 62), (677, 86), (621, 39), 
(485, 32), (323, 24)]

遍历每行,排序纵坐标落在行内区间的轮廓中心

get_rowsf

array([466., 454., 432., 442., 436., 403., 430., 369., 368., 385., 381.,355., 366., 325., 329., 319., 283., 275., 283., 322., 256., 311.,254., 212., 203., 204., 172., 228., 199., 158., 171., 109.,  88.,89.,  58.,  50.,  75.,  62.,  86.,  39.,  32.,  24.])

get_rowsa

array([[363, 109],[549,  88],[281,  89],[211,  58],[441,  50],[ 21,  75],[104,  62],[677,  86],[621,  39],[485,  32],[323,  24]])

a.argsort(0) 按列排序

array([[ 5, 10],[ 6,  9],[ 3,  8],[ 2,  4],[10,  3],[ 0,  6],[ 4,  5],[ 9,  7],[ 1,  1],[ 8,  2],[ 7,  0]])

取出 x 的排序索引 a.argsort(0)[:, 0]

array([ 5,  6,  3,  2, 10,  0,  4,  9,  1,  8,  7])

得到排序后的结果 a[a.argsort(0)[:, 0]]

array([[ 21,  75],[104,  62],[211,  58],[281,  89],[323,  24],[363, 109],[441,  50],[485,  32],[549,  88],[621,  39],[677,  86]])

可视化结果,同一行的点连成线,绘制点,标上序号

最终输出

在这里插入图片描述

我们设置的 4 行,可以看到有 4 条直线

3、效果展示

get_rows(img, centers, 4, h) 配置不同的行数看看效果

1 行

在这里插入图片描述

2 行

在这里插入图片描述
3 行

在这里插入图片描述

4 行
在这里插入图片描述
5 行
在这里插入图片描述

6 行

在这里插入图片描述
7 行

在这里插入图片描述

4、更多例子

输入图片

在这里插入图片描述

前处理后的图片
在这里插入图片描述

2 行输出结果
在这里插入图片描述


输入图片

在这里插入图片描述

前处理后的图片

在这里插入图片描述

2 行输出结果

在这里插入图片描述

可以看到没有闭合的轮廓被舍弃掉了


输入图片

在这里插入图片描述

前处理后的图片

在这里插入图片描述

10 行输出结果

在这里插入图片描述


输入图片

在这里插入图片描述

前处理后的图片

在这里插入图片描述

4 行输出结果

在这里插入图片描述


输入图片

在这里插入图片描述

前处理后的图片

在这里插入图片描述

6 行输出结果

在这里插入图片描述


输入图片

在这里插入图片描述

前处理后的图片

在这里插入图片描述

2 行输出结果

在这里插入图片描述

5、参考

  • 使用OpenCV对点集从左上到右下排序

相关文章:

【python】OpenCV—Sort the Point Set from Top Left to Bottom Right

文章目录 1、功能描述2、代码实现3、效果展示4、更多例子5、参考 1、功能描述 给出一张图片&#xff0c;里面含有各种图形&#xff0c;取各种图形的中心点&#xff0c;从左到右从上到下排序 例如 2、代码实现 import cv2 import numpy as npdef process_img(img):img_gray c…...

LeetCode 1493.删掉一个元素以后全为1的最长子数组

题目&#xff1a; 给你一个二进制数组 nums &#xff0c;你需要从中删掉一个元素。 请你在删掉元素的结果数组中&#xff0c;返回最长的且只包含 1 的非空子数组的长度。 如果不存在这样的子数组&#xff0c;请返回 0 。 思路&#xff1a;不定长滑动窗口&#xff0c;将问题…...

php常用设计模式之工厂模式

引言 在日常开发中&#xff0c;我们一些业务场景需要用到发送短信通知。然而实际情况考虑到不同厂商之间的价格、实效性、可能会出现的情况等 我们的业务场景往往会接入多个短信厂商来保证我们业务的正常运行&#xff0c;而不同的短信厂商&#xff08;如阿里云短信、腾讯云短信…...

通用软件版本标识

软件版本标识&#xff1a;了解不同的版本类型 在软件开发和发布过程中&#xff0c;版本号和标识扮演着重要的角色。它们不仅帮助开发者追踪软件的演变&#xff0c;还让用户了解软件的稳定性和功能。以下是一些常见的软件版本标识&#xff0c;以及它们的含义和用途。 Alpha&am…...

(计算机毕设)基于SpringBoot的就业平台开题报告

一、立题依据(国内外研究进展或选题背景、研究意义等) 国内外研究进展或选题背景 在全球化的大背景下&#xff0c;就业问题一直是各国政府和社会各界关注的焦点。随着互联网技术的普及和发展&#xff0c;网络招聘已成为求职者和企业招聘的主要渠道。据相关数据显示&#xff0…...

STM32G4系列MCU的ADC模块标定方法和采样时间

目录 概述 1 ADC模块标定 1.1 功能介绍 1.2 软件程序校准ADC 1.2.1 标定步骤 1.2.2 标定时序框图 1.3 软件程序重新注入校准因子到ADC 1.3.1 标定步骤 1.3.2 更新ADC校准因子 1.4 用单个ADC转换单端和差分模拟输入 1.4.1 标定流程 1.4.2 混合单端和差分通道 2 通道…...

NVIDIA Jetson支持的神经网络加速的量化平台

NVIDIA Jetson支持的神经网络加速的量化工具、技术 NVIDIA Jetson 是专为边缘计算和嵌入式系统设计的高性能计算平台&#xff0c;它支持多种深度学习模型的部署和推理。对于神经网络加速的量化平台&#xff0c;Jetson 支持以下技术和工具&#xff1a; TensorRT&#xff1a;Ten…...

MySQL 免密登录的几种配置方式

文章目录 MySQL 免密登录的几种配置方式使用操作系统用户实现免密登录具体步骤&#xff1a;Step 1: 修改 MySQL 配置文件Step 2: 重启 MySQL 服务Step 3: 使用系统用户登录 MySQL优点&#xff1a;缺点&#xff1a; 使用 mysql_config_editor 配置免密文件具体步骤&#xff1a;S…...

html全局属性、框架标签

常用的全局属性&#xff1a; 属性名含义id 给标签指定唯一标识&#xff0c;注意&#xff1a;id是不能重复的。 作用&#xff1a;可以让label标签与表单控件相关联&#xff1b;也可以与css、JavaScript配合使用。 注意&#xff1a;不能再以下HTML元素中使用&#xff1a;<hea…...

ARL 灯塔 | CentOS7 — ARL 灯塔搭建流程(Docker)

关注这个工具的其它相关内容&#xff1a;自动化信息收集工具 —— ARL 灯塔使用手册 - CSDN 博客 灯塔&#xff0c;全称&#xff1a;ARL 资产侦察灯塔系统&#xff0c;有着域名资产发现和整理、IP/IP 段资产整理、端口扫描和服务识别、WEB 站点指纹识别、资产分组管理和搜索等等…...

抖音列表页采集-前言

准备工作&#xff1a; 1.关于selenium介绍&#xff1a; python自动化入门的话&#xff0c;selenium绝对是最方便的选择&#xff0c;基本逻辑即为&#xff1a;程序模拟人的行为操作浏览器&#xff0c;这样的操作需要借用浏览器驱动&#xff0c;我选用的是chrome浏览器&#xff…...

Linux 端口占用 kill被占用的端口 杀掉端口

1、yum install lsof 2、输入netstat -tln,查看系统当前所有被占用端口 3、根据端口查询进程,输入lsof -i :9555,切记不要忘了添加冒号 4、 既然知道进程号了,那杀死当前进程就简单多了,直接 kill -9 PID 回车...

爬虫之数据解析

数据解析 数据解析这篇内容, 很多知识涉及到的都是以前学习过的内容了, 那这篇文章我们主要以实操为主, 来展开来讲解关于数据解析的内容。 360搜索图片 请求的url大家不需要再找了, 相信大家都会找请求了, 寻找请求从我的第一篇爬虫的博客开始到现在一直都在写,这边的话, 我已…...

本地缓存少更改、小数据、低一致表的思考

对于那些少更改、小数据的表&#xff0c;以及对一致性要求不高的业务&#xff0c;其实完全可以通过本地缓存将表数据缓存到本地内存中&#xff0c;然后通过定时机制拉取表更新数据 直接从内存中获取数据&#xff0c;将会使得查询性能得到巨大的提升&#xff0c;并且由于更改少…...

redis 使用

打开redis 前台启动 同路径下打开redis-server 出现窗口&#xff0c;即启动成功 此时关闭窗口&#xff0c;redis关闭&#xff1b; 不管有没有使用密码&#xff0c;或者使用了什么密码&#xff0c;都能连上 如果使用下文提到的redis cli增加密码&#xff0c;就只能使用你设置的…...

使用 Pake 一键打包网页为桌面应用 / 客户端

项目 项目&#xff1a;https://github.com/tw93/Pake/ 免费ICO图片&#xff1a;https://icon-icons.com/zh/ 设置环境 以下教程仅针对windows系统适用 请确保您的 Node.js 版本为 18 或更高版本 文档&#xff1a;https://v1.tauri.app/zh-cn/v1/guides/getting-started/prerequ…...

vue.js【常用UI组件库】

Element Plus组件库 Element Plus是基于Vue 3开发的优秀的PC端开源UI组件库&#xff0c;它是Element的升级版&#xff0c;对于习惯使用Element的人员来说&#xff0c;在学习Element Plus时&#xff0c;不用花费太多的时间。因为Vue 3不再支持IE 11&#xff0c;所以Element Plu…...

基于vue框架的的地铁站智慧管理系统的设计n09jb(程序+源码+数据库+调试部署+开发环境)系统界面在最后面。

系统程序文件列表 项目功能&#xff1a;用户,上班打卡,下班打卡,人员管理,交接班,视频巡检,车辆巡检,车辆管理 开题报告内容 基于Vue框架的地铁站智慧管理系统的设计开题报告 一、研究背景与意义 随着城市化进程的加速&#xff0c;地铁站作为城市交通系统的重要组成部分&am…...

《南京师大学报(自然科学版)》

《南京师大学报&#xff08;自然科学版&#xff09;》刊载内容主要包括&#xff1a;数学&#xff1b;物理学&#xff1b;化学&#xff1b;地理学&#xff1b;海洋科学&#xff1b;生物学&#xff1b;生态学&#xff1b;力学&#xff1b;电子科学与技术&#xff1b;计算机科学与…...

考研读研生存指南,注意事项

本视频课程&#xff0c;涉及考研读研的方方面面&#xff0c;从考研初试→复试面试→研究生生活→导师相处→论文专利写作混毕业&#xff0c;应有尽有。有了他&#xff0c;你的研究生生涯稳了。 读研考研注意事项&#xff0c;研究生生存指南。_哔哩哔哩_bilibili 一、考研初试注…...

网络六边形受到攻击

大家读完觉得有帮助记得关注和点赞&#xff01;&#xff01;&#xff01; 抽象 现代智能交通系统 &#xff08;ITS&#xff09; 的一个关键要求是能够以安全、可靠和匿名的方式从互联车辆和移动设备收集地理参考数据。Nexagon 协议建立在 IETF 定位器/ID 分离协议 &#xff08;…...

设计模式和设计原则回顾

设计模式和设计原则回顾 23种设计模式是设计原则的完美体现,设计原则设计原则是设计模式的理论基石, 设计模式 在经典的设计模式分类中(如《设计模式:可复用面向对象软件的基础》一书中),总共有23种设计模式,分为三大类: 一、创建型模式(5种) 1. 单例模式(Sing…...

docker详细操作--未完待续

docker介绍 docker官网: Docker&#xff1a;加速容器应用程序开发 harbor官网&#xff1a;Harbor - Harbor 中文 使用docker加速器: Docker镜像极速下载服务 - 毫秒镜像 是什么 Docker 是一种开源的容器化平台&#xff0c;用于将应用程序及其依赖项&#xff08;如库、运行时环…...

阿里云ACP云计算备考笔记 (5)——弹性伸缩

目录 第一章 概述 第二章 弹性伸缩简介 1、弹性伸缩 2、垂直伸缩 3、优势 4、应用场景 ① 无规律的业务量波动 ② 有规律的业务量波动 ③ 无明显业务量波动 ④ 混合型业务 ⑤ 消息通知 ⑥ 生命周期挂钩 ⑦ 自定义方式 ⑧ 滚的升级 5、使用限制 第三章 主要定义 …...

OkHttp 中实现断点续传 demo

在 OkHttp 中实现断点续传主要通过以下步骤完成&#xff0c;核心是利用 HTTP 协议的 Range 请求头指定下载范围&#xff1a; 实现原理 Range 请求头&#xff1a;向服务器请求文件的特定字节范围&#xff08;如 Range: bytes1024-&#xff09; 本地文件记录&#xff1a;保存已…...

【Web 进阶篇】优雅的接口设计:统一响应、全局异常处理与参数校验

系列回顾&#xff1a; 在上一篇中&#xff0c;我们成功地为应用集成了数据库&#xff0c;并使用 Spring Data JPA 实现了基本的 CRUD API。我们的应用现在能“记忆”数据了&#xff01;但是&#xff0c;如果你仔细审视那些 API&#xff0c;会发现它们还很“粗糙”&#xff1a;有…...

【论文阅读28】-CNN-BiLSTM-Attention-(2024)

本文把滑坡位移序列拆开、筛优质因子&#xff0c;再用 CNN-BiLSTM-Attention 来动态预测每个子序列&#xff0c;最后重构出总位移&#xff0c;预测效果超越传统模型。 文章目录 1 引言2 方法2.1 位移时间序列加性模型2.2 变分模态分解 (VMD) 具体步骤2.3.1 样本熵&#xff08;S…...

【数据分析】R版IntelliGenes用于生物标志物发现的可解释机器学习

禁止商业或二改转载&#xff0c;仅供自学使用&#xff0c;侵权必究&#xff0c;如需截取部分内容请后台联系作者! 文章目录 介绍流程步骤1. 输入数据2. 特征选择3. 模型训练4. I-Genes 评分计算5. 输出结果 IntelliGenesR 安装包1. 特征选择2. 模型训练和评估3. I-Genes 评分计…...

深度学习习题2

1.如果增加神经网络的宽度&#xff0c;精确度会增加到一个特定阈值后&#xff0c;便开始降低。造成这一现象的可能原因是什么&#xff1f; A、即使增加卷积核的数量&#xff0c;只有少部分的核会被用作预测 B、当卷积核数量增加时&#xff0c;神经网络的预测能力会降低 C、当卷…...

管理学院权限管理系统开发总结

文章目录 &#x1f393; 管理学院权限管理系统开发总结 - 现代化Web应用实践之路&#x1f4dd; 项目概述&#x1f3d7;️ 技术架构设计后端技术栈前端技术栈 &#x1f4a1; 核心功能特性1. 用户管理模块2. 权限管理系统3. 统计报表功能4. 用户体验优化 &#x1f5c4;️ 数据库设…...