findContours 函数 hierarchy轮廓的层级关系终于弄懂了

     本来就是云里雾里的,最近在写那个二维码的识别程序彻底把我弄崩溃了,决定好好弄懂轮廓的层级关系,前天一吧友推荐了一个相关资料,今天上午看了好一会,终于通过这个资料弄懂了。资料在这里:

http://docs.opencv.org/3.1.0/d9/d8b/tutorial_py_contours_hierarchy.html

但是先说好,资料里说的跟我实际做的是不一样的,我的是opencv2.4.9,跟他说的轮廓层级关系的定义还是大不相同的,用opencv的朋友看我写的就行了,要不容易混啦,好啦,不说了,老规矩,直接上代码

#include "opencv2/highgui/highgui.hpp"
#include "opencv2/imgproc/imgproc.hpp"
#include <iostream>
#include <stdio.h>
#include <stdlib.h>

using namespace cv;
using namespace std;

Mat src; Mat src_gray;
RNG rng(12345);



int main( int argc, char** argv[] )
{

  src = imread( "3模板.jpg", 1 );
  imshow("原图",src);

  cvtColor( src, src_gray, CV_BGR2GRAY );
  blur( src_gray, src_gray, Size(3,3) );

  Mat threshold_output;
  vector<vector<Point> > contours;
  vector<Vec4i> hierarchy;

  threshold( src_gray, threshold_output, 245, 255, 1 ); // 注意!!这里用的是模式1,

  findContours( threshold_output, contours, hierarchy, CV_RETR_TREE, CHAIN_APPROX_NONE, Point(0, 0) );//CHAIN_APPROX_NONE全体,CV_CHAIN_APPROX_SIMPLE,,,RETR_TREE

    Scalar color = Scalar(211,55,155 );


	//hierarchy[3][3]表示轮廓3的父级轮廓    hierarchy[ hierarchy[3][3]][3]表示轮廓3父级轮廓的父级轮廓 
	//hierarchy[3][0]、hierarchy[3][1]、hierarchy[3][2]、hierarchy[3][3]分别表示轮廓3的 前一个、后一个、子级、父级轮廓
	//只有轮廓8才有同级的前后轮廓,即hierarchy[8][0]和hierarchy[8][1]
    drawContours( src, contours,hierarchy[8][1], color, 2, 8, vector<Vec4i>(), 0, Point() );
 

  printf("轮廓数%d\n", contours.size());
  imshow( "Contours", src );

  waitKey(0);
  return(0);
}
  

注意findContours函数这里用的是

CV_RETR_TREE

表示轮廓建立层级关系,这里几个参数的区别就不说了,网上很多资料已经说得很清楚了

  hierarchy[8][1]表示轮廓8的下一个轮廓,drawContours( src, contours,hierarchy[8][1], color, 2, 8, vector<Vec4i>(), 0, Point() );在这个语句里面     hierarchy[8][1]等同意于1, hierarchy[8][0] 等同于9,,因为轮廓1和轮廓9都是轮廓8的同级轮廓


猜你喜欢

转载自blog.csdn.net/guanyonglai/article/details/60140228