VC++中使用OpenCV进行形状和轮廓检测

VC++中使用OpenCV进行形状和轮廓检测

在VC++中使用OpenCV进行形状和轮廓检测,轮廓是形状分析以及物体检测和识别的有用工具。如下面的图像中Shapes.png中有三角形、矩形、正方形、圆形等,我们如何去区分不同的形状,并且根据轮廓进行检测呢?
Shapes..png
原图下载地址为:https://github.com/murtazahassan/Learn-OpenCV-cpp-in-4-Hours/blob/main/Resources/shapes.png
1、首先我们对原始图像进行预处理,将原始图形灰度化、高斯模糊、Canny边缘检测、膨胀化处理,最后得到一副膨胀的图形
2、基于这幅膨胀的图像,我们调用findContours函数从膨胀化的二值图像中检索出所有的轮廓,结果放到vector<vector<Point>> contours数组中
3、遍历每一个轮廓多边形,首选计算轮廓面积,过滤那些面积特别小的轮廓(比如面积小于1000则不处理,例如上图中的那个黑色的圆点),消除噪声;计算轮廓周长(封闭的或者非封闭的)或曲线长度,以指定精度逼近多边形曲线,计算顶点集合或灰度图像的非零像素的右上边界矩形,获取边界包围盒;然后轮廓多边形的角落(顶点)个数objCor,根据objCor判断轮廓多边形的形状类型,特别注意矩形和正方形的区别,我们根据轮廓的宽高比来区分,当轮廓宽高比大于0.95或者小于1.05时我们可以认定轮廓为正方形
4、最后我们在第三步基础上,绘制轮廓或填充轮廓,颜色为粉色;绘制边界包围盒,颜色为绿色;在边界包围盒左上方往上5像素的位置,绘制其形状的描述文字

C++示例代码

示例代码如下:

#include <opencv2/imgcodecs.hpp>
#include <opencv2/highgui.hpp>
#include <opencv2/imgproc.hpp>
#include <iostream>using namespace cv;
using namespace std;///  Color Detection  //
// 获取轮廓边界、绘制边界包围盒、形状描述
void getContours(Mat imgDil, Mat img) {vector<vector<Point>> contours;vector<Vec4i> hierarchy;// 从膨胀化的二值图像中检索轮廓findContours(imgDil, contours, hierarchy, RETR_EXTERNAL, CHAIN_APPROX_SIMPLE);//drawContours(img, contours, -1, Scalar(255, 0, 255), 2);vector<vector<Point>> conPoly(contours.size());	// 逼近的多边形曲线,接近contours轮廓多边形		vector<Rect> boundRect(contours.size());	// contours轮廓多边形的边界包围盒// 遍历每一个轮廓多边形for (int i = 0; i < contours.size(); i++){int area = contourArea(contours[i]);	// 计算轮廓的面积cout << area << endl;string objectType;if (area > 1000)	// 过滤那些面积特别小的轮廓,消除噪声{float peri = arcLength(contours[i], true);	// 计算轮廓周长(封闭的或者非封闭的)或曲线长度approxPolyDP(contours[i], conPoly[i], 0.02 * peri, true);	// 以指定精度逼近多边形曲线cout << conPoly[i].size() << endl;boundRect[i] = boundingRect(conPoly[i]);	// 计算顶点集合或灰度图像的非零像素的右上边界矩形,获取边界包围盒int objCor = (int)conPoly[i].size();	// 轮廓多边形的角落(顶点)个数// 根据objCor判断轮廓多边形的形状类型if (objCor == 3) {objectType = "Tri";	// 三角形} else if (objCor == 4)	{ // 四边形float aspRatio = (float)boundRect[i].width / (float)boundRect[i].height;	// 边界包围盒的宽高比:宽度/高度cout << aspRatio << endl;if (aspRatio > 0.95 && aspRatio < 1.05) {	// 边界包围盒宽高比大于0.95,或者小于1.05,则认为是正方形objectType = "Square";	// 正方形} else {objectType = "Rect";	// 矩形}} else if (objCor > 4) {objectType = "Circle";	// 圆形}drawContours(img, conPoly, i, Scalar(255, 0, 255), 2);	// 绘制轮廓或填充轮廓,颜色为粉色rectangle(img, boundRect[i].tl(), boundRect[i].br(), Scalar(0, 255, 0), 5);	// 绘制边界包围盒,颜色为绿色putText(img, objectType, { boundRect[i].x,boundRect[i].y - 5 }, FONT_HERSHEY_PLAIN, 1, Scalar(0, 69, 255), 2);	// 在边界包围盒左上方往上5像素的位置,绘制其形状的描述文字}}
}int main() {string path = "Resources/shapes.png";Mat img = imread(path);Mat imgGray, imgBlur, imgCanny, imgDil, imgErode;// PreprocessingcvtColor(img, imgGray, COLOR_BGR2GRAY);	// 灰度图GaussianBlur(imgGray, imgBlur, Size(3, 3), 3, 0);	// 高斯模糊处理Canny(imgBlur, imgCanny, 25, 75);	// Canny边缘检测算法Mat kernel = getStructuringElement(MORPH_RECT, Size(3, 3));dilate(imgCanny, imgDil, kernel);	// 膨胀图// 基于膨胀图,在原图上绘制轮廓边界、绘制边界包围盒以及形状描述getContours(imgDil, img);imshow("Image", img);//imshow("Image Gray", imgGray);//imshow("Image Blur", imgBlur);//imshow("Image Canny", imgCanny);//imshow("Image Dil", imgDil);waitKey(0);return 0;
}

运行结果如下图所示:
运行结果

参考资料

  • LEARN OPENCV C++ in 4 HOURS | Including 3x Projects | Computer Vision
  • Learn-OpenCV-cpp-in-4-Hours
  • LEARN OPENCV in 3 HOURS with Python | Including 3xProjects | Computer Vision
  • Learn-OpenCV-in-3-hours

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

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

相关文章

初识React,基础(1), 安装react,jsx文件,类组件和函数组件,css样式

第一部分:初识react react: 用于构建用户界面的 JavaScript 库全局安装,win r, 命令: npm install create-react-app -g3. 创建一个react应用, 这里我在vscode 里面创建, 创建之后,运行 create-react-app my-appcd my-app npm start 第二部分: redact 组件定义以及使用 rea…

当 OpenTelemetry 遇上阿里云 Prometheus

作者&#xff1a;逸陵 背景 在云原生可观测蓬勃发展的当下&#xff0c;想必大家对 OpenTelemetry & Prometheus 并不是太陌生。OpenTelemetry 是 CNCF&#xff08;Cloud Native Computing Foundation&#xff09;旗下的开源项目&#xff0c;它的目标是在云原生时代成为应…

【Unity学习笔记】New Input System 部分源码和测试用例补充

转载请注明出处&#xff1a;&#x1f517;https://blog.csdn.net/weixin_44013533/article/details/135630016 作者&#xff1a;CSDN|Ringleader| 主要参考&#xff1a; Unity官方Input System手册与API【Unity学习笔记】Unity TestRunner使用【Unity学习笔记】第十二 New Inp…

MySQL的执行流程

一、MySQL的执行流程 MySQL架构分为Server层、存储引擎&#xff0c;其中Server层又分为连接器、查询缓存、分析器、优化器执行器五个部分。当客户端发送请求后依次需要经过 处理请求、查询缓存、语法解析、查询优化、存储引擎部分。 1. 连接器 负责维持和管理连接&#xff…

【差分数组】【图论】【分类讨论】【整除以2】100213按距离统计房屋对数目

作者推荐 【动态规划】【数学】【C算法】18赛车 本文涉及知识点 差分数组 图论 分类讨论 整除以2 LeetCode100213按距离统计房屋对数目 给你三个 正整数 n 、x 和 y 。 在城市中&#xff0c;存在编号从 1 到 n 的房屋&#xff0c;由 n 条街道相连。对所有 1 < i < n…

Java代码审计Shiro反序列化CB1链source入口sink执行gadget链

目录 0x00 前言 0x01 CC链&CB链简介 1. Commons Collections链是什么&#xff1f; 2. Commons BeanUtils链是什么&#xff1f; 0x02 测试Commons BeanUtils1链 0x03 Shiro550 - Commons BeanUtils1链 - 跟踪分析&#xff08;无依赖&#xff09; 1. 前置知识 2. Co…

Node开发基础

1. 概述 1.1 为什么要学习服务器端开发基础 能够和后端程序员更加紧密的配合 网站业务逻辑前置&#xff0c;学习前端技术需要后端技术支撑 扩宽知识视野&#xff0c;能够站在更高的角度审视整个项目 1.2 服务器端开发要做的事情 实现网站的业务逻辑 ---网站登录部分&#…

矩阵重叠问题判断

创作背景 看到一道题目有感而发想写一篇题解&#xff0c;涉及的是一种逆向思维 桌面窗体重叠 - 洛谷https://www.luogu.com.cn/problem/U399827题目来源于《信息学奥赛课课通》 大致就是给一个长方形的左上顶点坐标&#xff08;x1,y1&#xff09;和右下顶点坐标&#xff08;x…

【设计模式】适配器和桥接器模式有什么区别?

今天我探讨一下适配器模式和桥接模式&#xff0c;这两种模式往往容易被混淆&#xff0c;我们希望通过比较他们的区别和联系&#xff0c;能够让大家有更清晰的认识。 适配器模式&#xff1a;连接不兼容接口 当你有一个类的接口不兼容你的系统&#xff0c;而你又不希望修改这个…

云服务器定价_云服务器价格_云主机计费模式_腾讯云

腾讯云服务器租用价格表&#xff1a;轻量应用服务器2核2G3M价格62元一年、2核2G4M价格118元一年&#xff0c;540元三年、2核4G5M带宽218元一年&#xff0c;2核4G5M带宽756元三年、轻量4核8G12M服务器446元一年、646元15个月&#xff0c;云服务器CVM S5实例2核2G配置280.8元一年…

嵌入式培训机构四个月实训课程笔记(完整版)-C++和QT编程第六天-Qt UDP编程(物联技术666)

链接&#xff1a;https://pan.baidu.com/s/1-u7GvgM0TLuiy9z7LYQ80Q?pwd1688 提取码&#xff1a;1688 在Qt中提供了QUdpSocket 类来进行UDP数据报&#xff08;datagrams&#xff09;的发送和接收。这里我们还要了解一个名词Socket&#xff0c;也就是常说的“套接字”。 Qt 网络…

强化学习(四)动态规划——1

动态规划算法&#xff08;DP&#xff09;&#xff1a;在马尔可夫决策过程&#xff08;MDP&#xff09;的完美环境模型下计算最优策略。但其在强化学习中实用性有限&#xff0c;其一是它是基于环境模型已知&#xff1b;其二是它的计算成本很大。但它在理论伤仍然很重要&#xff…

2023年12月青少年机器人技术等级考试(五级)理论综合试卷

2023年12月青少年机器人技术等级考试&#xff08;五级&#xff09;理论综合试卷 单选题 第 1 题 单选题 通常状况下&#xff0c;ESP32 WROOM模组的工作电压是&#xff1f;&#xff08; &#xff09; A.3V B.3.3V C.3.6V D.5V 第 2 题 单选题 ESP32 WROOM模组中核&am…

java大数据hadoop2.9.2 Linux安装mariadb和hive

一、安装mariadb 版本centos7 1、检查Linux服务器是否已安装mariadb yum list installed mariadb* 2、如果安装了&#xff0c;想要卸载 yum remove mariadb rm -rf /etc/my.cnf rm -rf /var/lib/mysql 才能完全删除 3、安装mariadb 在线网络安装 yum install -y mari…

网络通信(Socket/TCP/UDP)

一、Socket 1.概念: Socket(又叫套接字)是通信的基石,是支持TCP/IP协议的网络通信的基本操作单元。它是网络通信过程中端点的抽象表示,包含进行网络通信必须的五种信息:连接协议,客户端的IP地址,客户端的端口,服务器的IP地址,服务器的端口。 一个Socket是一对IP地址…

笔试面试题——二叉树进阶(一)

&#x1f4d8;北尘_&#xff1a;个人主页 &#x1f30e;个人专栏:《Linux操作系统》《经典算法试题 》《C》 《数据结构与算法》 ☀️走在路上&#xff0c;不忘来时的初心 文章目录 一、根据二叉树创建字符串1、题目讲解2、思路讲解3、代码实现 二、二叉树的分层遍历1、题目讲…

大数据导论(4)---大数据应用

文章目录 1. 在互联网中的应用1.1 推荐系统1.2 长尾理论1.3 推荐方法与模型1.4 推荐系统应用 2. 在其他领域的应用2.1 企业营销2.2 智慧交通 1. 在互联网中的应用 1.1 推荐系统 1. 推荐系统产生&#xff1a;  (1) 互联网的飞速发展使我们进入了信息过载的时代&#xff0c;搜索…

【赠书第17期】Excel高效办公:文秘与行政办公(AI版)

文章目录 前言 1 了解Excel的强大功能和工具 2 提升Excel技能的方法 3 结合AI技术提升Excel应用 4 注意事项 5 推荐图书 6 粉丝福利 前言 随着人工智能&#xff08;AI&#xff09;技术的快速发展&#xff0c;我们的工作方式也在发生深刻变革。其中&#xff0c;Excel 作…

使用cmake进行完成开发实践

根据这个UML图进行cmake的实践 首先按照使用vscode在wsl2中配置clangd环境-CSDN博客的内容先创建出cmake项目。 之后在项目目录中创建include和src目录。 根据UML图&#xff0c;首先要完成Gun类的实现。分别在include&#xff0c;src目录下创建头文件和源文件&#xff0c;写入…