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

news/2024/11/2 19:32:31/

基本概念

图像轮廓

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

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;

}


http://www.ppmy.cn/news/1543951.html

相关文章

G2 基于生成对抗网络(GAN)人脸图像生成

&#x1f368; 本文为&#x1f517;365天深度学习训练营 中的学习记录博客&#x1f356; 原作者&#xff1a;K同学啊 基于生成对抗网络&#xff08;GAN&#xff09;人脸图像生成 这周将构建并训练一个生成对抗网络&#xff08;GAN&#xff09;来生成人脸图像。 GAN 原理概述 …

解决Java接口接受附件入参失败的问题

接口的入参实体类存在 MultipartFile 类型属性&#xff0c;接口入参注解为RequestBody&#xff0c;会报错。需要把入参注解改为RequestPart&#xff0c;或者去掉注解。 RequestBody和RequestPart的异同&#xff1a; 相同点&#xff1a; 都可以用实体类接收传参 不同点&#xff…

分布式锁(redisson,看门狗,主从一致性)

目录 分布式锁一&#xff1a;基本原理和实现方式二&#xff1a;分布式锁的实现1&#xff1a;分布式锁的误删问题2&#xff1a;解决误删问题 三&#xff1a;lua脚本解决多条命令原子性问题调用lua脚本 四&#xff1a;Redisson1&#xff1a;redisson入门2&#xff1a;redisson可重…

.bixi勒索病毒来袭:如何防止文件加密与数据丢失?

导言 在网络威胁剧烈的今天&#xff0c;勒索病毒已成为企业和个人面临的重大安全挑战&#xff0c;其中虫洞勒索病毒习得高强度的加密手段和急剧传播的特性引起关注。一旦感染&#xff0c;就会加密关键数据并索要赎金&#xff0c;导致数据无法访问并带来巨大的财务损失。更为严…

春之竞赛:Spring Boot大学生竞赛管理平台

1系统概述 1.1 研究背景 随着计算机技术的发展以及计算机网络的逐渐普及&#xff0c;互联网成为人们查找信息的重要场所&#xff0c;二十一世纪是信息的时代&#xff0c;所以信息的管理显得特别重要。因此&#xff0c;使用计算机来管理大学生竞赛管理系统的相关信息成为必然。开…

openEuler下配置openGauss环境图解

一、在openEuler中创建用户&#xff0c;并授予权限 # 创建用户 sudo adduser omm# 授予权限 chown omm /opt# 切换用户 su - omm 二、在openGauss官网找到openGauss极简版的软件包 openGauss软件 | openGauss下载 | openGauss软件包 | openGauss社区 右键立即下载&#xff0…

VSCode中安装RN相关的插件(一)

一、插件介绍 ES7 React / Redux / React-Native snippets v4.4.3 如图&#xff0c;在VSCode的插件商店里搜索该插件进行安装。 安装完插件以后&#xff0c;就可以通过简写指令生成一些代码片段了。具体有哪些简短指令&#xff0c;大家可以自己查看&#xff0c;这里举两个示例…

独立北斗定位智能安全帽、定位安全帽、单北斗执法记录仪

AIoT万物智联&#xff0c;智能安全帽生产厂家&#xff0c;执法记录仪生产厂家&#xff0c;单北斗定位智能安全帽、智能头盔、头盔记录仪、执法记录仪、智能视频分析/边缘计算AI盒子、车载视频监控/车载DVR/NVR、布控球、智能眼镜、智能手电、智能电子工牌、无人机4G补传系统等统…