当前位置: 首页 > news >正文

加强版 第五节图像处理与视频分析

基本概念

图像轮廓

主要针对二值图像,轮廓是一系列点

vector<vector<Point>xxx用于存储多个点

vector<Vec4i>xxx包含四个整数,分别代表下一个轮廓的索引,上一个轮廓的索引,一个子轮廓的索引和父轮廓的索引

相关API

1. 功能基本描述

• findContours函数的主要目的是在二值图像中找到物体的轮廓。比如,你有一张简单的黑白图像,黑色部分是背景,白色部分是一个圆形。这个函数就能找到这个圆形的轮廓,也就是圆形和背景的边界。

2. 参数一般解释

• 输入图像:必须是单通道的二值图像。这是因为函数需要明确地区分物体和背景。例如,图像像素值为0表示背景,255表示物体,这样函数才能沿着物体和背景的边界去寻找轮廓。

• 轮廓存储容器:用来接收找到的轮廓信息。假设你要在一个包含多个形状的图像中找到所有形状的轮廓,这个容器就会把每个形状的轮廓点信息都存储起来,每个轮廓是一系列的点。

• 层次结构容器:用于记录轮廓之间的层次关系。例如,在一幅有大矩形里面套着小矩形的图像中,大矩形和小矩形的轮廓是有层次关系的,这个容器就存储这种关系,像是小矩形轮廓属于大矩形轮廓内部这种信息。

• 检索模式:不同的检索模式有不同的用途。例如,除了RETR_TREE模式外,还有RETR_EXTERNAL模式。RETR_EXTERNAL模式只查找最外层的轮廓,适用于只关心图像中最外面物体轮廓的情况,比如在只需要找到图像中最大物体的外边界时就很有用。

{

1. RETR_EXTERNAL

• 含义:只检索最外层的轮廓。例如,在一幅包含多个嵌套形状(如一个大圆形里面有小圆形)的图像中,它只会找到大圆形的轮廓,而忽略内部小圆形的轮廓。

• 应用场景:当你只关心图像中最主要物体的外边界,或者想排除内部细节时很有用。比如在对一张有很多小图案的商标图片进行处理时,只想找到商标的外轮廓,就可以使用这种模式。

2. RETR_LIST

• 含义:检索所有轮廓,但不建立任何层次关系。所有轮廓都被看作是在同一层次上,没有父子、嵌套等关系。

• 应用场景:适用于不需要考虑轮廓之间层次结构,只是简单地想要获取所有轮廓信息的情况。例如,在统计图像中所有独立形状的数量,并且不关心它们是否嵌套时可以使用。

3. RETR_CCOMP

• 含义:检索所有轮廓,并将它们组织成两级层次结构。顶层是外轮廓,第二层是内轮廓(洞)。例如,在一个有空心形状的图像中,它能区分出外部轮廓和内部的空心部分轮廓。

• 应用场景:用于处理有简单嵌套关系(如空心图形)的图像,并且只需要区分外层和内层轮廓这种两级层次的情况。

4. RETR_TREE

• 含义:检索所有轮廓,并建立完整的层次结构。它可以表示复杂的轮廓关系,包括嵌套、相邻等多种情况。像在有多个形状相互嵌套、包含多个层次的复杂图像中,能很好地描述轮廓之间的关系。

• 应用场景:适用于需要详细分析轮廓之间复杂关系的情况,如在对具有多个嵌套图形的工程图纸进行分析,或者对包含复杂形状的自然场景图像进行处理时。

}

• 轮廓近似方法:可以选择不同的近似方式来简化轮廓信息。比如CHAIN_APPROX_NONE模式会存储轮廓上的所有点,而CHAIN_APPROX_SIMPLE模式会对轮廓进行简化,像直线部分只保留端点,这样可以减少存储轮廓所需的数据量,同时又能保持轮廓的基本形状。

{

1. CHAIN_APPROX_NONE

• 含义:存储轮廓上的所有点。这种方法会精确地记录轮廓经过的每一个像素点,不会对轮廓进行任何简化。

• 应用场景:在需要高精度地描绘轮廓,或者后续操作对轮廓细节要求极高的情况下使用。例如,对于一些需要精确测量轮廓长度,且轮廓形状不规则、细节丰富的图像,使用这种方法可以保留完整的轮廓信息。

2. CHAIN_APPROX_SIMPLE

• 含义:压缩水平、垂直和对角线段,只保留它们的端点。这是一种常用的近似方法,它可以在不丢失轮廓基本形状的前提下,大大减少存储轮廓所需的数据量。

• 应用场景:适用于大多数情况,特别是当轮廓中有较多直线段时。例如,在处理简单几何形状(如矩形、三角形)或者具有明显直线边界的物体轮廓时,这种方法既能有效表示轮廓,又能减少数据存储和后续处理的复杂度。

3. CHAIN_APPROX_TC89_L1和CHAIN_APPROX_TC89_KCOS

• 含义:这两种方法是使用 Teh - Chin 链近似算法的不同形式。它们也是对轮廓进行近似,但具体的近似方式是基于特定的数学算法。

• 应用场景:在一些对轮廓近似精度有特殊要求,且希望通过特定算法来实现近似的情况下可以使用。不过相对来说,这两种方法在日常应用中没有前两种那么普遍。

}

• 偏移量:用于对轮廓的位置进行调整。例如,如果需要将找到的轮廓在图像中的位置整体向右和向下移动一定的像素量,就可以通过设置这个偏移量来实现。


drawContours是 OpenCV 中的一个函数,用于在图像上绘制轮廓。

1. 功能描述:

• 它可以将找到的轮廓以特定的颜色、线宽等属性绘制在给定的图像上,使得轮廓在图像中清晰可见,方便用户进行可视化分析和处理。

2. 参数解释:

• 图像参数:第一个参数是要在其上绘制轮廓的图像,通常是一个Mat对象。

• 轮廓容器参数:第二个参数是包含要绘制轮廓的容器,一般是vector<vector<Point>>类型,每个内部的向量表示一个轮廓,由一系列的点组成。

• 轮廓索引参数:第三个参数可以是一个整数索引或者特殊值(如 -1)。如果是整数索引,则只绘制指定索引对应的轮廓;如果是 -1,则绘制所有的轮廓。

• 颜色参数:第四个参数是一个Scalar对象,用于指定绘制轮廓的颜色。例如Scalar(0, 0, 255)表示红色,Scalar(255, 0, 0)表示蓝色等。

• 线宽参数:第五个参数指定绘制轮廓的线宽。较大的值会使轮廓线更粗,较小的值则使轮廓线更细。

• 连接方式参数:第六个参数一般情况下不太常用,它指定了轮廓如何连接线段,不同的值可能会有不同的连接效果,但一般使用默认值即可。



#include<opencv2/opencv.hpp>
#include<iostream>
using namespace cv;
using namespace std;
int main(int argc, char** argv) {
    Mat sgv,stu,sbt;
    Mat stv = imread("C:/newword/image/3.png");
    if (stv.empty()) {
        printf("no pc");
        return -1;
    }
    namedWindow("abc", WINDOW_AUTOSIZE);
    imshow("abc", stv);
    
    GaussianBlur(stv,sgv,Size(3,3),0);
    cvtColor(sgv, sbt, COLOR_BGR2GRAY);
    threshold(sbt, stu, 0, 255, THRESH_BINARY | THRESH_OTSU);
    vector<vector<Point>>contours;
    vector<Vec4i>hierarchy;
    findContours(stu, contours, hierarchy, RETR_TREE, CHAIN_APPROX_SIMPLE, Point());
    drawContours(stv, contours, -1, Scalar(0, 0, 255), 2, 8);

//    for (size_t t = 0; t < contours.size(); t++) {
    drawContours(stv, contours, t, Scalar(0, 0, 255), 2, 8);
}
    imshow("asdd", stv);
    waitKey(0);
    destroyWindow;
    return 0;

}

相关文章:

加强版 第五节图像处理与视频分析

基本概念 图像轮廓 主要针对二值图像&#xff0c;轮廓是一系列点 vector<vector<Point>xxx用于存储多个点 vector<Vec4i>xxx包含四个整数&#xff0c;分别代表下一个轮廓的索引&#xff0c;上一个轮廓的索引&#xff0c;一个子轮廓的索引和父轮廓的索引 相…...

Orleans8.2入门测试

微软官方文档&#xff1a;快速入门&#xff1a;使用 ASP.NET Core 生成第一个 Orleans 应用 - .NET | Microsoft Learn 项目及引入的nuget库&#xff1a; 1、接口项目&#xff1b;2、接口实现项目&#xff1b;3、silo项目&#xff1b;4、客户端项目 其中Microsoft.Orleans.St…...

【Linux 25】网络套接字 socket 概念

文章目录 &#x1f308; 一、IP 地址概念⭐ 1. IP 地址的作用⭐ 2. 源 IP 地址和目的 IP 地址 &#x1f308; 二、端口号概念⭐ 1. 源端口号和目的端口号⭐ 2. 端口号范围划分⭐ 3. 端口号 VS 进程 ID⭐ 4. 套接字 socket 的概念 &#x1f308; 三、传输层的典型代表协议⭐ 1. …...

python openai 通过Function Call 创建自动化任务

目录 一、什么是Function Call(函数掉用) 1. 功能概述 2. 工作原理 二、如何实现函数调用 1、定义自己的get_weather 函数 2、给助手添加函数调用 3、写好instrction,指导assistant去掉用你定义的方法。 4、最后也是最重要的,捕获 Assistant 的 Function Call 三、…...

设计模式之责任链的通用实践思考

责任链模式通常一般用在方法的拦截、监控、统计方面&#xff0c;比较典型的就是Spring的AOP拦截。 但写一些小的基础能力框架的时候&#xff0c;用AOP比较中&#xff0c;所以一般都是自己针对特定的功能写一些定制的责任链工具类&#xff0c;不太喜欢总是做一些定制化的东西&am…...

前端用canvas绘图并支持下载

1.根据数据绘制饼图 /** 绘制环形图 */ const drawPieCharts () > {const {canWithdrawalPriceFront,noWithdrawalPriceFront,haveWithdrawalPriceFront,} this.state;const myCanvas this.cavasRef.current;// ts-ignoreconst ctx myCanvas.getContext(2d);if (ctx) {…...

【Mac】Homebrew

1、Homebrew 简介 官网地址&#xff1a;https://brew.sh Homebrew 是一款Mac OS平台下的软件包管理工具&#xff0c;拥有安装、卸载、更新、查看、搜索等很多实用的功能。 Homebrew 主要有四个部分组成: brew、homebrew-core 、homebrew-bottles、homebrew-cask。 源说明br…...

Python笔记之线程库threading

Python笔记之线程库threading 参考博文 Python多线程笔记——简单函数版和类实现版 code review! Python 的 threading 库用于在程序中创建和管理线程。线程允许程序并发执行多个任务。以下是 threading 库的详解和一些简洁示例。 基本概念 线程&#xff1a;在一个进程中&a…...

go 包管理

Go语言所依赖的所有的第三方库都放在GOPATH目录下面 gomodule是Go语言默认的依赖管理工具 Modules是相关Go包的集合&#xff0c;是源代码交换和版本控制的单元&#xff0c;用于指定使用哪些源文件 GO111MODULEoff禁用gomodule&#xff0c;编译时从GOPATH和vendor文件夹中查找包…...

Js内建对象

数组解构 const arr ["1","2","3"]let a,b,c// 解构赋值 //将数组的第一个元素赋值给第一个变量&#xff0c;第二个元素赋值给第二个变量&#xff0c;依次类推[a,b,c] arr console.log(a,b,c) // 1 2 3 // 声明变量同时解构 let [a,b,c] [&qu…...

AXI接口的实现逻辑和底层原理,在FPGA中如何实现AXI接口,一篇文章足以搞明白!!!

AXI&#xff08;Advanced eXtensible Interface&#xff09;接口是一个点对点的接口&#xff0c;用于连接高性能的片上系统&#xff08;SoC&#xff09;中的处理器、外围设备、内存和其他IP核。以下是对AXI接口的详细解析&#xff0c;包括FPGA实现的原理、逻辑、速度以及详细的…...

《GBDT 算法的原理推导》 11-12计算损失函数的负梯度 公式解析

本文是将文章《GBDT 算法的原理推导》中的公式单独拿出来做一个详细的解析&#xff0c;便于初学者更好的理解。 公式(11-12)是GBDT算法中非常关键的一步&#xff0c;它表示了如何通过计算损失函数的负梯度来指导下一棵树的生长。 公式(11-12)如下&#xff1a; r m i − [ ∂ …...

mysql设计

大家好&#xff0c;我是捡田螺的小男孩。 昨天一位粉丝&#xff0c;咨询了一个并发的问题~ 我提供了一个乐观锁兜底的方案&#xff0c;然后发现他们的表&#xff0c;都没有加version字段的,我想到&#xff0c;这不是表设计通用字段嘛。因此&#xff0c;本文跟大家聊聊&#xf…...

Android 斗鱼面经

Android 斗鱼面经 文章目录 Android 斗鱼面经一面二面 一面 先简单描述一下JVM JRE JDK的关系 :::info JVM&#xff08;Java Virtual Machine&#xff09; Java 虚拟机。它只认识 xxx.class 这种类型的文件&#xff0c;它能够将 class 文件中的字节码指令进行识别并调用操作…...

【机器学习】26. 聚类评估方法

聚类评估方法 1. Unsupervised Measure1.1. Method 1: measure cohesion and separationSilhouette coefficient Method 2&#xff1a;Correlation between two similarity matricesMethod 3&#xff1a;Visual Inspection of similarity matrix 2. Supervised measures3. 决定…...

linux 最多能创建多少个 TCP 连接?

linux 最大允许TCP连接数 约束一&#xff1a;服务器的端口范围约束二&#xff0c;服务器文件描述符限制约束三&#xff1a;系统线程约束四&#xff1a;系统内存总结 tcp连接四元组&#xff1a;源ip&#xff0c;源端口 <> 目标ip&#xff0c;目标端口 连续对同一个目标ip及…...

我为何要用wordpress搭建一个自己的独立博客

我在csdn有一个博客&#xff0c;这个博客是之前学习编程时建立的。 博客有哪些好处呢&#xff1f; 1&#xff0c;可以写自己的遇到的问题和如何解决的步骤 2&#xff0c;心得体会&#xff0c;经验&#xff0c;和踩坑 3&#xff0c;可以转载别人的好的技术知识 4&#xff0c;宝贵…...

Linux系统每日定时备份mysql数据

一、创建存储脚本的文件夹 创建文件夹&#xff0c;我的脚本放在/root/dbback/mysql mkdir ... cd /root/dbback/mysql 二、编写脚本 vi backup_mysql.sh 复制脚本内容 DB_USER"填写用户名" DB_PASSWORD"填写密码" DB_NAME"数据库名称" # …...

书生大模型第一关Linux基础知识

任务一&#xff1a;完成SSH连接与端口映射并运行hello_world.py 1.SSH及其端口映射 2.在VSCode中安装插件&#xff1a; 3.创建开发机 最后点击创建&#xff0c;然后可能需要等待一段较长的时间&#xff0c;大概需要5分钟左右&#xff0c;如果需要排队则更长时间 然后选择…...

机器学习之fetch_olivetti_faces人脸识别--基于Python实现

fetch_olivetti_faces 数据集下载 fetch_olivetti_faceshttps://github.com/jikechao/olivettifaces sklearn.datasets.fetch_olivetti_faces(*, data_homeNone, shuffleFalse, random_state0, download_if_missingTrue, return_X_yFalse, n_retries3, delay1.0)[source] L…...

uniapp 对接腾讯云IM群组成员管理(增删改查)

UniApp 实战&#xff1a;腾讯云IM群组成员管理&#xff08;增删改查&#xff09; 一、前言 在社交类App开发中&#xff0c;群组成员管理是核心功能之一。本文将基于UniApp框架&#xff0c;结合腾讯云IM SDK&#xff0c;详细讲解如何实现群组成员的增删改查全流程。 权限校验…...

深入浅出Asp.Net Core MVC应用开发系列-AspNetCore中的日志记录

ASP.NET Core 是一个跨平台的开源框架&#xff0c;用于在 Windows、macOS 或 Linux 上生成基于云的新式 Web 应用。 ASP.NET Core 中的日志记录 .NET 通过 ILogger API 支持高性能结构化日志记录&#xff0c;以帮助监视应用程序行为和诊断问题。 可以通过配置不同的记录提供程…...

XCTF-web-easyupload

试了试php&#xff0c;php7&#xff0c;pht&#xff0c;phtml等&#xff0c;都没有用 尝试.user.ini 抓包修改将.user.ini修改为jpg图片 在上传一个123.jpg 用蚁剑连接&#xff0c;得到flag...

TDengine 快速体验(Docker 镜像方式)

简介 TDengine 可以通过安装包、Docker 镜像 及云服务快速体验 TDengine 的功能&#xff0c;本节首先介绍如何通过 Docker 快速体验 TDengine&#xff0c;然后介绍如何在 Docker 环境下体验 TDengine 的写入和查询功能。如果你不熟悉 Docker&#xff0c;请使用 安装包的方式快…...

利用ngx_stream_return_module构建简易 TCP/UDP 响应网关

一、模块概述 ngx_stream_return_module 提供了一个极简的指令&#xff1a; return <value>;在收到客户端连接后&#xff0c;立即将 <value> 写回并关闭连接。<value> 支持内嵌文本和内置变量&#xff08;如 $time_iso8601、$remote_addr 等&#xff09;&a…...

论文浅尝 | 基于判别指令微调生成式大语言模型的知识图谱补全方法(ISWC2024)

笔记整理&#xff1a;刘治强&#xff0c;浙江大学硕士生&#xff0c;研究方向为知识图谱表示学习&#xff0c;大语言模型 论文链接&#xff1a;http://arxiv.org/abs/2407.16127 发表会议&#xff1a;ISWC 2024 1. 动机 传统的知识图谱补全&#xff08;KGC&#xff09;模型通过…...

关于 WASM:1. WASM 基础原理

一、WASM 简介 1.1 WebAssembly 是什么&#xff1f; WebAssembly&#xff08;WASM&#xff09; 是一种能在现代浏览器中高效运行的二进制指令格式&#xff0c;它不是传统的编程语言&#xff0c;而是一种 低级字节码格式&#xff0c;可由高级语言&#xff08;如 C、C、Rust&am…...

Android15默认授权浮窗权限

我们经常有那种需求&#xff0c;客户需要定制的apk集成在ROM中&#xff0c;并且默认授予其【显示在其他应用的上层】权限&#xff0c;也就是我们常说的浮窗权限&#xff0c;那么我们就可以通过以下方法在wms、ams等系统服务的systemReady()方法中调用即可实现预置应用默认授权浮…...

JAVA后端开发——多租户

数据隔离是多租户系统中的核心概念&#xff0c;确保一个租户&#xff08;在这个系统中可能是一个公司或一个独立的客户&#xff09;的数据对其他租户是不可见的。在 RuoYi 框架&#xff08;您当前项目所使用的基础框架&#xff09;中&#xff0c;这通常是通过在数据表中增加一个…...

面向无人机海岸带生态系统监测的语义分割基准数据集

描述&#xff1a;海岸带生态系统的监测是维护生态平衡和可持续发展的重要任务。语义分割技术在遥感影像中的应用为海岸带生态系统的精准监测提供了有效手段。然而&#xff0c;目前该领域仍面临一个挑战&#xff0c;即缺乏公开的专门面向海岸带生态系统的语义分割基准数据集。受…...