您的位置:首页 > 运维架构

opencv 查找轮廓 绘制轮廓

2012-04-03 19:43 477 查看
/*

*查找轮廓, 绘制轮廓.

*1)cvFindConturs 的输入必须是8bit单通道二值化图像.

*2)当block值足够大时,cvAdaptThreshold能够很好的阈值化.block_size必须为奇数!

*3)开闭运算不需要临时图像

*4)cvFindContours会涂改输入图像

*

*Date: 2012/4/3

*Author: Rocky Chen

*/

#include "stdio.h"

#include "stdafx.h"

#include "highgui.h"

#include <cv.h>

#include <cxcore.h>

#include "iostream"

#include "math.h"

#include <ctype.h>

using namespace std;

using namespace cv;

int main(int argc, char** argv)

{

//窗口,图像文件初始化

const char* file = "D:\\C++ Projects\\OpenCV_project\\test_img\\right14.jpg";

// const char* file = "D:\\C++ Projects\\OpenCV_project\\img_video\\airplane.png";

// const char* file = "D:\\C++ Projects\\OpenCV_project\\img_video\\rice.png";

const char* woriginal = "原图像";

const char* wadapt_open = "自适应阈值开运算";

const char* wcontours = "绘制找到轮廓";

cvNamedWindow(woriginal);

cvNamedWindow(wadapt_open);

cvNamedWindow(wcontours);

IplImage* src = cvLoadImage(file); //源图像需要转换为单通道

assert(src != NULL);

IplImage* img_gray = cvCreateImage(cvGetSize(src), 8,1); //需要二值化的单通道图像

cvCvtColor(src, img_gray, CV_BGR2GRAY);

assert(img_gray != NULL);

IplImage* img_binary = cvCloneImage(img_gray); //自适应二值化之后的图像

assert(img_binary != NULL);

IplImage* img_contours = cvCloneImage(src); // 输出轮廓的图像

assert(img_contours != NULL);

cvZero( img_contours);

//二阈值化

double max_val = 255; //阈值化后的最大值

cvAdaptiveThreshold(img_gray, img_gray, max_val,0,0,101,5); //当block值足够大时,能够很好的阈值化.block_size必须为奇数!

cvMorphologyEx(img_gray,img_binary,NULL, NULL,CV_MOP_OPEN);//二值化图像开运算,去噪点,开闭运算不需要临时图像

//查找轮廓,绘制轮廓

CvMemStorage* storage = cvCreateMemStorage();

CvSeq* contours = NULL; //存储轮廓的序列

IplImage* img_binary_open = cvCloneImage(img_binary); //复制轮廓检测的图像,因为cvFindContours会涂改输入图像

cvFindContours(img_binary, //轮廓存于contours序列中

storage,

&contours,

sizeof(CvContour));

if(contours != NULL) //绘制轮廓

cvDrawContours(img_contours,

contours,

CV_RGB(255,255,255), //外轮廓颜色

CV_RGB(0,255,0), //孔的颜色

100

);

cvShowImage(woriginal, src);

cvShowImage(wadapt_open, img_binary_open);

cvShowImage(wcontours, img_contours);

cvWaitKey();

cvReleaseImage(&img_gray);

cvDestroyAllWindows();

return 0;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: