opencv查找并绘制轮廓

一个轮廓一般对应一系列的点,在opencv中,可以使用findContours()函数从二值图像素中查找轮廓

findContours经常与drawContours配合使用:使用findContours()函数检测到图像轮廓后,便可以用drawContours()函数将检测到的轮廓绘制出来。

#include<opencv2/core.hpp>
#include<opencv2/highgui.hpp>
#include<opencv2/imgproc.hpp>
#include<iostream>
using namespace cv;
using namespace std;
int main()
{
    
    
    Mat src=imread("1.jpg");
    Mat src_gray,dst,abs_x;
    imshow("原图",src);

    //图像预处理
    cvtColor(src,src_gray,COLOR_RGB2GRAY);
    GaussianBlur(src_gray,dst,Size(5,5),10,10);
    Canny(dst,dst,150,100,3);

    vector<vector<Point>> contours;
    vector<Vec4i> hierarcy;
    findContours(dst, contours, hierarcy, RETR_EXTERNAL, CHAIN_APPROX_SIMPLE);
    drawContours(src,contours,-1,Scalar(0,0,255));//第三个参数-1表示绘制所有轮廓

    imshow("效果图",src);
    waitKey(0);

    return 0;
}

findContours函数解析

findContours(dst, contours, hierarcy, RETR_EXTERNAL, CHAIN_APPROX_SIMPLE);
  • 第四个参数(RETR_EXTERNAL):轮廓检索模式,取值如下表所示
标识符 含义
RETR_EXTERNAL 表示只检测最外层轮廓,对所有轮廓,设置hierarcy[i][2]=hierarcy[i][3]=-1
RETR_LIST 提取所有轮廓,并且放置在list中,检测的轮廓不建立等级关系
RETR_CCOMP 提取所有轮廓,并且将其组织为双层结构:顶层为连通域的外围边界,次层为孔的内层边界
RETR_TREE 提取所有轮廓,并重新建立网状的轮廓结构
  • 第五个参数(CHAIN_APPROX_SIMPLE):轮廓近似办法,下表为轮廓可选的近似办法
标识符 含义
CHAIN_APPROX_NONE 获取每个轮廓的每个像素,相邻的两个点的像素位置不超过1,即max(abs(x1-x2),abs(y2-y1))==1
CHAIN_APPROX_SIMPLE 压缩水平方向,垂直方向,对角线方向的元素,只保留方向的终点坐标,例如一个矩形轮廓只需4个点来保存轮廓信息
CHAIN_APPROX_TC89_L1,CHAIN_APPROX_TC89_KCOS 使用Teh-Chinl链逼近算法中的一个

猜你喜欢

转载自blog.csdn.net/seniorc/article/details/112342674
今日推荐