OpenCV的常用与形状形状描述相关函数及用法示例

        OpenCV提供了提供了多种用于形状描述和分析的函数。这些函数能够帮助你提取图像中的形状特征,进行形状匹配、识别和分析。下面介绍一些常用的形状描述函数:

        轮廓检测函数findContours()

        findContours()函数用于在二值图像中查找轮廓。有两个原型函数,如下:

该函数已在前面的博文中详细介绍过,这里就不再做介绍了。

        轮廓近似函数approxPolyDP()

   approxPolyDP()用于对轮廓进行多边形近似。其原型如下:

approxPolyDP()函数参数:

   curve 存储在 std::vector 或 Mat 中的 2D 点的输入向量

        approxCure 近似的结果。类型应与输入曲线的类型匹配。

        epsilon  指定近似精度的参数。这是原始曲线与其近似曲线之间的最大距离。

        close 如果为 true,则近似曲线是闭合的(其第一个和最后一个顶点是连接的)。否则,它不会闭合。

        轮廓面积函数contourArea()

        contourArea()计算轮廓的面积。其原型如下:

contourArea()函数参数:

        contour  2D 点(轮廓顶点)的输入向量,存储在 std::vector 或 Mat 中。

        oriented 定向区域标志。如果为 true,则该函数根据轮廓方向(顺时针或逆时针)返回带符号的面积值。使用此功能,您可以通过获取区域的符号来确定轮廓的方向。默认情况下,该参数为 false,表示返回绝对值。

        轮廓面周长函数arcLength()

        arcLength() 计算轮廓的周长。 其原型如下:

 arcLength() 函数参数:

        curve 存储在 std::vector 或 Mat 中的 2D 点的输入向量

        closed 指示曲线是否闭合的标志。

        最小外接圆函数 minEnclosingCircle()

        minEnclosingCircle()函数找到轮廓的最小外接圆。其原型如下:

minEnclosingCircle()函数参数:

        point      2D 点的输入向量,存储在 std::vector<> 或 Mat 中

        center  输出圆的中心点

        radius 输出圆的半径

        轮廓最小矩形函数boundingRect()

        boundingRect()函数计算包含轮廓的最小(直立)矩形。其原型如下:

boundingRect()函数参数 array 为输入灰度图像或2D点集,存储在std::vector或Mat中。

        轮廓最小外接矩形函数minAreaRect()

minAreaRect()查找包围输入 2D 点集的最小区域的旋转矩形。其原型如下:

minAreaRect()函数参数 point为2D 点的输入向量,存储在 std::vector<> 或 Mat 中。

        凸包函数convexHull()

        convexHull() 函数计算轮廓的凸包。其原型如下:

 convexHull()函数参数:

  point 输入 2D 点集,存储在 std::vector 或 Mat 中。

  hull  输出凸包。它要么是索引的整数向量,要么是点的向量。在第一种情况下,包元素是原始数组中凸包点的从 0 开始的索引(因为凸包点集是原始点集的子集)。在第二种情况下,外壳元素就是凸包点本身。

   clockwise 方向标志。如果为 true,则输出凸包按顺时针方向排列。否则,它是逆时针方向。假定的坐标系的 X 轴指向右侧,Y 轴指向上方。

   returnPoints  操作标志。对于矩阵,当标志为 true 时,函数返回凸包点。否则,它返回凸包点的索引。当输出数组为 std::vector 时,该标志被忽略,并且输出取决于向量的类型:std::vector<int> 意味着 returnPoints=false,std::vector<Point> 意味着 returnPoints=true。

        形状匹配函数matchShapes()

        matchShapes()函数比较两个形状之间的相似度。其原型如下:

 matchShapes()函数参数:

    contour1 第一个轮廓或灰度图像。

           contour2 第二个轮廓或灰度图像。

           method  比较方法,参见ShapeMatchModes:

           parameter  方法特定的参数(现在不支持)。

        Hu矩函数HuMoments()

        HuMoments()Hu矩是一组用于形状识别的七个不变矩。其原型函数有两个,如下:

 moments()函数参数:

        array 光栅图像(单通道、8 位或浮点 2D 数组)或 2D 点(Point 或 Point2f)的数组( 1×N 或 N×1 )。 binaryImage 如果为 true,则所有非零图像像素均被视为 1。该参数仅用于图像。

        binaryImage  如果为 true,则所有非零图像像素均被视为 1。该参数仅用于图像。

        以上函数用法示例

        新建一个控制台应用程序,在源程序中加入如下代码:

#include <iostream>
#include <opencv2/opencv.hpp>using namespace cv;
using namespace std;int main()
{Mat src = imread("1.png");if (src.empty()){cout << "Cann't open image!" << endl;return -1;}imshow("Src1", src);Mat dst, dst1;cvtColor(src, dst1, COLOR_BGR2GRAY);GaussianBlur(dst1, dst, Size(7, 7), 0);threshold(dst, dst, 40, 200, THRESH_BINARY_INV);//imshow("Dst", dst);//findContursvector<vector<Point>> contours;vector<Vec4i> hierarchy;findContours(dst, contours, hierarchy, RETR_EXTERNAL, CHAIN_APPROX_SIMPLE);//approxPolyDPvector<Point> approx;for (size_t i = 0; i < 5; i++){approxPolyDP(contours[i], approx, arcLength(contours[0], true) * 0.005, true);polylines(src, approx, true, Scalar(0, 0, 255), 2);}//contourArea() and rcLength()float pl = arcLength(contours[0], 1);float a1 = contourArea(contours[0], 1);cout << "Conturs1  perimeters:  " << pl << endl;cout << "Conturs1  is area:  " << a1 << endl;//moments(),HuMoments()Moments m = moments(contours[6]);double hu[7];HuMoments(m, hu);cout << m.mu20 << endl;cout << m.mu11 << endl;cout << m.mu02 << endl;cout << m.mu30 << endl;cout << m.mu21 << endl;cout << m.mu12 << endl;cout << m.mu03 << endl;cout << hu << endl;//boundingRect()Rect rec1 = boundingRect(contours[7]);rectangle(src, rec1, Scalar(0, 0, 255), 2);//minEnclosingCirclePoint2f center;float radius;minEnclosingCircle(contours[8], center, radius);circle(src, center, radius, Scalar(0, 255, 0), 2);//minEnclosingCirclevector<Point2f> mTr;vector<Point>  mTr1;vector<vector<Point>> plg;minEnclosingTriangle(contours[11], mTr);for (int i = 0; i < 3; i++){Point p1;p1.x = mTr[i].x;p1.y= mTr[i].y;mTr1.push_back(p1);}plg.push_back(mTr1);polylines(src, plg, 1, Scalar(0, 255, 255), 2);//minAreaRect()vector<Point2f> pf;vector<Point> ps;RotatedRect rec2 = minAreaRect(contours[9]);rec2.points(pf);if (pf.empty()){cout << "pf is empty" << endl;}elsefor (int i = 0; i < pf.size(); i++){Point p;p.x = (int)(pf[i].x);p.y = (int)(pf[i].y);ps.push_back(p);}vector<vector<Point>> conturs_r;conturs_r.push_back(ps);drawContours(src, conturs_r, -1, Scalar(255, 0, 0), 2);//convexHullvector<Point> hull;vector<vector<Point>> conturs_h;convexHull(contours[10], hull);conturs_h.push_back(hull);drawContours(src, conturs_h, -1, Scalar(255, 255, 0), 2);//matchShapesdouble md = matchShapes(contours[0], contours[1], CONTOURS_MATCH_I2,1);cout << "md = " << md << endl;md = matchShapes(contours[0], contours[0], CONTOURS_MATCH_I2, 1);cout << "md1 = " << md << endl;imshow("Dst1", src);waitKey(0);
}

试运行,结果如下:

OpenCV形状描述函数就介绍到这里,例程源代码已上传到CSDN,下载链接为:

https://download.csdn.net/download/billliu66/89897345

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

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

相关文章

【zlm】 webrtc源码讲解(二)

目录 webrtc播放 MultiMediaSourceMuxer里的_ring webrtc播放 > MediaServer.exe!mediakit::WebRtcPlayer::onStartWebRTC() 行 60 CMediaServer.exe!mediakit::WebRtcTransport::OnDtlsTransportConnected(const RTC::DtlsTransport * dtlsTransport, RTC::SrtpSession::…

tomcat部署war包部署运行,IDEA一键运行启动tomacat服务,maven打包为war包并部署到tomecat

tomcat部署war包前端访问 在Java Web开发中&#xff0c;Tomcat是一个非常流行的开源Web服务器和Servlet容器。它实现了Java Servlet和JavaServer Pages (JSP) 技术&#xff0c;提供了一个纯Java的Web应用环境。本文将介绍如何在Tomcat中部署运行WAR包&#xff0c;让你的应用快…

vue2 使用环境变量

一. 在根目录下创建.env.xxx文件 .env 基础系统变量&#xff0c;无论何种环境&#xff0c;都可使用其中配置的值&#xff0c;其他环境中的变量会覆盖.env中的同名变量。 .env.development 开发环境 .env.production 生产环境 .env.staging 测试环境 二. 内容格式 vue2 使用是以…

GRU神经网络理解

全文参考以下B站视频及《神经网络与深度学习》邱锡鹏&#xff0c;侧重对GPU模型的理解&#xff0c;初学者入门自用记录&#xff0c;有问题请指正【重温经典】GRU循环神经网络 —— LSTM的轻量级版本&#xff0c;大白话讲解_哔哩哔哩_bilibili 更新门、重置门、学习与输出 注&a…

STM32(二十一):看门狗

WDG&#xff08;Watchdog&#xff09;看门狗&#xff0c;手动重装寄存器的操作就是喂狗。 看门狗可以监控程序的运行状态&#xff0c;当程序因为设计漏洞、硬件故障、电磁干扰等原因&#xff0c;出现卡死或跑飞现象时&#xff0c;看门狗能及时复位程序&#xff0c;避免程序陷入…

数学建模微分方程模型——传染病模型

病毒也疯狂&#xff1a;细说传染病微分方程模型的那些事儿 “数学是打开科学大门的钥匙&#xff0c;而微分方程则是理解世界变化的密码。” 大家好&#xff01;今天我们要聊一聊一个既严肃又有趣的话题——传染病微分方程模型。别急&#xff0c;听起来高大上&#xff0c;其实一…

亚信安全DeepSecurity中标知名寿险机构云主机安全项目

近日&#xff0c;亚信安全DeepSecurity成功中标国内知名寿险机构的云主机安全项目。亚信安全凭借在云主机安全防护领域的突出技术优势&#xff0c;结合安全运营的能力&#xff0c;以“实战化”为指导&#xff0c;为用户提供无惧威胁攻击、无忧安全运营的一站式云安全体系&#…

【论文翻译】ICLR 2018 | DCRNN:扩散卷积递归神经网络:数据驱动的交通预测

论文题目Diffusion Convolutional Recurrent Neural Network: Data-Driven Traffic Forecasting论文链接https://arxiv.org/abs/1707.01926源码地址https://github.com/liyaguang/DCRNN发表年份-会议/期刊2018 ICLR关键词交通预测&#xff0c;扩散卷积&#xff0c;递归神经网络…

数字+文旅:AI虚拟数字人如何焕发传统文旅景区新活力?

​​引言&#xff1a; 据《2024年中国数字文旅行业市场研究报告》显示&#xff0c;截至2022年&#xff0c;中国数字文旅市场规模已达到约9698.1亿元人民币&#xff0c;相较于2017年的7870.5亿元&#xff0c;实现了57.89%的显著增长。这一行业涵盖了数字化的文化遗产旅游、虚拟…

JVM、字节码文件介绍

目录 初识JVM 什么是JVM JVM的三大核心功能 JVM的组成 字节码文件的组成 基础信息 Magic魔数 主副版本号 其它基础信息 常量池 字段 方法 属性 字节码常用工具 javap jclasslib插件 阿里Arthas 初识JVM 什么是JVM JVM的三大核心功能 1. 解释和运行虚拟机指…

【性能优化】安卓性能优化之CPU优化

【性能优化】安卓性能优化之CPU优化 CPU优化及常用工具原理与文章参考常用ADB常用原理、监控手段原理监控手段多线程并发解决耗时UI相关 常见场景排查CPU占用过高常用系统/开源分析工具AndroidStudio ProfilerSystraceBtracePerfettoTraceView和 Profile ANR相关ANR原理及常见场…

使用 VSCode 通过 Remote-SSH 连接远程服务器详细教程

使用 VSCode 通过 Remote-SSH 连接远程服务器详细教程 在日常开发中&#xff0c;许多开发者需要远程连接服务器进行代码编辑和调试。Visual Studio Code&#xff08;VSCode&#xff09;提供了一个非常强大的扩展——Remote-SSH&#xff0c;它允许我们通过 SSH 协议直接连接远程…

YOLO V3 网络构架解析

YOLO V3&#xff08;You Only Look Once version 3&#xff09;是由Joseph Redmon等人于2018年提出的一种基于深度学习的目标检测算法。它在速度和精度上相较于之前的版本有了显著提升&#xff0c;成为计算机视觉领域的一个重要里程碑。本文将详细解析YOLO V3的网络架构&#x…

【信息论基础第六讲】离散无记忆信源等长编码包括典型序列和等长信源编码定理

一、信源编码的数学模型 我们知道信源的输出是消息序列&#xff0c;对于信源进行编码就是用码字集来表示消息集&#xff0c;也就是要进行从消息集到码字集的映射。 根据码字的特征我们又将其分为D元码&#xff0c;等长码&#xff0c;不等长码&#xff0c;唯一可译码。 我们通过…

通过DevTools逃离Chrome沙盒(CVE-2024-6778和CVE-2024-5836)

介绍 这篇博文详细介绍了如何发现CVE-2024-6778和CVE-2024-5836的&#xff0c;这是Chromium web浏览器中的漏洞&#xff0c;允许从浏览器扩展&#xff08;带有一点点用户交互&#xff09;中进行沙盒逃逸。 简而言之&#xff0c;这些漏洞允许恶意的Chrome扩展在你的电脑上运行…

npm run serve 提示异常Cannot read property ‘upgrade‘ of undefined

npm run serve 提示Cannot read property ‘upgrade’ of undefined 一般是proxy的target代理域名问题导致的&#xff0c;如下&#xff1a; 解决方案&#xff1a; proxy: { “/remoteDealerReportApi”: { target: ‘http://demo-.com.cn’, //此域名有问题&#xff0c;会导致…

Linux-基础命令及相关知识2

补充&#xff1a; 1、A命令&#xff08;echo&#xff09;既有可能是内部命令也有可能是外部命令&#xff0c;例如命令A既有可能在bash上也有可能在csh上&#xff0c;为了防止A在某些shell程序里不起作用&#xff0c;可以将A命令设置为外部命令&#xff08;环境变量路径上&…

【JAVA毕设】基于JAVA的酒店管理系统

一、项目介绍 本系统前端框架采用了比较流行的渐进式JavaScript框架Vue.js。使用Vue-Router实现动态路由&#xff0c;Ajax实现前后端通信&#xff0c;Element-plus组件库使页面快速成型。后端部分&#xff1a;采用SpringBoot作为开发框架&#xff0c;同时集成MyBatis、Redis、…

Chrome DevTools:Console Performance 汇总篇

Chrome DevTools Chrome 开发者工具是一套 Web 开发者工具&#xff0c;直接内置于 Google Chrome 浏览器中。 开发者工具可以帮助您即时修改页面和快速诊断问题&#xff0c;最终帮助您更快地构建更好的网站。 一、开启 DevTools 右上角菜单 > 更多工具 > 开发者工具 页面…

如何用mmclassification训练多标签多分类数据

这里使用的源码版本是 mmclassification-0.25.0 训练数据标签文件格式如下&#xff0c;每行的空格前面是路径&#xff08;图像文件所在的绝对路径&#xff09;&#xff0c;后面是标签名&#xff0c;因为特殊要求这里我的每张图像都记录了三个标签每个标签用“,”分开&#xff0…