gpt4 book ai didi

Opencv实现轮廓提取功能

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

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

这篇CFSDN的博客文章Opencv实现轮廓提取功能由作者收集整理,如果你对这篇文章有兴趣,记得点赞哟.

轮廓:一个轮廓代表一系列的点(像素),这一系列的点构成一个有序的点集,所以可以把一个轮廓理解为一个有序的点集.

在opencv中,提供了一个函数返回一个有序的点集或者有序的点集的集合(指多个有序的点集),函数findContour是从二值图像中来计算轮廓的,一般使用Canny()函数处理后的图像,因为这样的图像含有边缘像素.

寻找轮廓的API函数:

?
1
findContours(image,vector<vector<Point>> contours,vector<Vec4i>hierarchy, int mode, int method,Point offset = Point(0,0));

参数解释:

(1)image:单通道图像矩阵,一般是经过canny处理后的二值图像; 。

(2)contours:vector<vector<Point>>类型,是一个向量,并且是一个双重向量,向量内每个元素保存了一组由连续的Point点构成的点的集合的向量,每一组Point点集就是一个轮廓。有多少轮廓,向量contours就有多少元素; 。

(3)hierarchy:vector<Vec4i> 类型, 即容器内每一个元素都是一个包含了4个int型变量的向量,向量内每个元素保存了一个包含4个int整型的数组。向量hiararchy内的元素和轮廓向量contours内的元素是一一对应的,向量的容量相同。hierarchy向量内每一个元素的4个int型变量——hierarchy[i][0] ~hierarchy[i][3],分别表示第i个轮廓的后一个轮廓、前一个轮廓、父轮廓、内嵌轮廓的索引编号。如果当前轮廓没有对应的后一个轮廓、前一个轮廓、父轮廓或内嵌轮廓的话,则hierarchy[i][0] ~hierarchy[i][3]的相应位被设置为默认值-1; 。

(4)mode:int类型的,定义轮廓的检索模式:

  • CV_RETR_EXTERNAL只检测最外围轮廓,包含在外围轮廓内的内围轮廓被忽略;
  • CV_RETR_LIST   检测所有的轮廓,包括内围、外围轮廓,但是检测到的轮廓不建立等级关系,彼此之间独立,没有等级关系,这就意味着这个检索模式下不存在父轮廓或内嵌轮廓,所以hierarchy向量内所有元素的第3、第4个分量都会被置为-1,具体下文会讲到;
  • CV_RETR_CCOMP  检测所有的轮廓,但所有轮廓只建立两个等级关系,外围为顶层,若外围内的内围轮廓还包含了其他的轮廓信息,则内围内的所有轮廓均归属于顶层;
  • CV_RETR_TREE, 检测所有轮廓,所有轮廓建立一个等级树结构。外层轮廓包含内层轮廓,内层轮廓还可以继续包含内嵌轮廓。   

(5)method:int类型,定义轮廓的近似方法:   。

  • CV_CHAIN_APPROX_NONE 保存物体边界上所有连续的轮廓点到contours向量内;
  • CV_CHAIN_APPROX_SIMPLE 仅保存轮廓的拐点信息,把所有轮廓拐点处的点保存入contours向量内,拐点与拐点之间直线段上的信息点不予保留;
  • CV_CHAIN_APPROX_TC89_L1,CV_CHAIN_APPROX_TC89_KCOS使用teh-Chinl chain 近似算法;                   

(6) Point:偏移量,所有的轮廓信息相对于原始图像对应点的偏移量,相当于在每一个检测出的轮廓点上加上该偏移量,一般不偏移取Point(0,0).

画轮廓的API函数:

drawContours(Outputimage,contours,hierarchy,int contourIdx,color,int thickness ,int lineType,hierarchy = noArray(),int maxLevel = INT_MAX,Point offset = Point(0,0)) 参数解释:

    (1)outputimage: 将轮廓画在该图上;     (2)contours:前面寻找到的轮廓;     (3)contourIdx:是一个索引,代表绘制contours中的第几个轮廓;     (4) color:颜色;     (5)thickness: 线宽;     (6)lineType: 线型;     (7)hierarchy:可选层次信息结构,这里面是findContours所的到的基于Contours的层级信息;     (8)maxLevel: 绘制轮廓的最大等级。如果等级为0,绘制单独的轮廓。如果为1,绘制轮廓及在其后的相同的级别下轮廓。如果等级为2,绘制所有同级轮廓及所有低一级轮廓,诸此种种。如果值为负数,函数不绘制同级轮廓,但会升序绘制直到级别为abs(max_level)-1的子轮廓; 。

    (9)offset:照给出的偏移量移动每一个轮廓点坐标.当轮廓是从某些感兴趣区域(ROI)中提取的然后需要在运算中考虑ROI偏移量时,将会用到这个参数.

以上定义摘自该篇博客: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
#include<opencv2/opencv.hpp>
using namespace cv;
using namespace std;
 
int value = 50;
Mat src, dst, canny_img;
void callback( int , void *);
int main( int arc, char ** argv)
{
  src = imread( "2.jpg" );
  namedWindow( "src" ,CV_WINDOW_AUTOSIZE);
  imshow( "src" , src);
  cvtColor(src, src, CV_BGR2GRAY);
 
  namedWindow( "output" , CV_WINDOW_AUTOSIZE);
  createTrackbar( "threshold" , "output" , &value, 255, callback);
  callback(0, 0);
  waitKey(0);
  return 0;
}
void callback( int , void *) {
  Canny(src, canny_img, value, 2 * value);
  imshow( "canny" , canny_img);
  vector<vector<Point>>contours;
  vector<Vec4i>hierarchy;
  findContours(canny_img, contours, hierarchy, RETR_EXTERNAL, CHAIN_APPROX_SIMPLE,Point(0,0));
 
  dst = Mat::zeros(src.size(), CV_8UC3);
  RNG rng(1);
  for ( int i = 0; i < contours.size(); i++) {
  Scalar color = Scalar(rng.uniform(0, 255), rng.uniform(0, 255), rng.uniform(0, 255));
  drawContours(dst, contours, i, color, 2, 8, hierarchy, 0, Point(0, 0));
  }
  imshow( "output" , dst);
}

运行结果如下:

Opencv实现轮廓提取功能

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

原文链接:https://blog.csdn.net/qq_24946843/article/details/82527492 。

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

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