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

来源:互联网 发布:javascript 矩阵库 编辑:程序博客网 时间:2024/05/19 15:25

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

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的同级轮廓


1 0
原创粉丝点击