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

基本概念

图像轮廓

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

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.mzph.cn/news/884376.shtml

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

相关文章

数据结构之链式结构二叉树的实现(初级版)

本文内容将主会多次用到函数递归知识&#xff01;&#xff01;&#xff01; 本节内容需要借助画图才能更好理解&#xff01;&#xff01;&#xff01; 和往常一样&#xff0c;还是创建三个文件 这是tree.h #pragma once #include<stdio.h> #include<stdlib.h> …

Data+AI━━人群圈选,你被圈中了吗?

DataAI━━人群圈选&#xff0c;你被圈中了吗&#xff1f; 前言我们是否正在失去选择的自主权&#xff1f;AI人群圈选流程AI人群圈选技术发展趋势 前言 智能时代的清晨&#xff0c;打开手机&#xff0c;各类APP精准推送的信息扑面而来。菜市场买过一次三文鱼&#xff0c;生鲜A…

手撕快排的三种方法:让面试官对你刮目相看

快来参与讨论&#x1f4ac;&#xff0c;点赞&#x1f44d;、收藏⭐、分享&#x1f4e4;&#xff0c;共创活力社区。 目录 &#x1f4af;前言 &#x1f4af;快速排序基础概念 &#x1f4af;Hoare 版本 1.算法思路 2.代码示例 3.有关该代码的问题 3.1&#x1f62e;为什么…

51单片机教程(五)- LED灯闪烁

1 项目分析 让输入/输出口的P1.0或P1.0~P1.7连接的LED灯闪烁。 2 技术准备 1、C语言知识点 1 运算符 1 算术运算符 #include <stdio.h>int main(){// 算术运算符int a 13;int b 6;printf("%d\n", ab); printf("%d\n", a-b); printf("%…

ceph补充介绍

SDS-ceph ceph介绍 crushmap 1、crush算法通过计算数据存储位置来确定如何存储和检索&#xff0c;授权客户端直接连接osd 2、对象通过算法被切分成数据片&#xff0c;分布在不同的osd上 3、提供很多种的bucket&#xff0c;最小的节点是osd # 结构 osd (or device) host #主…

集成ruoyi-it管理系统,遇到代码Bug

前言&#xff1a;这次ruoyi框架开发it管理系统&#xff0c;出现很多问题&#xff0c;也有学到很多东西&#xff0c;出现几个问题&#xff0c;希望下次项目不会出现或者少出现问题&#xff1b;其中还是有很多基础知识有些忘记&#xff0c;得多多复习 1&#xff1a;当写的代码没…

大模型面试-Layer normalization篇

1. Layer Norm 的计算公式写一下? 2. RMS Norm 的计算公式写一下? 3. RMS Norm 相比于 Layer Norm 有什么特点? 4. Deep Norm 思路? 5. 写一下 Deep Norm 代码实现? 6.Deep Norm 有什么优点? 7.LN 在 LLMs 中的不同位置 有什么区别么?如果有,能介绍一下区别么? 8. LLM…

【Linux第七课--基础IO】内存级文件、重定向、缓冲区、文件系统、动态库静态库

目录 引入内存级文件重新使用C文件接口 -- 对比重定向写文件读文件文件流 认识文件操作的系统接口open参数 -- flagflag的内容宏的传参方式 open关闭文件写文件读文件结论 引入文件描述符fd、对文件的理解理解一切皆文件方法集文件fd的分配规则 重定向代码的重定向输入重定向输…

手写实现call,apply,和bind方法

手写实现call&#xff0c;apply和bind方法 call&#xff0c;apply和bind方法均是改变this指向的硬绑定方法&#xff0c;要想手写实现此三方法&#xff0c;都要用到一个知识点&#xff0c;即对象调用函数时&#xff0c;this会指向这个对象&#xff08;谁调用this就指向谁&#…

Redis全系列学习基础篇之位图(bitmap)常用命令的解析

文章目录 描述常用命令及解析常用命令解析 应用场景统计不确定时间周期内用户登录情况思路分析实现 统计某一特定时间内活跃用户(登录一次即算活跃)的数量思路分析与实现 描述 bitmap是redis封装的用于针对位(bit)的操作,其特点是计算效率高&#xff0c;占用空间少,常被用来统计…

Java | Leetcode Java题解之第518题零钱兑换II

题目&#xff1a; 题解&#xff1a; class Solution {public int change(int amount, int[] coins) {int[] dp new int[amount 1];boolean[] valid new boolean[amount 1];dp[0] 1;valid[0] true;for (int coin : coins) {for (int i coin; i < amount; i) {valid[i…

Java的包、final关键字以及代码块

Java的包、final关键字以及代码块 一、包 包的作用 &#xff1a; ​ 包就是文件夹&#xff0c;用来管理各种不同功能的Java类 包名的书写规则&#xff1a; ​ 公司域名反写 包的作用&#xff0c;需要全部英文小写&#xff0c;见名知意 什么是全类名&#xff1a; ​ 包名…

【AI视频换脸整合包及教程】AI换脸新星:Rope——让换脸变得如此简单

在数字技术迅猛发展的今天&#xff0c;人工智能&#xff08;AI&#xff09;的应用已经渗透到了我们生活的方方面面&#xff0c;从日常的语音助手到复杂的图像处理&#xff0c;无不体现着AI技术的魅力。特别是在娱乐和创意领域&#xff0c;AI技术更是展现出了惊人的潜力。其中&a…

Ubuntu下安装和配置MySQL5.7教程

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 目录 前言 在ubuntu下安装MySQL数据库 查看操作系统版本 ​编辑 添加 MySQL APT 源 访问下载页面并下载发布包 安装发布包 安装MySQL 查看MySQL状态 开启自启动 登…

Java中常见的异常类型

1、Exception和Error有什么区别&#xff1f; 首先Exception和Error都是继承于Throwable类&#xff0c;在Java中只有Throwable类型的实例才可以被抛出&#xff08;throw&#xff09;或者捕获&#xff08;catch&#xff09;&#xff0c;它是异常处理机制的基本组成类型。 Except…

Unity的gRPC使用之实现客户端

应用背景&#xff1a;本想Unity调用C的dll库获取一些数据资源&#xff0c;但是由于自己调用的C库模块化处理的不太理想&#xff0c;众多dll之间相互依赖&#xff0c;使得在调用dll的时候&#xff0c;会忽略一些dll的缺失&#xff0c;使Unity项目报错&#xff0c;故想到了使用gR…

GPU-主板-内存-硬盘-CPU-电源分类及区别总结大全

一、背景 用了7年的笔记本&#xff0c;现在感觉它实在是扛不住了&#xff0c;中间自己缝缝补补坚持到现在&#xff0c;把机械硬盘换成了固态&#xff0c;加装了内存条。换过2次还是3次风扇&#xff08;不知道为啥坏的&#xff0c;高转速时哧哧响&#xff09;&#xff0c;换过一…

【JavaSE练习题】数组的创建和使用

数组的创建和使用 奇数位于偶数之前冒泡排序两数之和只出现一次的数字多数元素存在连续三个奇数的数组 奇数位于偶数之前 调整数组顺序使得奇数位于偶数之前。调整之后&#xff0c;不关心大小顺序。 如数组&#xff1a;[1,2,3,4,5,6] 调整后可能是&#xff1a;[1, 5, 3, 4, 2,…

使用Vue.js和Vuex构建可维护的前端应用

使用Vue.js和Vuex构建可维护的前端应用 Vue.js简介 安装Vue.js 使用npm安装 使用CDN引入 创建Vue项目 安装Vuex 初始化Vuex Store 在Vue组件中使用Store Vuex模块化 Vuex命名空间 Vuex插件 Vuex热重载 Vuex持久化状态 Vuex调试工具 Vuex的高级用法 异步Actions 中间件 Vuex的…

小新学习k8s第四天之发布管理

一、金丝雀发布&#xff08;灰度发布&#xff09; Deployment控制器支持自定义控制更新过程中的滚动节奏&#xff0c;如“暂停(pause)”或“继续(resume)”更新操作。 ①比如等待第一批新的Pod资源创建完成后立即暂停更新过程&#xff0c;此时&#xff0c;仅存在一部分新版本的…