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