OpenCV图像轮廓检测
轮廓检测:
轮廓检测的原理通俗的说就是掏空内部点,比如原图中有3*3的矩形点。那么就可以将中间的那一点去掉。
一.关键函数
1.1 cvFindContours
函数功能:对图像进行轮廓检测,这个函数将生成一条链表以保存检测出的各个轮廓信息,并传出指向这条链表表头的指针。
函数原型:
int cvFindContours(
CvArr* image, 第一个参数表示输入图像,必须为一个8位的二值图像
CvMemStorage* storage, 第二参数表示存储轮廓的容器。为CvMemStorage类型,定义在OpenCV的\core\types_c.h中
CvSeq** first_contour, 第三个参数为输出参数,这个参数将指向用来存储轮廓信息的链表表头
int header_size=sizeof(CvContour), 第四个参数表示存储轮廓链表的表头大小,当第六个参数传入CV_CHAIN_CODE时,
要设置成sizeof(CvChain),其它情况统一设置成sizeof(CvContour)。
int mode= CV_RETR_LIST, 第五个参数为轮廓检测的模式,有如下取值:
CV_RETR_EXTERNAL : 只检索最外面的轮廓;
CV_RETR_LIST: 检索所有的轮廓,并将其保存到一条链表当中;
CV_RETR_CCOMP: 检索所有的轮廓,并将他们组织为两层:顶层是各部分的外部边界,第二层是空洞的边界;
CV_RETR_TREE: 检索所有的轮廓,并重构嵌套轮廓的整个层次;
int method= CV_CHAIN_APPROX_SIMPLE, 第六个参数用来表示轮廓边缘的近似方法的,常用值如下所示:
CV_CHAIN_CODE: 以Freeman链码的方式输出轮廓,所有其他方法输出多边形(顶点的序列)。
CV_CHAIN_APPROX_SIMPLE: 压缩水平的、垂直的和斜的部分,也就是,函数只保留他们的终点部分。
CvPoint offset=cvPoint(0,0) 第七个参数表示偏移量,比如你要从图像的(100, 0)开始进行轮廓检测,那么就传入(100, 0)。
);
--->使用cvFindContours函数能检测出图像的轮廓,将轮廓绘制出来则需要另一函数——cvDrawContours来配合了。下面介绍cvDrawContours函数。
1.2 cvDrawContours
函数功能:在图像上绘制外部和内部轮廓
函数原型:
void cvDrawContours(
CvArr *img, 第一个参数表示输入图像,函数将在这张图像上绘制轮廓。
CvSeq* contour, 第二个参数表示指向轮廓链表的指针
CvScalar external_color,
CvScalar hole_color, 第三个参数和第四个参数表示颜色,绘制时会根据轮廓的层次来交替使用这二种颜色
int max_level, 第五个参数表示绘制轮廓的最大层数,如果是0,只绘制contour;如果是1,追加绘制和
contour同层的所有轮廓;如果是2,追加绘制比contour低一层的轮廓,以此类推;如果
值是负值,则函数并不绘制contour后的轮廓,但是将画出其子轮廓,一直到abs(max_level) - 1层。
int thickness=1, 第六个参数表示轮廓线的宽度,如果为CV_FILLED则会填充轮廓内部
int line_type=8, 第七个参数表示轮廓线的类型。
CvPoint offset=cvPoint(0,0) 第八个参数表示偏移量,如果传入(10,20),那绘制将从图像的(10,20)处开始
);
// ConsoleApplication1.cpp : 定义控制台应用程序的入口点。
// #include "stdafx.h"
#include "iostream"
using namespace std;
#include "opencv2/opencv.hpp" const char *pImagePath = "E:/C_VC_code/Text_Photo/girl005.jpg";
const char *pWindowsTitle = "原图";
const char *pWindowsGrayTitle = "灰度图";
const char *pWindowsBinaryTitle = "二值图";
const char *pWindowsOutLineTitle = "轮廓图";
const char *pWindowsToolBar = "阀值";
IplImage *pImage=NULL,*pGrayImage, *pBinaryImage, *pOutLineImage;
CvMemStorage *pMemStorage;
CvSeq *pSeq;
int nLevels = ;
void functionCallback(int pos)
{
cvThreshold(pGrayImage, pBinaryImage, pos, , CV_THRESH_BINARY);
cvFindContours(pBinaryImage, pMemStorage, &pSeq ,sizeof(CvContour), CV_RETR_TREE,CV_CHAIN_APPROX_SIMPLE,cvPoint(,));
cvDrawContours(pOutLineImage, pSeq, CV_RGB(,,), CV_RGB(,,), nLevels, , );
cvShowImage(pWindowsBinaryTitle, pBinaryImage);
cvShowImage(pWindowsOutLineTitle, pOutLineImage);
}
void main()
{ //SourceImage turn to GrayImage pImage = cvLoadImage(pImagePath, CV_LOAD_IMAGE_UNCHANGED); pGrayImage = cvCreateImage(cvGetSize(pImage), IPL_DEPTH_8U, );
cvCvtColor(pImage, pGrayImage, CV_BGR2GRAY); //create window
cvNamedWindow(pWindowsTitle, CV_WINDOW_AUTOSIZE);
cvNamedWindow(pWindowsGrayTitle, CV_WINDOW_AUTOSIZE);
cvNamedWindow(pWindowsBinaryTitle, CV_WINDOW_AUTOSIZE);
cvNamedWindow(pWindowsOutLineTitle, CV_WINDOW_AUTOSIZE); //为二值图创建滑动条
int nPos = ;
cvCreateTrackbar(pWindowsToolBar,pWindowsBinaryTitle,&nPos,,functionCallback); //GrayImage turn into BinaryImage
pBinaryImage = cvCreateImage(cvGetSize(pGrayImage), IPL_DEPTH_8U, ); //检索轮廓并返回检测到的轮廓的个数
pMemStorage = cvCreateMemStorage();
pSeq = NULL; //Create and show OutLineImage
pOutLineImage = cvCreateImage(cvGetSize(pBinaryImage), IPL_DEPTH_8U, ); //填充成白色
cvRectangle(pOutLineImage, cvPoint(,),cvPoint(pImage->width,pImage->height), CV_RGB(,,), CV_FILLED);
cvDrawContours(pOutLineImage, pSeq, CV_RGB(,,), CV_RGB(,,), nLevels, ); cvShowImage(pWindowsTitle, pImage);
cvShowImage(pWindowsGrayTitle, pGrayImage);
cvShowImage(pWindowsBinaryTitle, pBinaryImage);
cvShowImage(pWindowsOutLineTitle, pOutLineImage); functionCallback(); //destroy object and release space
cvWaitKey();
cvDestroyWindow(pWindowsTitle);
cvDestroyWindow(pWindowsGrayTitle);
cvDestroyWindow(pWindowsBinaryTitle);
cvDestroyWindow(pWindowsOutLineTitle);
cvReleaseImage(&pImage);
cvReleaseImage(&pGrayImage);
cvReleaseImage(&pBinaryImage);
cvReleaseImage(&pOutLineImage); }
OpenCV图像轮廓检测的更多相关文章
- OpenCV—Python 轮廓检测 绘出矩形框(findContours\ boundingRect\rectangle
千万注意opencv的轮廓检测和边缘检测是两码事 本文链接:https://blog.csdn.net/wsp_1138886114/article/details/82945328 1 获取轮廓 O ...
- 第十七节,OpenCV(学习六)图像轮廓检测
1.检测轮廓 轮廓检测是图像处理中经常用到的,OpenCV-Python接口中使用cv2.findContours()函数查找检测物体的轮廓. cv2.findContours(image, mode ...
- OpenCV 矩形轮廓检测
转载请注明出处:http://blog.csdn.net/wangyaninglm/article/details/44151213, 来自:shiter编写程序的艺术 基础介绍 OpenCV里提取目 ...
- opencv 图像轮廓
图片解析: 原图: code: #include <opencv\cv.h> #include <opencv\highgui.h> #include <opencv\c ...
- OpenCV 闭合轮廓检测
这个好像是骨头什么的,但是要求轮廓闭合,于是对图片进行一下膨胀操作,再次检测轮廓就好了. // A closed contour.cpp : 定义控制台应用程序的入口点. // #include &q ...
- Python-OpenCV中的图像轮廓检测
目录 cv2.findContours() 主要记录Python-OpenCV中的cv2.findContours()方法:官方文档: cv2.findContours() 在二值图像中寻找图 ...
- opencv 图像阴影检测
参数说明: IplImage *workImg-当前全局变量,表示正在显示的图片. downleft, upright- 检测出的阴影部分矩形框的两个对角顶点. /****************** ...
- OpenCV: 图像连通域检测的递归算法
序言:清除链接边缘,可以使用数组进行递归运算; 连通域检测的递归算法是定义级别的检测算法,且是无优化和无语义失误的. 同样可用于寻找连通域 void ClearEdge(CvMat* MM,CvPoi ...
- OpenCV 轮廓检测
使用OpenCV可以对图像的轮廓进行检测.这是之前用过的代码,挺简单的,回顾一下.主要要进行以下2步操作: 1.cvThreshold():对图像进行二值化处理 2.cvFindContours(): ...
随机推荐
- git命令拾遗
要随时掌握工作区的状态,使用git status命令. 如果git status告诉你有文件被修改过,用git diff可以查看修改内容. HEAD指向的版本就是当前版本,因此,Git允许我们在版本的 ...
- 9月13日JavaScript语句循环(100以备奇偶数、100以内与7先关的数、100以内整数的和、10以内阶乘、乘法口诀、篮球弹起高度、64格子放东西)
3.循环 循环是操作某一个功能(执行某段代码). ①循环四要素: a 循环初始值 b 循环的条件 c 循环状态 d 循环体 ②for循环 a 穷举:把所有的可能性的都一一列出来. b 迭代:每次循环都 ...
- Android之帮助文档
F:\Electronic_Design\software\Android\Android_SDK_windows\adt-bundle-windows-x86-20131030\sdk\docs\r ...
- 第4章 jQuery的事件和动画(二)
二. jQuery中的动画 动画在前面几章案例中是回避不了的问题.此处结合一些简便的写法稍作系统的分析. 1. show()和hide()(1)介绍——不用过多的介绍了jQuery最基本的方法.本质是 ...
- windows命令关机
不知道为啥,远程连接的window服务器没有关机命令,感觉是不是管理员权限导致的,所以找了下用命令关机,如下 shutdown -s -t #5秒内关机 shutdown -r -t #5秒内重启
- js搜索输入关键词
function getInput(val,a){ var id = 'ser-key'; if(a=='focus'){ document.getElementById(id).value=''; ...
- struts+service+action+数据库
用户登录流程 1.jsp根据form表单中的action的login <form action="/test02/login" method="post&quo ...
- android自定义控件(4)-自定义水波纹效果
一.实现单击出现水波纹单圈效果: 照例来说,还是一个自定义控件,观察这个效果,发现应该需要重写onTouchEvent和onDraw方法,通过在onTouchEvent中获取触摸的坐标,然后以这个坐标 ...
- c# List AddRange
https://msdn.microsoft.com/zh-cn/library/z883w3dc(v=vs.80).aspx List 中会保留集合中元素的顺序. 如果新的 Count(当前 Cou ...
- 说说移动前端中 viewport (视口)
转载网络资源的文章:来源不详~~ 移动前端中常说的 viewport (视口)就是浏览器显示页面内容的屏幕区域.其中涉及几个重要概念是 dip ( device-independent pixel 设 ...