图像细化与轮廓操作

1、图像细化

需要安装扩展包

 

 

//图像细化
int test1()
{//中文字进行细化Mat img = imread("LearnCV_black.png",IMREAD_ANYCOLOR); if (img.empty()){cout << "请确认图像文件名称是否正确" << endl;return -1;}//英文字 + 实心圆和圆环细化Mat words = Mat::zeros(100,200,CV_8UC1);//创建一个黑色的背景图片putText(words,"Learn",Point(30,30),2,1,Scalar(255),2);//添加英文putText(words,"OpenCV 4",Point(30,60),2,1,Scalar(255),2);circle(words,Point(80,75),10,Scalar(255), - 1);//添加实心圆circle(words,Point(130,75),10,Scalar(255),3);//添加圆环//进行细化Mat thin1, thin2;ximgproc::thinning(img, thin1, 0);//注意类名ximgproc::thinning(words,thin2, 0);//显示处理结果imshow("thinl", thin1); imshow("img", img);namedWindow("thin2",WINDOW_NORMAL);imshow ("thin2", thin2);namedWindow("words",WINDOW_NORMAL);imshow("words", words);waitKey(0);return 0;
}

2、轮廓检测

 

 

 

 

//轮廓检测
int test2()
{system("color F0");//更改输出界面颜色Mat img = imread("F:/testMap/key.png");if (img.empty()){cout << "请确认图像文件名称是否正确" << endl;return -1;}imshow("原图", img);Mat gray, binary;cvtColor(img, gray, COLOR_BGR2GRAY);//转化成灰度图GaussianBlur(gray, gray, Size(13, 13), 4, 4);//平滑滤波threshold(gray, binary, 170, 255, THRESH_BINARY | THRESH_OTSU);//自适应二值化//轮廓发现与绘制vector<vector<Point>> contours;//轮廓vector<Vec4i> hierarchy; //存放轮廓结构变量findContours(binary, contours, hierarchy, RETR_TREE, CHAIN_APPROX_SIMPLE, Point());//绘制轮廓for (int i = 0; i < hierarchy.size(); i++){cout << hierarchy[i] << endl;}for (int t = 0; t < contours.size(); t++){drawContours(img, contours, t, Scalar(0, 0, 255), 2, 8);imshow("轮廓检测结果", img);waitKey(0);}
}

3、轮廓信息统计

 

//轮廓信息统计
int test3()
{system("color F0");//更改输出界面颜色//用四个点表示三角形轮廓vector<Point> contour;contour.push_back(Point2f(0, 0));contour.push_back(Point2f(10, 0));contour.push_back(Point2f(10, 10));contour.push_back(Point2f(5, 5));double area = contourArea(contour);cout << "area =" << area << endl;double length0 = arcLength(contour, true);double length1 = arcLength(contour, false);cout << "length0 =" << length0 << endl;cout << "lengthl =" << length1 << endl;cout << "图像轮廓面积" << endl;waitKey(0);Mat img = imread("F:/testMap/key.png");if (img.empty()){cout << "请确认图像文件名称是否正确" << endl;return -1;}Mat gray, binary;cvtColor(img, gray, COLOR_BGR2GRAY); //转化成灰度图GaussianBlur(gray, gray, Size(9, 9), 2, 2);//平滑滤波threshold(gray, binary, 170, 255, THRESH_BINARY | THRESH_OTSU);//自适应二值化//轮廓检测vector<vector<Point>> contours;//轮廓vector<Vec4i> hierarchy;//存放轮廓结构变量findContours(binary, contours, hierarchy, RETR_TREE, CHAIN_APPROX_SIMPLE, Point());//输出轮廓面积for (int t = 0; t < contours.size(); t++){double area1 = contourArea(contours[t]);cout << "第" << t << "轮廓面积 = " << area1 << endl;}//输出轮廓长度for (int t = 0; t < contours.size(); t++){double length2 = arcLength(contours[t],true);cout << "第" << t << "轮廓长度 = " << length2 << endl;}return 0;
}

4、轮廓外接多边形

 

int test4()
{Mat img = imread("F:/testMap/stuff.png");if (img.empty()){cout << "请确认图像文件名称是否正确" << endl;return -1;}Mat img1, img2;img.copyTo(img1); //深拷贝用来绘制最大外接矩形img.copyTo(img2);//深拷贝用来绘制最小外接矩形imshow("img", img);//去噪声与二值化Mat canny;Canny(img, canny, 80, 160, 3, false);imshow("", canny);//膨胀运算,将细小缝隙填补上Mat kernel = getStructuringElement(0, Size(3, 3)); dilate(canny, canny, kernel);//轮廓发现与绘制vector<vector<Point>> contours;vector<Vec4i> hierarchy;findContours(canny, contours, hierarchy, 0, 2, Point());//寻找轮廓的外接矩形for (int n = 0; n < contours.size(); n++){// 最大外接矩形Rect rect = boundingRect(contours[n]);rectangle(img1, rect, Scalar(0, 0, 255), 2, 8, 0);//最小外接矩形RotatedRect rrect = minAreaRect(contours[n]); Point2f points[4];rrect.points(points);//读取最小外接矩形的四个顶点Point2f cpt = rrect.center;//最小外接矩形的中心//绘制旋转矩形与中心位置for (int i = 0; i < 4; i++){if (i == 3){line(img2, points[i], points[0], Scalar(0, 255, 0), 2, 8, 0);break;}line(img2, points[i], points[i + 1], Scalar(0, 255, 0), 2, 8, 0);}//绘制矩形的中心circle(img2, cpt, 4, Scalar(255, 0, 0), -8, 0);}//输出绘制外接矩形的结果imshow("max", img1);imshow("min", img2);cout << "下面是多边形拟合" << endl;waitKey(0);Mat approx = imread("F:/testMap/approx.png");if (approx.empty()){cout << "请确认图像文件名称是否正确" << endl;return -1;}//边缘检测Mat canny2;Canny(approx, canny2, 80, 160, 3, false);//膨胀运算Mat kernel2 = getStructuringElement(0, Size(3, 3));dilate(canny2, canny2, kernel2);//轮廓发现与绘制vector<vector<Point>> contours2;vector<Vec4i> hierarchy2;findContours(canny2, contours2, hierarchy2, 0, 2, Point());//绘制多边形for (int t = 0; t < contours2.size(); t++){//用最小外接矩形求取轮廓中心RotatedRect rrect = minAreaRect(contours2[t]);Point2f center = rrect.center;circle(approx, center, 2, Scalar(0, 255, 0), 2, 8, 0);Mat result;approxPolyDP(contours2[t], result, 4, true); //多边形拟合drawapp(result, approx);cout << "corners : " << result.rows << endl;//判断形状和绘制轮廓if (result.rows == 3){putText(approx, "triangle", center, 0, 1, Scalar(0, 255, 0), 1, 8);}if (result.rows == 4){putText(approx, "rectangle", center, 0, 1, Scalar(0, 255, 0), 1, 8);}if (result.rows == 8){putText(approx, "poly-8", center, 0, 1, Scalar(0, 255, 0), 1, 8);}if (result.rows > 12){putText(approx, "circle", center, 0, 1, Scalar(0, 255, 0), 1, 8);}}imshow("result", approx);//输出绘制外接矩形的结果imshow(" max", img1);imshow("min", img2);waitKey(0);
}

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

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

相关文章

Few-Shot Learning in Wireless Networks: A Meta-Learning Model-Enabled Scheme

1 INTRODUCTION 由于6G的复杂管理机制&#xff0c;可以在基站收集历史数据——为克服训练数据集容量的限制提供了极大的便利 问题与挑战&#xff1a; 尽管元学习可以提高网络边缘智能(network edge intelligence)的性能&#xff0c;但其在无线网络(wireless networks)中的应用…

【ELK集群】

ELK集群部署环境准备 配置ELK日志分析系统 192.168.108.67 elk-node1 es、logstash、kibana 192.168.108.189 elk-node2 es、logstash 192.168.108.32 apache logstash 三台虚拟机配置调高 三台机关闭防火墙 改名 1、2台机配置hosts解析文件 1&#xff0c;2台都用系…

PHP之 Socket实践

一 Socket简介 1.1 Socket(套接宇)&#xff0c;用来描述IP地址和端口,是通信链的句柄&#xff0c;应用程序可以通过Socket向网络发送请求或者应答网络请求。 1.2 Socket是支持TCP/IP协议的网络通信的基本操作单元&#xff0c;是对网络通信过程中端点的抽象表示&#xff0c;包…

华为云编译构建CodeArts Build新手操作指南

华为云编译构建&#xff08;CodeArts Build&#xff09;基于云端大规模并发加速&#xff0c;为客户提供高速、低成本、配置简单的混合语言构建能力&#xff0c;帮助客户缩短构建时间&#xff0c;提升构建效率。 本文将给各位开发者带来华为云CodeArts Pipeline的手把手初级教学…

一文教会你风格迁移CycleGAN从入门到高阶再到最终成功魔改(附成功魔改代码)

专栏导读 &#x1f525;&#x1f525;本文已收录于专栏&#xff1a;《风格迁移之从入门到成功魔改》&#xff0c;欢迎免费订阅 ​此专栏用于带你从零基础学会什么是风格迁移&#xff0c;风格迁移有什么作用&#xff0c;传统做法和Cyclegan的原理&#xff0c;及其优缺点&#x…

基于51单片机和proteus的水质水位检测系统

此系统是基于51单片机和proteus的仿真设计&#xff0c;功能如下&#xff1a; 1. LCD1602实时显示水质和水位状态。 2. 按键可设定水质检测阈值并通过LCD显示。 3. LED指示水质水位和系统运行状态。 4. 水质差超过阈值后自动启动排水泵。 5. 水位过低时自动启动进水泵。 6…

SpringBoot项目模块间通信的两种方式

说明&#xff1a;在微服务架构开发中&#xff0c;一个请求是通过模块之间的互相通信来完成的&#xff0c;如下面这个场景&#xff1a; 创建两个子模块&#xff1a;订单模块&#xff08;端口8081&#xff09;、用户模块&#xff08;端口8082&#xff09;&#xff0c;两个模块之…

Spring Boot 中的 Native SQL 是什么, 如何使用

在 Spring Boot 中&#xff0c;我们通常使用 ORM 框架&#xff08;例如 Hibernate 或 MyBatis&#xff09;来操作数据库。但是&#xff0c;有时候我们需要执行一些自定义的 SQL 查询或更新语句&#xff0c;这时候就需要使用 Spring Boot 中的 Native SQL。 在本文中&#xff0…

常见面试题之JVM实践(调优)

1. JVM调优的参数可以在哪里设置参数值&#xff1f; 1.1 tomcat的设置vm参数 修改TOMCAT_HOME/bin/catalina.sh文件&#xff0c;如下图&#xff1a; JAVA_OPTS"-Xms512m -Xmx1024m" 1.2 springboot项目jar文件启动 通常在linux系统下直接加参数启动springboot项…

鼠标右击没有新建WORD、EXCEL、PPT选项卡解决方案

一、WinR打开运行窗口&#xff0c;输入regedit打开注册表 二、进入到相应位置&#xff0c;复制粘贴到路径处即可 ①word word&#xff1a;计算机\HKEY_CLASSES_ROOT\.docx 计算机\HKEY_CLASSES_ROOT\.doc 看你改哪个都行&#xff0c;我觉得修改第一个docx那个就行&#xff0c…

【Elasticsearch】RestClient操作文档

目录 5.RestClient操作文档 5.1.新增文档 5.1.1.索引库实体类 5.1.2.语法说明 5.1.3.完整代码 5.2.查询文档 5.2.1.语法说明 5.2.2.完整代码 5.3.删除文档 5.4.修改文档 5.4.1.语法说明 5.4.2.完整代码 5.5.批量导入文档 5.5.1.语法说明 5.5.2.完整代码 5.6.小…

[QT编程系列-1]:C++图形用户界面编程,QT框架快速入门培训 - 0- 总述

目录 导言 主要内容 附录&#xff1a; 导言 1. 在这里强调为啥选择 PPT 方式&#xff0c;而不是直接讲解代码 2. 重原理和方法 3. 种 QT 的框架和 QT 的开发流程 4. 轻 UI 界面美观&#xff08; UI 设计单独课程&#xff09; 5. 请代码具体实现&#xff08;后期自学&#xf…