gpt4 book ai didi

OpenCV实现轮廓检测与绘制

转载 作者:qq735679552 更新时间:2022-09-27 22:32:09 33 4
gpt4 key购买 nike

CFSDN坚持开源创造价值,我们致力于搭建一个资源共享平台,让每一个IT人在这里找到属于你的精彩世界.

这篇CFSDN的博客文章OpenCV实现轮廓检测与绘制由作者收集整理,如果你对这篇文章有兴趣,记得点赞哟.

图像的轮廓不仅能够提供物体的边缘,而且还能提供物体边缘之间的层次关系以及拓扑关系.

带有结构关系的边缘检测,这种结构关系可以表明图像中连通域或者某些区域之间的关系.

图为一个具有4个不连通边缘的二值化图像,由外到内依次为0号、1号、2号、3号条边缘。为了描述不同轮廓之间的结构关系,定义由外到内的轮廓级别越来越低,也就是高一层级的轮廓包围着较低层级的轮廓,被同一个轮廓包围的多个不互相包含的轮廓是同一层级轮廓。例如在图中,0号轮廓层级比1号和第2号轮廓的层及都要高,2号轮廓包围着3号轮廓,因此2号轮廓的层级要高于3号轮廓.

OpenCV实现轮廓检测与绘制

常用4个参数来描述不同层级之间的结构关系:同层下一个轮廓索引、同层上一个轮廓索引、下一层第一个子轮廓索引和上层父轮廓索引.

上图中0号轮廓没有同级轮廓和父轮廓需要用-1表示,其第一个子轮廓为1号轮廓,因此可以用描述该轮廓的结构。1号轮廓的下一个同级轮廓为2号轮廓但是没有上一个同级轮廓用-1表示,父轮廓为0号轮廓,第一个子轮廓为3号轮廓,因此可以用描述该轮廓结构。2号轮廓和3号轮廓同样可以用这样的方式构建结构关系描述子。图中不同轮廓之间的层级关系可以用图表示.

OpenCV实现轮廓检测与绘制

在二值图像中检测图像中所有轮廓并生成不同轮廓结构关系描述子:

?
1
2
3
void findContours( InputOutputArray image, OutputArrayOfArrays contours,
                               OutputArray hierarchy, int mode,
                               int method, Point offset = Point());
  • image:输入图像,数据类型为CV_8U的单通道灰度图像或者二值化图像。
  • contours:检测到的轮廓,每个轮廓中存放着像素的坐标。
  • hierarchy:轮廓结构关系描述向量。
  • mode:轮廓检测模式标志,可以选择的参数在表7-2给出。
  • method:轮廓逼近方法标志,可以选择的参数在表7-3给出。
  • offset:每个轮廓点移动的可选偏移量。这个参数主要用在从ROI图像中找出轮廓并基于整个图像分析轮廓的场景中。

该函数主要用于检测图像中的轮廓信息,并输出各个轮廓之间的结构信息.

函数的第一个参数是待检测轮廓的输入图像,从理论上讲检测图像轮廓需要是二值化图像,但是该函数会对非0像素视为1,0像素保持不变,因此该参数能够接受非二值化的灰度图像。由于该函数默认二值化操作不能保持图像主要的内容,因此常需要对图像进行预处理,利用threshold()函数或者adaptiveThreshold()函数根据需求进行二值化.

第二个参数用于存放检测到的轮廓,数据类型为vector,每个轮廓中存放着属于该轮廓的像素坐标。 函数的第三个参数用于存放各个轮廓之间的结构信息,数据类型为vector,数据的尺寸与检测到的轮廓数目相同,每个轮廓结构信息中第1个数据表示同层下一个轮廓索引、第2个数据表示同层上一个轮廓索引、第3个数据表示下一层第一个子轮廓索引、第4个数据表示上层父轮廓索引.

函数第四个参数是轮廓检测模式的标志,可以选择的参数及含义在表7-2给出。 函数第五个参数是选择轮廓逼近方法的标志,可以选择的参数及含义在表7-3给出。 函数最后一个参数是每个轮廓点移动的可选偏移量。这个函数主要用在从ROI图像中找出轮廓并基于整个图像分析轮廓的场景中.

OpenCV实现轮廓检测与绘制

只需要检测图像的轮廓,并不关心轮廓之间的结构关系信息 。

?
1
2
void findContours( InputOutputArray image, OutputArrayOfArrays contours,
                               int mode, int method, Point offset = Point());
  • image:输入图像,数据类型为CV_8U的单通道灰度图像或者二值化图像。
  • contours:检测到的轮廓,每个轮廓中存放着像素的坐标。
  • mode:轮廓检测模式标志,可以选择的参数在表7-2给出。
  • method:轮廓逼近方法标志,可以选择的参数在表7-3给出。
  • offset:每个轮廓点移动的可选偏移量。这个函数主要用在从ROI图像中找出轮廓并基于整个图像分析轮廓的场景中。

绘制轮廓函数:

?
1
2
3
4
5
void drawContours( InputOutputArray image, InputArrayOfArrays contours,
                               int contourIdx, const Scalar& color,
                               int thickness = 1, int lineType = LINE_8,
                               InputArray hierarchy = noArray(),
                               int maxLevel = INT_MAX, Point offset = Point() );
  • image:绘制轮廓的目标图像。
  • contours:所有将要绘制的轮廓
  • contourIdx:要绘制的轮廓的数目,如果是负数,则绘制所有的轮廓。
  • color:绘制轮廓的颜色。
  • thickness:绘制轮廓的线条粗细,如果参数为负数,则绘制轮廓的内部,默认参数值为1.
  • lineType:边界线连接的类型,可以选择参数在表7-4给出,默认参数值为LINE_8。
  • hierarchy:可选的结构关系信息,默认值为noArray()。
  • maxLevel:表示用于绘制轮廓的最大等级,默认值为INT_MAX。
  • offset:可选的轮廓偏移参数,按指定的移动距离绘制所有的轮廓。

该函数用于绘制findContours()函数检测到的图像轮廓。 函数的第一个参数为绘制轮廓的图像,根据需求该参数可以是单通道的灰度图像或者三通道的彩色图像。 第二个参数是所有将要绘制的轮廓,数据类型为vector。 第三个参数是要绘制的轮廓数目,该参数的数值与第二个参数相对应,应小于所有轮廓的数目,如果该参数值为负数,则绘制所有的轮廓。 第四个参数是绘制轮廓的颜色,对于单通道的灰度图像用Scalar(x)赋值,对于三通道的彩色图像用Scalar(x,y,z)赋值。 第五个参数是边界线的连接类型,可以选择的参数在表7-4给出,默认参数值为LINE_8。 第六个参数是可选的结构关系信息,默认值为noArray()。 第七个参数表示绘制轮廓的最大等级,参数值如果为0,则仅绘制指定的轮廓;如果为1,则该函数绘制轮廓和所有嵌套轮廓;如果为2,则该函数绘制轮廓以及所有嵌套轮廓和所有嵌套到嵌套轮廓的轮廓,以此类推,默认值为INT_MAX。函数最后一个参数是可选的轮廓偏移参数,按指定的移动距离绘制所有的轮廓.

OpenCV实现轮廓检测与绘制

简单示例

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
//
// Created by smallflyfly on 2021/6/22.
//
 
#include "opencv2/opencv.hpp"
#include <iostream>
 
using namespace std;
using namespace cv;
 
int main() {
     Mat im = imread( "rice.jfif" );
     resize(im, im, Size(0, 0), 0.5, 0.5);
     Mat gray;
     cvtColor(im, gray, CV_BGR2GRAY);
 
     Mat imBin;
     threshold(gray, imBin, 125, 255,THRESH_BINARY);
 
     vector<vector<Point>> contours;
     findContours(imBin, contours, RETR_EXTERNAL, CHAIN_APPROX_NONE);
     vector<Vec4i> hierarchy;
     findContours(imBin, contours, hierarchy, RETR_EXTERNAL, CHAIN_APPROX_NONE);
 
     drawContours(im, contours, -1, Scalar(0, 0, 255));
 
     for (auto & i : hierarchy) {
         cout << i << endl;
     }
 
     imshow( "im" , im);
 
     waitKey(0);
     destroyAllWindows();
 
     return 0;
 
}

OpenCV实现轮廓检测与绘制

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我.

原文链接:https://blog.csdn.net/B08370108/article/details/118102859 。

最后此篇关于OpenCV实现轮廓检测与绘制的文章就讲到这里了,如果你想了解更多关于OpenCV实现轮廓检测与绘制的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。

33 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com