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链逼近算法中的一个
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值