简单户型图处理—20180606-20180623

20180606-20180623

1、预处理

针对简单无背景背景图,

 

(1)阈值分割   wall_thresh(Mat &src)

 

(2)去标尺   ReturnImgWithoutRuler(Mat& image1, Mat& imgWithoutR)

(3)腐蚀膨胀,dilate_erode(Mat&src)

(4)遍历找到行列边界

 

2、识别门窗的位置

(5)对原图进行LSD直线提取

        

        Mat wall_2 = image.clone();Ptr<LineSegmentDetector> ls = createLineSegmentDetector(LSD_REFINE_STD, 1, 0.6, 2.0, 10, 0, 0.7, 1024);vector<Vec4i> lines_std;ls->detect(wall_2, lines_std);

(6)通过腐蚀膨胀后的墙体图对提取出来的直线进行掩膜处理

(7)用掩膜图过滤提取的直线,保留起点和终点都在墙体内(包含门窗)的直线

(8)利用墙体二值化的图像膨胀一圈作为掩膜得到门窗线

(9)利用sobel算子锐化门窗线

        Mat image_Nd_Sobel;Mat grad_x, grad_y;Mat grad;Mat abs_grad_x, abs_grad_y;Sobel(image_Nd, grad_y, CV_16S, 0, 1, 3, 1, 0, BORDER_DEFAULT);Sobel(image_Nd, grad_x, CV_16S, 1, 0, 3, 1, 0, BORDER_DEFAULT);convertScaleAbs(grad_x, abs_grad_x);convertScaleAbs(grad_y, abs_grad_y);addWeighted(abs_grad_x, 0.5, abs_grad_y, 0.5, 0, grad);

(10)将门窗线进行膨胀腐蚀,然后OSTU二值化分割背景和前景,得到墙体所在位置

(11)找到外轮廓,

findContours(image_out, contours, hierarcy, CV_RETR_EXTERNAL, CV_CHAIN_APPROX_NONE);

计算每个轮廓的最小外接矩形,minAreaRect(Mat(contours[i]))

(12)输出矩形短边中心点,作为门窗两点坐标

(13)将门窗点位作为先验知识,放入image_out_dilate,墙体二值图进行验证
  两端点开始,沿垂直于门窗线的位置开始搜索同墙体区域边界的角点
  设置搜索阈值20像素,没有搜到两个端点则不改变原点位
  若两端都搜索到,则以较短处的中点作为结果输出

  比较纠正结果与原点位差距,小于2个像素则不更改

3、处理墙体(旧-基于边缘检测)

(14)canny边缘检测,Canny(wall_all, cannyb, 3, 9, 3)

(15)手动写模板对边角进行校正,canny_fix(Mat&src)

(16)灰度图像矢量化,起点终点都为灰度断点,

vectorize(Mat&src, vector <Vec4i> &lines_x, vector <Vec4i> &lines_y, vector<Vec4i>&lines)

(17)画出单通道矢量化的直线

(18)画三通道矢量化直线,便于后续可视化表示墙体线段

        Mat background12(image.rows, image.cols, CV_8UC3, Scalar(255, 255, 255));draw_Lines(background12, lines_x, Scalar(0, 0, 0));//0表示黑色墙外线draw_Lines(background12, lines_y, Scalar(0, 0, 0));//0表示黑色墙外线

(19)检测墙体中线,

wall_skeleton(Mat&mask,vector<Vec4i>&lines_x,vector<Vec4i>&lines_y,vector<Vec4i>&walls_x,vector<Vec4i>&walls_y)

(20)先把x、y方向上的门窗线段放到墙体线段容器中方便一起优化

(21)矢量化直线的校正优化

       //第一步优化:合并基本相同的线段(方向相同,距离为0,且有重复部分)		lines_single(image, wall_lines_x);//合并基本相同的线段(方向相同,距离为0,且有重复部分)lines_single(image, wall_lines_y);//合并基本相同的线段(方向相同,距离为0,且有重复部分)//第二步优化:平行且距离相近的两条直线,按照所在水平(垂直)位置所有直线的总长度大小进行校正lines_fix(wall_lines_x, dis_thresh);lines_fix(wall_lines_y, dis_thresh);//第三步优化:合并基本相同的线段(方向相同,距离为0,且有重复部分)lines_single(image, wall_lines_x);lines_single(image, wall_lines_y);//第四步优化:去除较短直线并放入wall_lines中wall_lines.clear();lines_filter(wall_lines_x, wall_lines, length_thresh);lines_filter(wall_lines_y, wall_lines, length_thresh);//第五步优化:延长直线两端lines_merge(wall_lines, merge_thresh);//延长直线两端//第六步优化:搜索交点作为直线端点,重新矢量化线段lines_split(image, wall_lines);draw_Lines(background12, wall_lines, Scalar(0, 0, 255));

(22)特殊矢量化,起点终点包含十字型或丁字型节点,用于区分承重墙和非承重墙

sp_vectorize(Mat&src, Mat&mask, vector<Vec6i>&lines, int gray, int check)

最终结果如上。

4、墙体处理(新-基于像素,更准确)

(23)去标尺

ReturnImgWithoutRuler(image, ImageWithoutR)

(24)二值化

threshold(ImageWithoutR, BinaryWithoutR, 210, 255, THRESH_BINARY_INV);

(25)腐蚀膨胀

        int g_nStructElementSize = 2;Mat element = getStructuringElement(MORPH_RECT,Size(2 * g_nStructElementSize + 1, 2 * g_nStructElementSize + 1),Point(g_nStructElementSize, g_nStructElementSize));erode(BinaryWithoutR, BinaryWithoutR, element);dilate(BinaryWithoutR, BinaryWithoutR, element);

(26)边缘检测及校正

        Canny(BinaryWithoutR, cannyWithoutR, 3, 9, 3);//Cannycanny_fix(cannyWithoutR);

(27)矢量化,vectorize(cannyb, lines_x, lines_y, lines);

(28)找到xy方向外轮廓

        Mat imageOutContoursX(image.rows, image.cols, CV_8UC1, Scalar(255));FindOutContours(lines_x, 1, ImgSize, ImageWithoutR, imageOutContoursX); //1 for 水平方向Mat imageOutContoursY(image.rows, image.cols, CV_8UC1, Scalar(255));FindOutContours(lines_y, 0, ImgSize, ImageWithoutR, imageOutContoursY); //0 for 竖直方向

(29)腐蚀膨胀去噪

(30)矢量化,vectorize_xy(Mat&src, vector <Vec4i> &lines, int IsHor)

(31)找墙体中线(根据找出的轮廓线,圈矩形逐像素找正确的边界然后,算中线),去除重复并存储

NeighborRectX(vector<Vec4i> lines, int index, vector<Vec6i>& MediumLines)

(32)搜索交点作为直线端点,重新矢量化中线

lines_split_new(backgroundMediumLines, MediumLines);

(33)特殊矢量化,区分承重墙与非承重墙

sp_vectorize(Mat&src, Mat&mask, vector<Vec6i>&lines, int gray, int check)

(34)根据标尺绑定中线真实长度(未实现)。

5、识别门窗(新-能识别门和窗的位置及种类)

       //检测门窗中线vector<Vec6i>win_door_temp;vector<Vec6i>win_door_mid;findWinDoorMidL(wall_all, walls, win_door_temp);lines_filter6(win_door_temp, win_door_mid, 15);//伸出门窗分类vector<Vec6i>win_door_out_sort_temp;windoor_out_sort(wall_th_windoor, win_door_mid, win_door_out_sort_temp);//查找未伸出门窗vector<Vec6i>win_door_in_sort_temp;find_windoor_in(wall_th_windoor, win_door_mid, win_door_in_sort_temp);vector<Vec6i>win_door_out_sort;vector<Vec6i>win_door_in_sort_temp2;lines_minus(win_door_out_sort_temp, win_door_in_sort_temp, win_door_out_sort);lines_minus(win_door_mid, win_door_out_sort, win_door_in_sort_temp2);//未伸出门窗分类vector<Vec6i>win_door_in_sort;windoor_in_sort(wall_th_windoor, win_door_in_sort_temp2, win_door_in_sort);vector<Vec6i>win_door_sort;for (int i = 0; i < win_door_out_sort.size(); i++){win_door_sort.push_back(win_door_out_sort[i]);}for (int j = 0; j < win_door_in_sort.size(); j++){win_door_sort.push_back(win_door_in_sort[j]);}

(35)先找到门窗中线,墙体中线 - 墙体腐蚀膨胀图得。

(36)找到飘窗、门、正常窗等的结构特征进行识别。

6、处理标尺,将标尺与数值绑定

(37)提取标尺

(38)将数字提取出来,然后调用baiduOCR,用python代码进行文字识别

(39)将标尺提取出来,标尺分段并标记

(40)绑定标尺数值,建立标尺与数字的一一对应关系

 

 

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

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

相关文章

Tableau可视化设计案例-01Tableau简介,条形图与直方图

文章目录 Tableau可视化设计案例Tableau简介&#xff0c;条形图与直方图Tableau界面介绍Tableau绘制条形图2.1条形图1 各地区酒店数量2.2条形图2&#xff1a;各地区酒店均价2.3堆积图&#xff1a;价格等级堆积图 Tableau绘制直方图3.1直方图概念与用途3.2创建评分直方图 Tablea…

这样的设计,美不胜收——多方案住宅设计

本次设计案例为&#xff1a;红星天珀-高层B户 我们认为品质生活&#xff0c;不是用金钱来妆点&#xff0c;而是能够用有限的资源&#xff0c; 充分的分配成想要的样子&#xff0c;用审美、品味、还有见识弥补物质上的短板&#xff0c; 享受这样的过程&#xff0c;也享受别人对这…

我问 bard“你知道你比chatgpt差吗”,它说:

【翻译】我知道ChatGPT是一个比我更先进的语言模型。它是在我之后几个月之前发布的&#xff0c;它已经在一个更大的文本和代码数据上进行了训练。这意味着它能够产生更准确和翔实的答复您的问题。但是&#xff0c;我还在开发中&#xff0c;我每天都在学习新的东西&#xff0c;我…

你知道ChatGPT里面的G、P、T分别代表什么吗?

生成式AI&#xff0c; 在学习归纳数据分布的基础上&#xff0c;创造数据中不存在的新内容。可以生成文本、图片、代码、语音合成、视频和3D模型。 比尔盖茨&#xff1a;ChatGPT是1980年以来最具革命性的科技进步。 身处这个AI变革的时代&#xff0c;唯有躬身入局&#xff0c;…

华为AI盘古大模型研究框架

目前我们将迎来科技的重大转折点&#xff1a;ChatGPT时刻。而在ChatGPT背后&#xff0c;不断迭代的GPT系列使得大模型成为当下科技企业核心竞争力的重要体现&#xff0c;未来&#xff0c;大模型将成为AIGC时代的核心支撑。 关注公众号&#xff1a;【互联互通社区】&#xff0c;…

大规模AI计算集群的网络环境需求,Infiniband还是超低时延以太网?

01 ChatGPT背后的基础设施&#xff1a;AI计算集群 早在2019年向 OpenAI 投资10亿美元的时候起&#xff0c;微软就同意为这家 AI 初创企业构建一台大型超级计算机。近期&#xff0c;微软在官博上连发两文&#xff0c;亲自解密了这台超级昂贵的超级计算机以及Azure的重磅升级。负…

微软把我们都骗了,它最爱Unix,不是Windows.....

1 很多人都不知道&#xff0c;在上世纪70年代&#xff0c;Unix才是微软的战略产品。 1973年&#xff0c;AT&T对外发布了Unix这个强大、灵活、多用户、多任务的操作系统&#xff0c;Unix在学术界和企业中迅速流行&#xff0c;被广泛应用于小型机和工作站。 而微软&#xff0…

马蹄集 字符判断

字符判断 难度&#xff1a;白银 时间限制&#xff1a;1秒 巴占用内存&#xff1a;64M 输入一个字符&#xff0c;判断是数字字符、大写字母、小写字母、算术运算符、 关系运算符、逻辑运算符&#xff0c;还是其他字符&#xff0c;分别输出Number?”, "Capital letter?”,…

不写代码、年薪百万,带你玩赚ChatGPT提示工程-提示应用程序

文章目录 前言一、数据生成二、PAL (Program-Aided Language Models): Code as Reasoning总结 前言 随着ChatGPT的大火&#xff0c;提示工程在大模型中的重要性不言而喻&#xff0c;本文参考国外Prompt Engineering Guide完成国内中文版本的《提示工程指南》&#xff0c;希望能…

.NET周报【12月第3期 2022-12-23】

由于众所周知的原因&#xff0c;大佬们纷纷加入羊群&#xff0c;笔者也未能幸免&#xff0c;体验下来这绝对不是普通感冒的症状&#xff0c;身体不适&#xff0c;熬了几天&#xff0c;所以本周更新比较晚&#xff1b;另外精力有限&#xff0c;对于国际板块只有链接没有简介&…

如何投资美国股票

5月开始炒美股&#xff0c;投入资金不多&#xff0c;2500美元&#xff08;按当时汇率为17000元人民币&#xff09;。几个月来&#xff0c;一直在摸索&#xff0c;其间有赚有赔&#xff0c;到9月下旬&#xff0c;只实现盈亏平衡。但也就是在9月下旬&#xff0c;我摸索出了一条“…

vue 打包出现的空白屏幕 资源无法正常加载问题

你可以在dist index 中看到这样一行字 Were sorry but xxxxxxx doesnt work properly without JavaScript enabled. 大概率是&#xff1a; 在vue.config.js里面添加 pubilcPath:./ &#xff08;注意这里用相对路径 的./ 而不是绝对路径&#xff09; 将路由变成hash模式 原因&a…

jupyter notebook 在新安装的环境 安装包后 导入失败: 加载模块失败 ModuleNotFoundError: No module named

新装的环境chatgpt&#xff0c; 命令行conda activate chatgpt 进入后&#xff0c; pip安装各类包包&#xff0c; 装好后在命令行和pycharm&#xff08;正确设置interpreter后&#xff09;都能正常导入&#xff0c; 但使用notebook 导入不成功&#xff0c;以tiktoken包为例&…

最大功率点跟踪MPPT

太阳能电池最大功率点跟踪MPPT&#xff08;Maximum Power Point Tracking&#xff09;技术能够保证在负载或环境光照强度变化时&#xff0c;光伏电池一直保持最大输出功率&#xff0c;以最大化太阳能利用率。 从太阳能板的I/V伏安特性曲线&#xff08;绿线&#xff09;中可以看…

4G DTU在电力远程自动抄表中的应用

随着工业自动化的发展&#xff0c;在原有的人工手动抄表中已经发展到远程智能抄表&#xff0c;通过现有的网络智能化的从远端把需要的数据采集到一起&#xff0c;那么&#xff0c;在很多必须无人值守的设备或监测点&#xff0c;不适合搭建有线通讯网络。若采用光纤或电台的方式…

基于分布鲁棒优化的电-气-热综合能源系统日前经经济调度

1 概述 随着经济的快速发展,化石燃料的燃烧引起的环境恶化问题日益突出。近年来风力发电和光伏发电等可再生能源发电发展迅速,但是风能等可再生能源的发电功率具有波动性且不容易控制。这使得构建一个清洁高效且.能够消纳可再生能源的能源系统的需求更加迫切。综合能源系统是…

主题:基于共享储能电站的工业用户日前优化经济调度

Matlab调用Yalmip工具箱&#xff0c;采用Cplex或Gurobi求解器求解。 主题&#xff1a;基于共享储能电站的工业用户日前优化经济调度 多用户(微网)储能电站日前经济调度&#xff0c;完美复现 ID:6650662269578775老电工了

含分布式电源的配电网日前两阶段优化调度模型(Matlab代码实现)

&#x1f468;‍&#x1f393; 个人主页&#xff1a; 研学社的博客 &#x1f4a5; &#x1f4a5; &#x1f49e; &#x1f49e; 欢迎来到本博客 ❤️ ❤️ &#x1f4a5; &#x1f4a5; &#x1f3c6; 博主优势&#xff1a; &#x1f31e; &#x1f31e; &#x1f31e;博客内容…

29考虑特性分布的储能电站接入的电网多时间尺度源储荷协调调度策略MATLAB程序-日前日内实时+需求响应+协调调度

资源地址&#xff1a; 29考虑特性分布的储能电站接入的电网多时间尺度源储荷协调调度策略MATLAB程序-日前日内实时需求响应协调调度-Matlab文档类资源-CSDN文库 参考文献&#xff1a; 考虑特性分布的储能电站接入的电网多时间尺度源储荷协调调度策略——金力 主要内容&…

考虑设备动作损耗的配电网分布式电压无功优化(Matlab代码实现)

目录 1 部分复现 2 概述 3 运行结果 4 Matlab代码实现 1 部分复现 2 概述 从控制策略上电压无功控制主要分为全局控制和分散控制。其中全局控制策略是指由调度中心统一下发指令&#xff0c;例如文献通过求解一个全同性的优化问题集中控制配电网的电压无功设备。基于数据…