关于findContours的轮廓层次hierichy的一些认识

    下面是源代码,包括从网上找到的一些加上自己的一些修改, 此处仅仅探究了CV_RETR_CCOMP(只有内外两层轮廓)情况下,CV_CHAIN_APPROX_NONE保存所有点的时候的状况,由此可以大致看出findContours的hierichy的原理。

    我把原图和跑完程序后得到了20个轮廓及其次序和hierichy关系(可以跑一遍得到)保存在附加文件中。(因为不会上传图片,所以只好保存在附件中),只上传了部分,想要全部的可以自己跑一遍程序。

    从中可以看出,只有内外两层轮廓的情况下,可以把每两个可以组成内外轮廓的算一组,比如1,2两幅图是内外(父子)关系,3,4这两幅图是内外关系,5,6是内外关系。那么3的前一副图是1而不是2,2只是1的父轮廓,且2并没有前一幅和后一幅的概念。同理3的后一幅是5而不是4,4是他的父轮廓。4也没有前后轮廓的概念。


#include "stdafx.h"
#include"opencv2/opencv.hpp"
#include"opencv2/highgui/highgui.hpp"




using namespace cv;


int _tmain(int argc, _TCHAR* argv[])
{
Mat src = imread("C:\\Users\\one piece\\Desktop\\2.png");
Mat output,edges,result;
vector<vector<Point>>contours;
vector<Vec4i>hierichy;
blur(src, output, Size(3,3));
Canny(output, edges, 100, 200, 3);
findContours(edges, contours, hierichy, CV_RETR_CCOMP, CV_CHAIN_APPROX_NONE, Point());
Mat Pointcontours=Mat::zeros(src.size(), CV_8UC1);
result = Mat::zeros(src.size(), CV_8UC1);
for (int i = 0; i < contours.size(); i++)
{
for (int j = 0; j < contours[i].size(); j++)
{
Point P = Point(contours[i][j].x, contours[i][j].y);
Pointcontours.at<uchar>(P) = 255;
}


//char name[256];
std::cout << "向量hierichy的第" << i << "个元素内容是" << std::endl << hierichy[i] << std::endl;
    
//drawContours(result, contours, i, Scalar(255, 0, 0), 1, 8, hierichy, 0);


}
char sz[256];
for (int i = 0; i < contours.size(); i++)
{
drawContours(result, contours, i, Scalar(255, 0, 0), 1, 8, hierichy, 0);


//imshow("Pointcontours", Pointcontours);
//imshow("contours", result);
//waitKey(0);

//char sz[256] = "C:\\Users\\one piece\\Desktop\\图片\\";
sprintf_s(sz, "C:\\Users\\one piece\\Desktop\\图片1\\%d.jpg", i);


imwrite(sz, result);
}
//waitKey(0);
return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值