当前位置: 首页 > 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…...

STM32标准库-DMA直接存储器存取

文章目录 一、DMA1.1简介1.2存储器映像1.3DMA框图1.4DMA基本结构1.5DMA请求1.6数据宽度与对齐1.7数据转运DMA1.8ADC扫描模式DMA 二、数据转运DMA2.1接线图2.2代码2.3相关API 一、DMA 1.1简介 DMA&#xff08;Direct Memory Access&#xff09;直接存储器存取 DMA可以提供外设…...

什么是库存周转?如何用进销存系统提高库存周转率?

你可能听说过这样一句话&#xff1a; “利润不是赚出来的&#xff0c;是管出来的。” 尤其是在制造业、批发零售、电商这类“货堆成山”的行业&#xff0c;很多企业看着销售不错&#xff0c;账上却没钱、利润也不见了&#xff0c;一翻库存才发现&#xff1a; 一堆卖不动的旧货…...

解决本地部署 SmolVLM2 大语言模型运行 flash-attn 报错

出现的问题 安装 flash-attn 会一直卡在 build 那一步或者运行报错 解决办法 是因为你安装的 flash-attn 版本没有对应上&#xff0c;所以报错&#xff0c;到 https://github.com/Dao-AILab/flash-attention/releases 下载对应版本&#xff0c;cu、torch、cp 的版本一定要对…...

深入解析C++中的extern关键字:跨文件共享变量与函数的终极指南

&#x1f680; C extern 关键字深度解析&#xff1a;跨文件编程的终极指南 &#x1f4c5; 更新时间&#xff1a;2025年6月5日 &#x1f3f7;️ 标签&#xff1a;C | extern关键字 | 多文件编程 | 链接与声明 | 现代C 文章目录 前言&#x1f525;一、extern 是什么&#xff1f;&…...

企业如何增强终端安全?

在数字化转型加速的今天&#xff0c;企业的业务运行越来越依赖于终端设备。从员工的笔记本电脑、智能手机&#xff0c;到工厂里的物联网设备、智能传感器&#xff0c;这些终端构成了企业与外部世界连接的 “神经末梢”。然而&#xff0c;随着远程办公的常态化和设备接入的爆炸式…...

python执行测试用例,allure报乱码且未成功生成报告

allure执行测试用例时显示乱码&#xff1a;‘allure’ &#xfffd;&#xfffd;&#xfffd;&#xfffd;&#xfffd;ڲ&#xfffd;&#xfffd;&#xfffd;&#xfffd;ⲿ&#xfffd;&#xfffd;&#xfffd;Ҳ&#xfffd;&#xfffd;&#xfffd;ǿ&#xfffd;&am…...

Python 高效图像帧提取与视频编码:实战指南

Python 高效图像帧提取与视频编码:实战指南 在音视频处理领域,图像帧提取与视频编码是基础但极具挑战性的任务。Python 结合强大的第三方库(如 OpenCV、FFmpeg、PyAV),可以高效处理视频流,实现快速帧提取、压缩编码等关键功能。本文将深入介绍如何优化这些流程,提高处理…...

智能职业发展系统:AI驱动的职业规划平台技术解析

智能职业发展系统&#xff1a;AI驱动的职业规划平台技术解析 引言&#xff1a;数字时代的职业革命 在当今瞬息万变的就业市场中&#xff0c;传统的职业规划方法已无法满足个人和企业的需求。据统计&#xff0c;全球每年有超过2亿人面临职业转型困境&#xff0c;而企业也因此遭…...

【工具教程】多个条形码识别用条码内容对图片重命名,批量PDF条形码识别后用条码内容批量改名,使用教程及注意事项

一、条形码识别改名使用教程 打开软件并选择处理模式&#xff1a;打开软件后&#xff0c;根据要处理的文件类型&#xff0c;选择 “图片识别模式” 或 “PDF 识别模式”。如果是处理包含条形码的 PDF 文件&#xff0c;就选择 “PDF 识别模式”&#xff1b;若是处理图片文件&…...

【多线程初阶】单例模式 指令重排序问题

文章目录 1.单例模式1)饿汉模式2)懒汉模式①.单线程版本②.多线程版本 2.分析单例模式里的线程安全问题1)饿汉模式2)懒汉模式懒汉模式是如何出现线程安全问题的 3.解决问题进一步优化加锁导致的执行效率优化预防内存可见性问题 4.解决指令重排序问题 1.单例模式 单例模式确保某…...