【OpenCV入门指南】第五篇轮廓检测 下
上一篇《【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
【OpenCV入门指南】第五篇轮廓检测 下相关推荐
- 【OpenCV入门指南】第五篇 轮廓检测 上
<[OpenCV入门指南]第三篇Canny边缘检测>中介绍了边缘检测,本篇介绍轮廓检测,轮廓检测的原理通俗的说就是掏空内部点,比如原图中有3*3的矩形点.那么就可以将中间的那一点去掉. 在 ...
- 【OpenCV入门指南】第九篇 灰度直方图均衡化
<OpenCV入门指南>系列文章地址: http://blog.csdn.net/morewindows/article/category/1291764 转载请标明出处,原文地址:htt ...
- 【OpenCV入门指南】第十三篇 人脸检测
原文出处:http://blog.csdn.net/MoreWindows/article/details/8426318#t2 本篇介绍图像处理与模式识别中最热门的一个领域--人脸检测(人脸识别). ...
- 【OpenCV入门指南】第十篇 彩色直方图均衡化
上一篇<OpenCV第十篇灰度直方图均衡化>介绍了灰度图像的直方图均衡化,实际生活中,肯定还是彩色图像用的最多,因此本篇介绍对彩色图像进行直方图均衡化.这样可以让大家直方图均衡化对图像增强 ...
- 智汀家庭云入门指南(五):如何创建智能场景
对于智能家居应该都有所听说,例如常见的HomeKit.Aqara.homeassistant等等智能家居生态.尤其HomeKit因其独特的优秀体验和出身名门而成为人们选择智能家居追求接入的生态之一,但 ...
- OpenCV(六)之图像轮廓检测
OpenCV(六)之图像轮廓检测 Contour detection系列 Contour detection-图像金字塔 图像金字塔-高斯金字塔 图像金字塔-拉普拉斯金字塔 Contour detec ...
- agx 安装ros opencv_史上最全的OpenCV入门教程!这篇够你学习半个月了!万字长文入门...
一.Python OpenCV 入门 欢迎阅读系列教程,内容涵盖 OpenCV,它是一个图像和视频处理库,包含 C ++,C,Python 和 Java 的绑定. OpenCV 用于各种图像和视频分析 ...
- 史上最全的OpenCV入门教程!这篇够你学习半个月了!万字长文入门
推荐下我自己建的人工智能Python学习群:[809160367],群里有我整理的一份关于pytorch.python基础,图像处理opencv\自然语言处理.机器学习.数学基础等资源库,想学习人工智 ...
- python+OpenCV图像处理(十一)图像轮廓检测
图像轮廓检测 (一)检测轮廓 在OpenCV-python中,使用cv2.findContours()函数来对图像进行轮廓检测. 返回三个值:image,contours,hierarchy cont ...
最新文章
- 浅显易懂 Makefile 入门 (01)— 什么是Makefile、为什么要用Makefile、Makefile规则、Makefile流程如何实现增量编译
- Arrays.asList问题
- 【Under-the-hood-ReactJS-Part13】源码解读
- Linux下 jenkins的安装
- 查看显卡利用率 python_既然大家都说装了win10,就不用鲁大师监测显卡温度,为什么呢?...
- 每日程序C语言41-带头结点的头插法创建链表
- PHP命名空间学习笔记
- linux字符驱动之自动创建设备节点
- jQuery子页面刷新父页面--局部刷新+整体刷新 [转]
- keil5ARM编译器改字体大小和颜色的方法
- 微课|《Python编程基础与案例集锦(中学版)》第4章例题讲解(2)
- 2017《Java技术》预备作业 杨阳
- bio linux 创建_Linux设备驱动--块设备之概念和框架以及相关结构体
- java sftp_JAVA 实现SFTP服务器功能
- 【代码优化】使用enum代替int常量
- FileUpload1 在部分浏览器中实现多选
- 微软发布了个BT软件
- [战略]对空间_日志风格_日志分类_日志标记_的整体说明
- 双十一游戏发烧友都在推荐的电子竞技显示器
- Android 人脸解锁源码剖析