【OpenCV入门指南】第六篇 轮廓检测 下

《OpenCV入门指南》系列文章地址:http://blog.csdn.net/morewindows/article/category/863841

上一篇《【OpenCV入门指南】第五篇轮廓检测上》介绍了cvFindContours函数和cvDrawContours函数,并作了一个简单的使用示范。本篇将展示一个实例,让大家对轮廓检测有个更加深入的认识。

代码如下:

//图像的轮廓检测下
//By MoreWindows (http://blog.csdn.net/MoreWindows)
#include <opencv2/opencv.hpp>
using namespace std;
#pragma comment(linker, "/subsystem:\"windows\" /entry:\"mainCRTStartup\"")
IplImage *g_pGrayImage = NULL;
const char *pstrWindowsBinaryTitle = "二值图(http://blog.csdn.net/MoreWindows)";
const char *pstrWindowsOutLineTitle = "轮廓图(http://blog.csdn.net/MoreWindows)";
CvSeq *g_pcvSeq = NULL;

void on_trackbar(int pos)
{
	// 转为二值图
	IplImage *pBinaryImage = cvCreateImage(cvGetSize(g_pGrayImage), IPL_DEPTH_8U, 1);
	cvThreshold(g_pGrayImage, pBinaryImage, pos, 255, CV_THRESH_BINARY);
	// 显示二值图
	cvShowImage(pstrWindowsBinaryTitle, pBinaryImage);

	CvMemStorage* cvMStorage = cvCreateMemStorage();
	// 检索轮廓并返回检测到的轮廓的个数
	cvFindContours(pBinaryImage,cvMStorage, &g_pcvSeq);

	IplImage *pOutlineImage = cvCreateImage(cvGetSize(g_pGrayImage), IPL_DEPTH_8U, 3);
	int _levels = 5;
	cvZero(pOutlineImage);
	cvDrawContours(pOutlineImage, g_pcvSeq, CV_RGB(255,0,0), CV_RGB(0,255,0), _levels);
	cvShowImage(pstrWindowsOutLineTitle, pOutlineImage);

	cvReleaseMemStorage(&cvMStorage);
	cvReleaseImage(&pBinaryImage);
	cvReleaseImage(&pOutlineImage);
}

int main( int argc, char** argv )
{
	const char *pstrWindowsSrcTitle = "原图(http://blog.csdn.net/MoreWindows)";
	const char *pstrWindowsToolBarName = "二值化";

	// 从文件中加载原图
	IplImage *pSrcImage = cvLoadImage("003.jpg", CV_LOAD_IMAGE_UNCHANGED);
	// 显示原图
	cvNamedWindow(pstrWindowsSrcTitle, CV_WINDOW_AUTOSIZE);
	cvShowImage(pstrWindowsSrcTitle, pSrcImage);

	// 转为灰度图
	g_pGrayImage =  cvCreateImage(cvGetSize(pSrcImage), IPL_DEPTH_8U, 1);
	cvCvtColor(pSrcImage, g_pGrayImage, CV_BGR2GRAY);

    // 创建二值图和轮廓图窗口
	cvNamedWindow(pstrWindowsBinaryTitle, CV_WINDOW_AUTOSIZE);
	cvNamedWindow(pstrWindowsOutLineTitle, CV_WINDOW_AUTOSIZE);

	// 滑动条
	int nThreshold = 0;
	cvCreateTrackbar(pstrWindowsToolBarName, pstrWindowsBinaryTitle, &nThreshold, 254, on_trackbar);

	on_trackbar(1);

	cvWaitKey(0);

	cvDestroyWindow(pstrWindowsSrcTitle);
	cvDestroyWindow(pstrWindowsBinaryTitle);
	cvDestroyWindow(pstrWindowsOutLineTitle);
	cvReleaseImage(&pSrcImage);
	cvReleaseImage(&g_pGrayImage);
	return 0;
}

程序运行结果如下所示:

可以明显看出,由于图像的二值化处理只是根据图像中单个像素的值来决定,因此这种最简单轮廓检测所产生的结果和人眼观测的实际感觉肯定是有比较大的区别的。

轮廓检测另外还有一个重要的函数cvApproxPoly,它的函数原型如下所示

CVAPI(CvSeq*)  cvApproxPoly(

const void* src_seq,

int header_size,

CvMemStorage* storage,

int method,

double parameter,

int parameter2 CV_DEFAULT(0)

);

由于篇幅问题,对于cvApproxPoly函数就不细讲了,有兴趣的读者可以参考下面这一篇博客:http://blog.csdn.net/bruce_zeng/article/details/8074253

《OpenCV入门指南》系列文章地址:http://blog.csdn.net/morewindows/article/category/863841

转载请标明出处,原文地址:http://blog.csdn.net/morewindows/article/details/8253174

欢迎关注微博:http://weibo.com/MoreWindows

再分享一下我老师大神的人工智能教程吧。零基础!通俗易懂!风趣幽默!希望你也加入到我们人工智能的队伍中来!https://www.cnblogs.com/captainbed

原文地址:https://www.cnblogs.com/heishanglaoyao/p/10147937.html

时间: 2024-08-24 20:08:27

【OpenCV入门指南】第六篇 轮廓检测 下的相关文章

OpenCV入门笔记(六) 轮廓检测(Detect Contours)

轮廓(Contours),指的是有相同颜色或者密度,连接所有连续点的一条曲线.检测轮廓的工作对形状分析和物体检测与识别都非常有用. 在轮廓检测之前,首先要对图片进行二值化或者Canny边缘检测.在OpenCV中,寻找的物体是白色的,而背景必须是黑色的,因此图片预处理时必须保证这一点. cv2.findContours函数 Python版示例如下,也可以参考[OpenCV-Python教程(11.轮廓检测)][Contours : Getting Started] contours, hierar

【OpenCV入门指南】第一篇 安装OpenCV

[OpenCV第一篇]安装OpenCV 本篇主要介绍怎样下载OpenCV安装程序,怎样在VS2008下安装配置OpenCV,文章最后还介绍了一个使用OpenCV的简单小样例. <OpenCV入门指南>系列文章地址:http://blog.csdn.net/morewindows/article/category/1291764 一.OpenCV的下载 能够到http://www.opencv.org.cn/index.php/Download,然后选一个较新版本号下载.我下的是V2.3.1版本

【OpenCV入门指南】第二篇 缩放图像

[OpenCV入门指南]第二篇 缩放图像 上一篇<[OpenCV入门指南]第一篇安装OpenCV>讲解了如何在VS2008下安装和配置OpenCV,本篇将介绍使用OpenCV来缩放图片.首先介绍几个关键函数--cvResize和cvCreateImage <OpenCV入门指南>系列文章地址:http://blog.csdn.net/morewindows/article/category/1291764 一. 主要函数介绍 1.1 cvResize 函数功能:图像大小变换 函数原

【OpenCV入门指南】第十三篇 人脸检测

[OpenCV入门指南]第十三篇 人脸检测 本篇介绍图像处理与模式识别中最热门的一个领域--人脸检测(人脸识别).人脸检测可以说是学术界的宠儿,在不少EI,SCI高级别论文都能看到它的身影.甚至很多高校学生的毕业设计都会涉及到人脸检测.当然人脸检测的巨大实用价值也让很多公司纷纷关注,很多公司都拥有这方面的专利或是开发商业产品出售. 在OpenCV中,人脸检测也是其热门应用之一.在OpenCV的特征检测专题就详细介绍了人脸检测的原理--通过Haar特征来识别是否为人脸.Haar特征检测原理与Haa

【OpenCV入门指南】第七篇 线段检测与圆检测

[OpenCV入门指南]第七篇 线段检测与圆检测 在<[OpenCV入门指南]第五篇轮廓检测上>与<[OpenCV入门指南]第六篇轮廓检测下>讲解了OpenCV的轮廓检测.本篇将讲解在OpenCV中使用线段检测与圆检测. 线段检测与圆检测主要运用Hough变换,Hough变换是一种利用图像的全局特征将特定形状的边缘连接起来,形成连续平滑边缘的一种方法.它通过将源图像上的点影射到用于累加的参数空间,实现对已知解析式曲线进行识别. 在OpenCV编程中,线段检测和圆检测已经封装成函数了

【OpenCV入门指南】第四篇 图像的二值化

[OpenCV入门指南]第四篇 图像的二值化 在上一篇<[OpenCV入门指南]第三篇Canny边缘检测>中介绍了使用Canny算子对图像进行边缘检测.与边缘检测相比,轮廓检测有时能更好的反映图像的内容.而要对图像进行轮廓检测,则必须要先对图像进行二值化,图像的二值化就是将图像上的像素点的灰度值设置为0或255,这样将使整个图像呈现出明显的黑白效果.在数字图像处理中,二值图像占有非常重要的地位,图像的二值化使图像中数据量大为减少,从而能凸显出目标的轮廓. <OpenCV入门指南>系

【OpenCV入门指南】第八篇 灰度直方图

直方图(Histogram)又称柱状图.质量分布图,是一种统计报告图.直方图由一系列高度不等的纵向条纹或线段表示数据分布的情况.一般用横轴表示数据类型,纵轴表示分布情况.在图像处理上,直方图是图像信息统计的有力工具. 灰度直方图是指对图像的灰度信息进行统计,我们知道灰度图在图像处理中应用非常广泛,在前面的<OpenCV第三篇Canny边缘检测>.<OpenCV第五篇轮廓检测上>.<OpenCV第六篇轮廓检测下>均能找到灰度图的用武之地.因此灰度直方图具有较高的实用价值.

opencv入门指南(转载)

转载链接:http://blog.csdn.net/morewindows/article/details/8426318 网上的总结的一些用openncv的库来做的事: 下面列出OpenCV入门指南系列目录,以方便大家查看: 文章链接:http://blog.csdn.net/morewindows/article/details/8426318 下面这些链接在文章末尾: 1.<[OpenCV入门指南]第一篇安装OpenCV> 2.<[OpenCV入门指南]第二篇缩放图像> 3.

React-Native入门指南——第4篇react-native布局实战(二)

React-Native入门指南 github:https://github.com/vczero/react-native-lession React-Native:用JavaScript开发你的原生应用,释放Native的UI体验,体验 Hybird开发效率. 最近一个星期写的文章如下,链接是github page的,其实也可以在系列博客找到相应文章: 第1篇hello react-native 第2篇认识代码结构 第3篇css和布局 第4篇学会react-native布局(一) 第4篇re