ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

OpenCV轮廓发现

2022-03-02 19:01:11  阅读:196  来源: 互联网

标签:gray Point int OpenCV contours 发现 轮廓 取值


一、概述

  案例:使用OpenCV的findContours发现轮廓并根据轮廓的面积过滤轮廓。

  发现轮廓函数:

发现轮廓:
findContours( InputOutputArray binImg, // 输入图像,非0的像素被看成1,0的像素值保持不变,8-bit OutputArrayOfArrays contours,// 全部发现的轮廓对象 OutputArray, hierachy// 图该的拓扑结构,可选,该轮廓发现算法正是基于图像拓扑结构实现。 int mode, // 轮廓返回的模式 int method,// 发现方法 Point offset=Point()// 轮廓像素的位移,默认(0, 0)没有位移 )

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


定义轮廓的搜索模式:
  取值一:CHAIN_APPROX_NONE 保存物体边界上所有连续的轮廓点到contours向量内
  取值二:CHAIN_APPROX_SIMPLE 仅保存轮廓的拐点信息,把所有轮廓拐点处的点保存入contours向量内,拐点与拐点之间直线段上的信息点不予保留
  取值三和四:CHAIN_APPROX_TC89_L1,CHAIN_APPROX_TC89_KCOS使用teh-Chinl chain 近似算法

drawContours(
InputOutputArray  binImg, // 输出图像
 OutputArrayOfArrays  contours,//  全部发现的轮廓对象
Int contourIdx// 轮廓索引号
const Scalar & color,// 绘制时候颜色
int  thickness,// 绘制线宽
int  lineType ,// 线的类型LINE_8
InputArray hierarchy,// 拓扑结构图
int maxlevel,// 最大层数, 0只绘制当前的,1表示绘制绘制当前及其内嵌的轮廓
Point offset=Point()// 轮廓位移,可选

  发现轮廓步骤:

    1.加载图像

    2.将图像转为灰度图

    3.执行边缘检测

    4.执行轮廓发现

    5.绘制轮廓

    6.显示绘制后的图片

 

二、代码示例

 Mat src = imread(filePath);
    if(src.empty()){
        return;
    }
    imshow("src",src);
    Mat gray;
    cvtColor(src,gray,COLOR_BGR2GRAY);
    imshow("gray",gray);
    //执行边缘 检测
    Canny(gray,gray,50,100,3,false);
    imshow("canny",gray);
    //发现轮廓
    vector<vector<Point>> contours;
    vector<Vec4i> hierarchy;
    findContours(gray,contours,hierarchy,RETR_TREE,CHAIN_APPROX_SIMPLE,Point(0,0));
    //绘制轮廓
    RNG rng;
    Mat drawImg=Mat::zeros(gray.size(),CV_8UC3);
    for(int i=0;i<contours.size();i++){
        double area = contourArea(contours[i],false);
        if(area>100){//根据轮廓的面积过滤不需要的轮廓
            Scalar color = Scalar(rng.uniform(0,255),rng.uniform(0,255),rng.uniform(0,255));
            drawContours(drawImg,contours,i,color,2,LINE_8,hierarchy,0,Point(0,0));
        }

    }
    imshow("drawImg",drawImg);

 

 

三、演示图片

 

 

 

 

 

标签:gray,Point,int,OpenCV,contours,发现,轮廓,取值
来源: https://www.cnblogs.com/tony-yang-flutter/p/15956586.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有