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;
}
*查找轮廓, 绘制轮廓.
*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;
}
相关文章推荐
- opencv3阀值化下的轮廓查找与绘制
- OpenCV_轮廓的查找、表达、绘制、特性及匹配
- opencv开发笔记(十二):查找并绘制轮廓
- Opencv(Python) 教程-轮廓(1)查找与绘制轮廓
- OpenCV_轮廓的查找、表达、绘制、特性及匹配
- 【opencv】Opencv(Python) 教程-轮廓(1)查找与绘制轮廓
- OpenCV_轮廓的查找、表达、绘制、特性及匹配
- OpenCV_轮廓的查找、表达、绘制、特性及匹配
- Opencv学习之查找并绘制轮廓
- OpenCV_轮廓的查找、表达、绘制、特性及匹配
- 【OpenCV3】图像轮廓查找与绘制——cv::findContours()与cv::drawContours()详解
- OpenCV_轮廓的查找、表达、绘制、特性及匹配
- 【OpenCV学习笔记】二十五、轮廓查找与绘制(二)访问轮廓中每个点
- OpenCV_轮廓的查找、表达、绘制、特性及匹配
- OpenCV_轮廓的查找、表达、绘制、特性及匹配
- OpenCV:查找并绘制图像的轮廓
- opencv学习篇(8)轮廓的查找、表达、绘制、特性及匹配
- opencv之轮廓的查找与绘制(二)
- OpenCV_轮廓的查找、表达、绘制、特性及匹配
- opencv 查找并绘制轮廓