学以致用,基于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的公摊面积估算程序
由于很多户型图并没有标注各个房间或者走廊的面积,亦或比较模糊,且很多人并不具备迅速口算多个小数相加再做除法的能力,本帖通过程序粗略计算公摊比例。由于非专业人士,公摊面积涉及到很多建筑学的专业公式,因此本帖只…...
爬虫:网络请求(通信)步骤,http和https协议
电脑(浏览器):www.baidu.com——url DNS服务器:IP地址标注服务器——1.1.38 DNS服务器返回IP地址给浏览器 浏览器拿到IP地址去访问服务器,返回响应 服务器返回给响应数据:html/css/js/jpg... html:文本 cs…...
d2025331
目录 一、删除有序数组中的重复项II 二、删除有序数组中的重复项 三、数字转罗马格式 一、删除有序数组中的重复项II 一下写过,挺舒服! 1、统计超出2的数量有多少,仅保留2个重复数字 2、有多少次就从后往前覆盖几次 public int removeDupl…...
QT6开发指南笔记(1)QT简介,安装
(1)刚刚结束了 C 的学习,谢谢阿西老师的教导,开始 QT 的学习,运用 C ,而非 QML 。 保持知识的连贯性。 QT 公司 : (2)接着介绍 QT 的安装: 提取到的…...
Redis BitMap 实现签到及连续签到统计
一、引言 用户签到功能是很多应用都离不开的一个板块,单词打开、QQ达人等等为我们所熟知,这项功能该如何实现呢,一些朋友可能想当然的觉得无非将每日的签到数据记录下来不就好了,不会去细想用谁记录,如何记录才合适。 …...
全面解析 Spring AOP 切入点表达式
全面解析 Spring AOP 切入点表达式 大家好,我是钢板兽! Spring AOP(面向切面编程)是我们日常开发中实现日志记录、权限控制、事务管理等功能的神器。而切入点表达式(Pointcut Expression)则是这个神器的“…...
去中心化稳定币机制解析与产品策略建议
去中心化稳定币机制解析与产品策略建议(以Maker/DAI为例) 一、核心机制对比:法币抵押型 vs. 加密货币抵押型 法币抵押型(如USDT) 技术逻辑:1:1美元储备托管于中心化机构(如银行)&…...
GO语言杂记(文章持续更新)
1、MAIN冲突 在一个文件夹下有两个go文件同时写了main函数,将会报错,main函数只能在main包中。 实则不然,有些环境下并不会报错。 2、gofmt命令---自动对齐 命令作用:将go文件代码自动缩进。 gofmt -w escapecharprac.go...
OS6.【Linux】基本指令入门(5)
目录 1.配置公网IP到XShell中 2.日志 定义和作用 3.一些指令 date %Y、%m、%d、%H、%M、%S、%X、%F %s 时间戳的特点 时间戳的转换 cal cal 年份 其他选项 ★find★ whereis grep 练习 -v选项 -n选项 -i选项 多文件查找 特定目录下查找 1.配置公网IP到XShe…...
Moo0 VideoResizer,简单高效压缩视频!
Moo0 VideoResizer 是一款免费、轻量级的视频压缩工具,支持通过调整文件大小、屏幕尺寸或比特率等方式实现高效视频压缩。其核心优势在于操作简单且无需破解,可直接下载安装使用。软件注重用户友好性,采用非破坏性压缩技术,所有…...
【开发问题记录】高德地图 Web 端开发详解:高德地图 API 最佳实践指南(安装、marker添加、逆向地理编码、实际业务案例实操)
文章目录 1、引入高德地图的准备工作2、高德地图 JS API 使用方式2.1 JS API Loader2.1.1 使用 script 标签加载loader2.1.2 NPM 安装loader 2.2 script 标签加载 JS API 脚本2.2.1 同步加载2.2.2 异步加载 3、在 vue3 项目中使用3.1 安装 js api loader3.2 在组件中使用 4、实…...
Unity 简单使用Addressables加载SpriteAtlas图集资源
思路很简单,传入图集名和资源名,利用Addressables提供的异步加载方式从ab包中加载。加载完成后存储进缓存字典里,以供后续使用。 添加引用计数,防止多个地方使用同一图集时,不会提前释放 using UnityEngine; using U…...
LangChain 结构化输出:用 Pydantic + PydanticOutputParser 驯服 LLM 的“自由发挥”
目录 一、Pydantic 二、PydanticOutputParser 1、为什么需要 PydanticOutputParser? 2、Pydantic和PydanticOutputParser核心区别 3、Pydantic的不足 (1)无法直接解析非结构化文本 (2)缺乏对 LLM 输出的适配性 …...
快速入手-基于Django-rest-framework的自身组件权限认证(九)
1、在对应的视图函数里增加认证(局部起作用,不全局生效) 导入类: from rest_framework.authentication import ( BasicAuthentication, SessionAuthentication, ) from rest_framework.permissions import IsAuthentica…...
【复活吧,我的爱机!】Ideapad300-15isk拆机升级:加内存条 + 换固态硬盘 + 换电源
写在前面:本博客仅作记录学习之用,部分图片来自网络,如需引用请注明出处,同时如有侵犯您的权益,请联系删除! 文章目录 前言升级成本升级流程电池健康度加内存条和换内存条光驱位加装机械硬盘更换电池重装系…...
基于Spring AI开发本地Jenkins MCP Server服务
前言 首先介绍下MCP是什么? MCP是由开发了 Claude 模型的 Anthropic 公司2024年11月提出并开源的一项开放标准,全称:Model Context Protocol,它是一个开放协议,它使 LLM 应用与外部数据源和工具之间的无缝集成成为可能…...
基于简单神经网络的线性回归
一、概述 本代码实现了一个简单的神经网络进行线性回归任务。通过生成包含噪声的线性数据集,定义一个简单的神经网络类,使用梯度下降算法训练网络以拟合数据,并最终通过可视化展示原始数据、真实线性关系以及模型的预测结果。 二、依赖库 …...
【nvidia】Windows 双 A6000 显卡双显示器驱动更新问题修复
问题描述:windows自动更新nvidia驱动会导致只检测得到一个A6000显卡。 解决方法 下载 A6000 驱动 572.83-quadro-rtx-desktop-notebook-win10-win11-64bit-international-dch-whql.exehttps://download.csdn.net/download/qq_18846849/90554276 不要直接安装。如…...
《SRv6 网络编程:开启IP网络新时代》第2章、第3章:SRv6基本原理和基础协议
背景 根据工作要求、本人掌握的知识情况,仅针对《SRv6 网络编程:开启IP网络新时代》书籍中涉及的部分知识点进行总结梳理,并与工作小组进行分享,不涉及对原作的逐字搬运。 问题 组内同事提出的问题:本文缺扩展头描述…...
如何将AI模型返回的字符串转为html元素?
场景: 接入deepseek模型的api到我们平台,返回的字符串需要做下格式化处理。 返回的数据是这样的: {"role": "assistant","content": "<think>\n嗯,用户问的是“星体是什么”。首先&am…...
Citus源码(1)分布式表行为测试
最近对citus的实现非常好奇,本篇对citus的行为做一些测试。本篇只测行为,不分析源码。后面会继续写一系列文章分析citus源码。 环境:3节点 PG17 with citus。 SELECT citus_set_coordinator_host(127.0.0.1, 3001); SELECT citus_add_node(1…...
装饰器模式与模板方法模式实现MyBatis-Plus QueryWrapper 扩展
pom <dependency><groupId>com.github.yulichang</groupId><artifactId>mybatis-plus-join-boot-starter</artifactId> <!-- MyBatis 联表查询 --> </dependency>MPJLambdaWrapperX /*** 拓展 MyBatis Plus Join QueryWrapper 类&…...
【PCIE711-214】基于PCIe总线架构的4路HD-SDI/3G-SDI视频图像模拟源
产品概述 PCIE711-214是一款基于PCIE总线架构的4路SDI视频模拟源。该板卡为标准的PCIE插卡,全高尺寸,适合与PCIE总线的工控机或者服务器,板载协议处理器,可以通过PCIE总线将上位机的YUV 422格式视频数据下发通过SDI接口播放出去&…...
突破反爬困境:SDK开发,浏览器模块(七)
声明 本文所讨论的内容及技术均纯属学术交流与技术研究目的,旨在探讨和总结互联网数据流动、前后端技术架构及安全防御中的技术演进。文中提及的各类技术手段和策略均仅供技术人员在合法与合规的前提下进行研究、学习与防御测试之用。 作者不支持亦不鼓励任何未经授…...
rce操作
Linux命令长度突破限制 源码 <?php $param $_REQUEST[param];if ( strlen($param) < 8 ) {echo shell_exec($param); } echo执行函数,$_REQUEST可以接post、get、cookie传参 源码中对参数长度做了限制,小于8位,可以利用临时函数&…...
LabVIEW高效溢流阀测试系统
开发了一种基于LabVIEW软件和PLC硬件的溢流阀测试系统。通过集成神经网络优化的自适应PID控制器,该系统能自动进行压力稳定性、寿命以及动静态性能测试。该设计不仅提升了测试效率,还通过智能化控制提高了数据的精确性和操作的便捷性。 项目背景&…...
Spring Boot 中 JdbcTemplate 处理枚举类型转换 和 减少数据库连接的方法 的详细说明,包含代码示例和关键要点
以下是 Spring Boot 中 JdbcTemplate 处理枚举类型转换 和 减少数据库连接的方法 的详细说明,包含代码示例和关键要点: 一、JdbcTemplate 处理枚举类型转换 1. 场景说明 假设数据库存储的是枚举的 String 或 int 值,但 Java 实体类使用 enu…...
DataGear 5.3.0 制作支持导出表格数据的数据可视化看板
DataGear 内置表格图表底层采用的是DataTable表格组件,默认并未引入导出数据的JS支持库,如果有导出表格数据需求,则可以在看板中引入导出相关JS支持库,制作具有导出CSV、Excel、PDF功能的表格数据看板。 在新发布的5.3.0版本中&a…...
Web网页内嵌 Adobe Pdf Reader 谷歌Chrome在线预览编辑PDF文档
随着数字化办公的普及,PDF文档已成为信息处理的核心载体,虽然桌面端有很多软件可以实现预览编辑PDF文档,而在线在线预览编辑PDF也日益成为一个难题。 作为网页内嵌本地程序的佼佼者——猿大师中间件,之前发布的猿大师办公助手&am…...
歌词json
绽放(4:17) {"lyrics": [{time: 00:00, text: 作词:郑润泽},{time: 00:01, text: 作曲:郑润泽},{time: 00:02, text: 编曲:赵建飞},{time: 00:03, text: 制作人:李淘/赵建飞},{time: 00:09, tex…...
