学以致用,基于OpenCV的公摊面积估算程序
由于很多户型图并没有标注各个房间或者走廊的面积,亦或比较模糊,且很多人并不具备迅速口算多个小数相加再做除法的能力,本帖通过程序粗略计算公摊比例。由于非专业人士,公摊面积涉及到很多建筑学的专业公式,因此本帖只能算作图像学的角度上的估算,结果仅供参考~
目录
准备工作
一.图像读取
二.边缘检测
三.梯度操作
四.轮廓检测
五.寻找户型轮廓
六.外接矩形
七.计算公摊
准备工作
本帖全部的操作都在之前的博客中总结,读过则本帖易如反掌:
OpenCV基础——轮廓检测、模板匹配、图像均衡化-CSDN博客文章浏览阅读537次,点赞10次,收藏10次。从原理上来说很简单,就是在原始图里面,从左到右,从上到下依次遍历每个面积和子图大小一样的子元素,分别计算子图与每个子元素的差别程度,然后将这些差别程度一次性返回。原理是,设置一个阈值,如果曲线上离近似直线的距离小于该阈值,则可以直接近似;不难发现上面的直方图整体来看还是比较不均匀的,当我们将直方图处理得更加均衡一些之后,整体的对比度和亮度都会有所提升。现有一个子图,将原始图分为好几个小的部分,需要从这些小部分中找出与子图最相近的部分。轮廓是可以计算面积的,但必须单个计算,也即轮询。https://blog.csdn.net/jsl123x/article/details/146720244?spm=1001.2014.3001.5501
然后是本帖用到的户型图——代码中的House.jpg:
接着是导包和自制的绘图函数:
import cv2
import numpy as np
def cv_show(img,name):cv2.imshow(name,img)cv2.waitKey(0)cv2.destroyAllWindows()
一.图像读取
读取两个同样的上述图片,draw作为一个副本用做后面的轮廓展示。这里统一先读取为彩色图,然后将img转为灰度图以便后续使用:
img=cv2.imread('D:\\House.jpg')
draw=cv2.imread('D:\\House.jpg')
img=cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
二.边缘检测
如果直接进行轮廓检测,效果不是很好,因为户型图本身线条粗细不一致,这里先行检测出轮廓,提高计算结果的真实性:
sobelx=cv2.Sobel(img,cv2.CV_64F,1,0,ksize=3)
sobelx=cv2.convertScaleAbs(sobelx)
sobely=cv2.Sobel(img,cv2.CV_64F,0,1,ksize=3)
sobely=cv2.convertScaleAbs(sobely)
sobel=cv2.addWeighted(sobelx,0.5,sobely,0.5,0)
tog=np.hstack((img,sobel))
cv_show(tog,'tog')
这里使用sobel算子,检测结果如下:
三.梯度操作
如上右图所示,玄关等处的线条过于狭窄,在轮廓检测的时候有概率会忽略,因此我们要进行一个梯度操作——即将边缘进一步加粗。在那之前,先将图片进行阈值操作直接变成黑白图:
ret, thresh = cv2.threshold(img, 127, 255, cv2.THRESH_BINARY)
cv_show(thresh, 'thresh')
kernel = np.ones((5,5),np.uint8)
thresh = cv2.morphologyEx(thresh, cv2.MORPH_GRADIENT, kernel)
cv_show(thresh, 'thresh')
轮廓得以加粗!
四.轮廓检测
经过上面的处理已经可以进行轮廓检测了:
contours, hierarchy = cv2.findContours(thresh, cv2.RETR_TREE, cv2.CHAIN_APPROX_NONE)
其中contours即为所有轮廓的合集~
五.寻找户型轮廓
但显然我们不需要所有的轮廓,而是真正的户型轮廓。因此我们可以将所有轮廓的面积存入一个列表,然后将面积最大的找出来,即为户型的轮廓!当然也可以考虑试试周长?
list=[]
for item in contours:list.append(cv2.contourArea(item))
max_index = np.argmax(list)
print(max_index)
print(list[max_index])
同时别忘了把下标返回来,用这个下标去contours里面找轮廓:这里是13号轮廓
用蓝色线条将户型轮廓画出!
res=cv2.drawContours(draw,contours,max_index,(255,0,0),2)
cv_show(res,'res')
六.外接矩形
实际上,户型中如果有有飘窗、弧形阳台、斜墙等非矩形结构,面积计算会按国家标准折算,而非简单长×宽,但是这里主要说明思想,就默认为长乘宽:即真实的面积可以近似为外接矩形。这里获取轮廓的上下左右极点坐标,用红线绘制外接矩形:
x,y,w,h=cv2.boundingRect(contours[max_index])
img1=cv2.rectangle(draw,(x,y),(x+w,y+h),(0,0,255),2)
cv_show(img1,'img1')
七.计算公摊
count=list[max_index]/(w*h)
print(f"公摊面积的比例是:{(1-count)*100}"+"%" )
如上即为本案例的全部流程。再次声明这并非正确规范的公摊计算方法,只是一个思想的展示~
此外户型图有多种,有些过于浅显的线条类型可能不适用本程序,各位可以挑战一下自行修改——难点仅检测轮廓户型唯一。本程序的另一个测试图如下,其实这种类型的户型图效果都还不错——当然这个有点过大,为了显示好看建议resize哦~
相关文章:
学以致用,基于OpenCV的公摊面积估算程序
由于很多户型图并没有标注各个房间或者走廊的面积,亦或比较模糊,且很多人并不具备迅速口算多个小数相加再做除法的能力,本帖通过程序粗略计算公摊比例。由于非专业人士,公摊面积涉及到很多建筑学的专业公式,因此本帖只…...
Odoo/OpenERP 和 psql 命令行的快速参考总结
Odoo/OpenERP 和 psql 命令行的快速参考总结 psql 命令行选项 选项意义-a从脚本中响应所有输入-A取消表数据输出的对齐模式-c <查询>仅运行一个简单的查询,然后退出-d <数据库名>指定连接的数据库名(默认为当前登录用户名)-e回显…...
Ubuntu20.04安装OpenVINO环境以及YOLOv8 C++部署测试
深度学习 文章目录 深度学习一、三种推理框架介绍1、OpenVINO介绍2、TensorRT介绍3、Mediapipe介绍 二、三种框架的对比1、框架自身比较2.1、从模型部署上:2.2.从支持深度学习模型上:2.3.从应用平台上:2.4.从上手的难易程度上: 2、应用平台比…...
uniapp微信小程序封装navbar组件
一、 最终效果 二、实现了功能 1、nav左侧返回icon支持自定义点击返回事件(默认返回上一步) 2、nav左侧支持既显示返回又显示返回首页icon 3、nav左侧只显示返回icon 4、nav左侧只显示返回首页icon 5、nav左侧自定义left插槽 6、nav中间支持title命名 7…...
Docker中安装MySQL--------【详细图解】
1.根据所需拉取镜像---------不指定版本会下载最新版 docker pull mysql:8.0.27 2.查看所拉取的镜像 docker images 3.在/usr/local下创建docker、mysql目录 cd /usr/local mkdir docker mkdir mysql 4.进入mysql文件夹 cd mysql 5.创建config文件夹 mkdir config 6.编写配…...
QT基础:安装与简介
QT初级 1、简介1.1 安装1.2 设置1.3 在VS中配置Qt1.3 帮助文档 2、Qt项目2.1 创建项目2.1 项目文件2.2 Qt中的窗口类窗口显示 2.3 坐标体系2.4 内存回收 1、简介 QT是一个跨平台的C应用程序开发框架。几乎支持所有的平台, 可用于桌面程序开发以及嵌入式开发。 Qt是标准 C 的扩…...
智能打印预约系统:微信小程序+SSM框架实战项目
微信小程序打印室预约系统,采用SSM(SpringSpringMVCMyBatis)经典框架组合。 一、系统核心功能详解 1. 智能化管理后台 用户数据看板打印店资源管理预约动态监控服务评价系统 2. 微信小程序端 智能定位服务预约时段选择文件…...
AWTK-WEB 快速入门(6) - JS WebSocket 应用程序
WebSocket 可以实现双向通信,适合实时通信场景。本文介绍一下使用 Javacript 语言开发 AWTK-WEB 应用程序,并用 WebSocket 与服务器通讯。 用 AWTK Designer 新建一个应用程序 先安装 AWTK Designer: https://awtk.zlg.cn/web/index.html …...
一.搭建ubuntu系统服务器
搭建ubuntu系统服务器 一:Ubantu下载及安装1.Ubuntu的U盘系统安装工具制作2.Ubuntu系统安装 二.安装ssh实现远程连接1.安装OpenSSH服务器2.启动SSH服务并设置开机自启3.配置文件4.配置防火墙5.处理SELinux(仅限CentOS/RHEL)6.设置和修改SSH密…...
[python]基于yolov8实现热力图可视化支持图像视频和摄像头检测
YOLOv8 Grad-CAM 可视化工具 本工具基于YOLOv8模型,结合Grad-CAM技术实现目标检测的可视化分析,支持图像、视频和实时摄像头处理。 功能特性 支持多种Grad-CAM方法实时摄像头处理视频文件处理图像文件处理调用简单 环境要求 Python 3.8需要电脑带有…...
微软 GraphRAG 项目学习总结
微软2024年4月份发布了一篇《From Local to Global: A GraphRAG Approach to Query-Focused Summarization》(GraphRAG:从局部到全局的查询式摘要方法)论文,提出了一种名为GraphRAG的检索增强生成(RAG)方法…...
DeepSeek结合MCP Server与Cursor,实现服务器资源的自动化管理
MCP Server是最近AI圈子中又一个新的热门话题。很多用户都通过结合大语言模型、MCP Server,实现了一些工具流的自动化,例如,你只需要给出文字指令,就可以让Blender自动化完成建模的工作。你有没有想过,利用MCP来让AI A…...
DFX架构详解:构建面向全生命周期的卓越设计体系
引言 在当今高度竞争的市场环境中,产品开发已不再是单纯的功能实现,而是需要从设计源头考虑制造效率、用户需求、成本控制、环境兼容性等多维目标。DFX(Design for X)架构作为一种系统化的设计方法论,正成为企业实现产…...
如何在 Vue 项目中使用 Vite 和 Cordova 动态加载 Layui 和 DTree
随着前端开发工具的不断进步,Vue 项目的构建工具也从 Webpack 升级到了 Vite。Vite 的快速构建和热更新功能使得开发体验大大提升。 本文将介绍如何在迁移至 Vite 后,动态加载 Layui 和 DTree 库,并兼容 Cordova 应用中的资源路径。 1. Vite …...
如何在 vue 渲染百万行数据,vxe-table 渲染百万行数据性能对比,超大量百万级表格渲染
vxe-table 渲染百万行数据性能对比,超大量百万级表格渲染;如何在 vue 渲染百万行数据;当在开发项目时,遇到需要流畅支持百万级数据的表格时, vxe-table 就可以非常合适了,不仅支持强大的功能,虚…...
el-select+el-tree实现下拉树形选择
主要实现el-select下使用树结构,支持筛选功能 封装的组件 composeTree.vue <template><div class"vl-tree"><el-select class"treeScroll" popper-class"treeScrollSep"v-model"selectedList"placeholder"请选择…...
JavaScript函数知识点总结
JavaScript函数是一种可重复使用的代码块,它接受输入值(参数)、执行特定任务,并返回输出值。 1. 声明函数 function greet(name) {return "Hello, " + name + "!"; }console.log(greet("Alice")); // 输出: Hello, Alice! console.log( t…...
SQL INSERT INTO 语句详解
SQL INSERT INTO 语句详解 引言 SQL(Structured Query Language)是数据库管理系统的标准语言,用于处理数据库中的数据。在SQL中,INSERT INTO 语句是用于向数据库表中插入新记录的重要命令。本文将详细介绍 INSERT INTO 语句的用…...
为什么可视化大屏越来越多应用3D元素呢?
现在可视化大屏应用3D元素越来越普及了,背后的原因是什么呢?3D元素相较于2D元素有什么优势?应用3D元素涉及到哪些技术呢?大象数据工场通过本文与大家分享一下。 一、3D元素普及的原因是什么? 可视化大屏应用中使用3D…...
Github Webhook 以及主动式
Github配置 GitHub 默认支持两种 Content-Type: application/json application/x-www-form-urlencoded 特别要注意 Content-Type 我们选择: application/json Flask代码 import os import shutil import subprocess from flask import Flask, request, jsonifyapp = Fla…...
MySQL的基础语法1(增删改查、DDL、DML、DQL和DCL)
目录 一、基本介绍 二、SQL通用语法 三、SQL分类(DDL、DML、DQL、DCL) 1.DDL 1.1数据库操作 1.2表操作 1.2.1表操作-查询创建 1.2.2表操作-数据类型 1)数值类型 2)字符串类型 3)日期时间类型编辑 4)表操作-案例 1.2.3…...
基于 SpringBoot 的火车订票管理系统
收藏关注不迷路!! 🌟文末获取源码数据库🌟 感兴趣的可以先收藏起来,还有大家在毕设选题(免费咨询指导选题),项目以及论文编写等相关问题都可以给我留言咨询,希望帮助更多…...
c#的反射和特性
在 C# 中,反射(Reflection)和特性(Attributes)是两个强大的功能,它们在运行时提供元编程能力,广泛用于框架开发、对象映射和动态行为扩展。以下是对它们的详细介绍,包括定义、用法、…...
MaxEnt物种分布建模全流程;R+ArcGIS+MaxEnt模型物种分布模拟、参数优化方法、结果分析制图与论文写作
融合R语言的MaxEnt模型具有以下具体优势: 数据处理高效便捷 📊强大的数据预处理功能:R语言提供了丰富的数据处理工具,能够轻松完成数据清洗、筛选、转换等操作,为MaxEnt模型提供高质量的输入数据。 🌐自动…...
【AI插件开发】Notepad++插件开发实践:从基础交互到ScintillaCall集成
一、背景与目标 在文本编辑器领域,Notepad凭借其轻量级特性和强大的插件生态,成为开发者群体中的热门选择。作为基于Scintilla组件构建的编辑器(Scintilla是开源的代码编辑控件,被Notepad、Geany等知名工具广泛采用)&…...
TCP/IP协议的应用层与传输层
TCP/IP协议簇是互联网的核心通信框架,定义了数据如何在网络中封装、寻址、传输和路由(确定数据包从源主机到目标主机的传输路径的过程)。 应用层 直接面向用户和应用,负责实现网络服务的具体功能(如网页浏览、文件传输…...
CentOS与Ubuntu命令对比指南:从软件包管理到系统配置
CentOS与Ubuntu命令对比指南 作为两大主流Linux发行版,**CentOS(基于RHEL)和Ubuntu(基于Debian)**在日常运维中常因命令差异引发混淆。本文通过关键场景对比,助您快速掌握两者的核心操作区别。 一、软件包管理:yum/dnf vs apt 操作CentOSUbuntu更新软件源yum check-upd…...
python-leetcode 61.N皇后
题目: 按照国际象棋的规则,皇后可以攻击与之处在同一行或同一列或同一斜线上的棋子。 n 皇后问题 研究的是如何将 n 个皇后放置在 nn 的棋盘上,并且使皇后彼此之间不能相互攻击 给你一个整数 n ,返回所有不同的 n 皇后问题 的解…...
Scala 正则表达式
Scala 正则表达式 引言 正则表达式(Regular Expression)是一种强大的文本处理工具,在Scala编程语言中也有着广泛的应用。Scala正则表达式可以帮助开发者高效地进行字符串匹配、搜索、替换和解析等操作。本文将深入探讨Scala正则表达式的相关知识,包括语法、常用模式、匹配…...
【分布式】分布式限流方案解析
文章目录 固定窗口限流方案实现方式优点缺点 滑动窗口限流方案实现方式优点缺点 令牌桶限流方案实现方式优点缺点 漏斗限流方案实现方式优点缺点 在分布式系统蓬勃发展的当下,系统面临的流量挑战日益复杂。为确保系统在高并发场景下…...
Docker 拉取镜像部分成功部分失败?
🐋 Docker 拉取镜像部分成功部分失败?一次代理配置踩坑记录! 最近在部署 Zitadel 身份认证平台的过程中,遇到一个看似“随机”的问题:Docker 有些镜像可以拉取,有些却一直超时失败。最终通过配置 Docker 守…...
Spring AI Alibaba 对话记忆使用
一、对话记忆 (ChatMemory)简介 1、对话记忆介绍 ”大模型的对话记忆”这一概念,根植于人工智能与自然语言处理领域,特别是针对具有深度学习能力的大型语言模型而言,它指的是模型在与用户进行交互式对话过程中,能够追踪、理解并利…...
Mysql从入门到精通day5————子查询精讲
本文主要讲述子查询的几种方法,读者注意体会它们的不同场合的适用情况及功能,本篇文章也融入了小编实践过程遇到的坑,希望读者不要再踩坑 一.带IN关键字的子查询 in关键字可以检测结果集中是否存在某个特定的值,检测成功则执行外…...
QScreen 捕获屏幕(截图)
一、QScreen核心能力解析 硬件信息获取 // 获取主屏幕对象 QScreen* primaryScreen QGuiApplication::primaryScreen();// 输出屏幕参数 qDebug() << "分辨率:" << primaryScreen->size(); qDebug() << "物理尺寸:" << primar…...
Skyeye 云智能制造办公系统 VUE 版本 v3.15.15 发布
Skyeye 云智能制造,采用 Springboot winUI 的低代码平台、移动端采用 UNI-APP。包含 30 多个应用模块、50 多种电子流程,CRM、PM、ERP、MES、ADM、EHR、笔记、知识库、项目、门店、商城、财务、多班次考勤、薪资、招聘、云售后、论坛、公告、问卷、报表…...
【最新】探索CFD的未来:从OpenFOAM到深度学习,全面解析计算流体力学的顶级资源与前沿技术
计算流体力学(CFD)作为现代工程与科学研究的核心工具,正以前所未有的速度迈向智能化与多物理场耦合的新时代。本文全面梳理了在线学习CFD的顶级资源,涵盖了从传统数值模拟到深度学习驱动的物理信息模型的广泛领域,旨在为研究者、工程师和学生提供一站式参考指南。内容分为…...
【QT5 网络编程示例】TCP 通信
文章目录 TCP 通信 TCP 通信 QT主要通过QTcpSocket 和 QTcpServer两个类实现服务器和客户端的TCP 通信。 QTcpSocket 是 Qt 提供的套接字类,看用于建立、管理和操作 TCP 连接。 常用方法 connectToHost(host, port):连接到指定服务器。disconnectFro…...
QT五 文件系统,QFile,QfileInfo
总览 QIODevice:所有 I/O 设备类的父类,提供了字节块读写的通用操作以及基本接口;QFileDevice:Qt5新增加的类,提供了有关文件操作的通用实现。QFlie:访问本地文件或者嵌入资源;QTemporaryFile&a…...
OpenMCU(五):STM32F103时钟树初始化分析
概述 本文主要描述了STM32F103初始化过程系统时钟的初始化,主要描述了系统时钟的初始化,AHB总线时钟,APB总线时钟等的初始化。 硬件板卡3d图 时钟树 STM32F103的时钟树,如下所示: 时钟源选择 从STM32F103的时钟树框图,我们可以…...
docker save如何迁移镜像更节省空间?
文章目录 方法一:使用docker save命令方法二:直接保存多个镜像到一个tar文件哪个方法更节省磁盘空间?空间效率对比实际测试示例其他优势结论 如何用脚本迁移加载镜像 迁移镜像时候,往往会碰到基础镜像相同的很多镜像需要迁移&…...
在 UniApp 编译小程序时出现 `:class` 不支持 `getStatusClass(device.deviceStatus)` 语法的报错
在 UniApp 编译小程序时出现 :class 不支持 getStatusClass(device.deviceStatus) 语法的报错,这是因为在非 H5 平台,v-bind:class(:class 是其简写形式)里直接使用方法调用这种动态计算类名的方式可能不被支持。下面为你提供几种…...
Python之贪心算法
Python实现贪心算法(Greedy Algorithm) 概念 贪心算法是一种在每一步选择中都采取当前状态下最优的选择,从而希望导致结果是全局最优的算法策略。 基本特点 局部最优选择:每一步都做出当前看起来最佳的选择不可回退:一旦做出选择…...
Javaweb后端AOP记录操作日志
日志记录表 提示词 切入点表达式,注解的方法 查询不用加上日志记录功能...
obsidian ios git同步
首先感谢几位博主的文章,我现在时间久了,未保存原文地址。以下是我自己的执行步骤总结。 应用商店安装 iSH 打开iSH,执行 apk update 安装下面软件,(我觉得只安装第一个应该就行,下次测试)。 …...
我的机器学习学习之路
学习python的初衷 • hi,今天给朋友们分享一下我是怎么从0基础开始学习机器学习的。 • 我是2023年9月开始下定决心要学python的,目的有两个,一是为了提升自己的技能和价值,二是将所学的知识应用到工作中去,提升工作…...
Python的ASGI Web 服务器之uvicorn
文章目录 什么是uvicornUvicorn 和 uWSGI 对比区别安装 Uvicorn使用示例 什么是uvicorn 官网https://www.uvicorn.org/ Uvicorn 是一个用于 Python 的 ASGI Web 服务器实现。 Until recently Python has lacked a minimal low-level server/application interface for async…...
Spring Boot分布式项目实战:装饰模式的正确打开方式
我在最近参与的物流中台项目中,面对复杂的分布式服务调用场景时,发现装饰模式(Decorator Pattern)竟成为提升系统扩展性的秘密武器。当某个基础服务接口需要同时支持缓存、日志、限流等多种能力时,传统的继承方式已难以…...
基于WebSocket的金融数据实时推送系统架构设计对接多国金融数据API
基于WebSocket的金融数据实时推送系统架构设计 ——高可用、低延迟与全球化数据支持的技术实践 一、实时数据推送的技术演进 在证券交易、外汇监控、量化策略等场景中,毫秒级延迟可能带来完全不同的业务结果。早期基于HTTP轮询的方案存在三大核心问题:…...
Java虚拟机JVM知识点(已完结)
JVM内存模型 介绍下内存模型 根据JDK8的规范,我们的JVM内存模型可以拆分为:程序计数器、Java虚拟机栈、堆、元空间、本地方法栈,还有一部分叫直接内存,属于操作系统的本地内存,也是可以直接操作的。 详细解释一下 程…...
ffuf:一款高效灵活的Web模糊测试利器
在网络安全领域,模糊测试(Fuzzing)是一种强大的技术,用于发现系统中的隐藏功能、潜在漏洞或未公开资源。而在Web渗透测试中,ffuf(Fast Fuzzing Tool)凭借其高效性、灵活性和强大的自定义能力&am…...