本范例主要介绍了如何提取轮廓和用一些形状描述符对轮廓进行表述,轮廓提取函数涉及到的参数很多,没有经常用到它的话,对参数的了解就不会太深刻,这里也按照本人搜索出来的一些资料进行总结,希望对大家有用。
1、代码实现
本代码实现了多个功能
创建了三个滑动条:
第一个滑动条表示状态描述符,分别表示为:
0:多边形近似
1:外接矩形
2:外接圆
3:力矩
第二个滑动条表示轮廓检测mode类型,分别表示为:
0:只检测出最外轮廓
1:检测出所有轮廓,并保持在list中,只有一层
2:检测出所有轮廓,并将它们组织成两层结构,顶层是外边界,第二层是孔边界。
3:检测出所有轮廓并且重新建立网状的轮廓结构
第三个滑动条表示层次
0:表示没有层次,输出所指定的轮廓
1:表示第一层,输出第一层的轮廓
2:表示第二层,输出第二层的轮廓
3:
……
#include "stdafx.h"
#include "opencv2/highgui/highgui.hpp"
#include "opencv2/imgproc/imgproc.hpp"
#include <iostream>
#include <stdio.h>
#include <stdlib.h>
using namespace cv;
using namespace std;
#define w 500
Mat src; Mat src_gray;
int hiararchyvalue ;
int choice;
int contoursmode;
int max_mode=3;
int max_hiararchy = 4;
int max_choice=3;
RNG rng(12345);
/// 函数声明
void thresh_callback(int, void* );
void contours_callback(int,void*);
/** @主函数 */
int main( int argc, char** argv )
{
int i, j;
/// 载入原图像, 返回3通道图像
// src = imread( "HappyFish.jpg", 1 );
src.zeros(cvSize(w,w),CV_8UC1);
IplImage* img = cvCreateImage( cvSize(w,w), 8, 1 );
cvZero( img );
for( i=0; i < 6; i++ )
{
int dx = (i%2)*250 - 30;
int dy = (i/2)*150;
CvScalar white = cvRealScalar(255);
CvScalar black = cvRealScalar(0);
if( i == 0 )
{
for( j = 0; j <= 10; j++ )
{
double angle = (j+5)*CV_PI/21;
cvLine(img, cvPoint(cvRound(dx+100+j*10-80*cos(angle)),
cvRound(dy+100-90*sin(angle))),
cvPoint(cvRound(dx+100+j*10-30*cos(angle)),
cvRound(dy+100-30*sin(angle))), white, 1, 8, 0);
}
}
cvEllipse( img, cvPoint(dx+150, dy+100), cvSize(100,70), 0, 0, 360, white, -1, 8, 0 );
cvEllipse( img, cvPoint(dx+115, dy+70), cvSize(30,20), 0, 0, 360, black, -1, 8, 0 );
cvEllipse( img, cvPoint(dx+185, dy+70), cvSize(30,20), 0, 0, 360, black, -1, 8, 0 );
cvEllipse( img, cvPoint(dx+115, dy+70), cvSize(15,15), 0, 0, 360, white, -1, 8, 0 );
cvEllipse( img, cvPoint(dx+185, dy+70), cvSize(15,15), 0, 0, 360, white, -1, 8, 0 );
cvEllipse( img, cvPoint(dx+115, dy+70), cvSize(5,5), 0, 0, 360, black, -1, 8, 0 );
cvEllipse( img, cvPoint(dx+185, dy+70), cvSize(5,5), 0, 0, 360, black, -1, 8, 0 );
cvEllipse( img, cvPoint(dx+150, dy+100), cvSize(10,5), 0, 0, 360, bl