opencv寻找轮廓
来源:互联网 发布:linux wc 统计行数 编辑:程序博客网 时间:2024/05/16 09:03
1. 一个轮廓一般对应一系列的点,也就是图像中的一条曲线,有多种方法来表示曲线,opencv中一般用序列来存储轮廓信息。函数cvFindContours()用来从二值图像中寻找轮廓,可以来自于边缘检测后的图像,也可以是二值化后的图像,cvFindContours()可以找到图像中的外围轮廓和内部的孔洞,函数原型如下:
第一个参数是输入图像,必须是8位的单通道的图像,所以输入的应该是二值图,下一个参数是内部存储器,找到的轮廓存储在里面,再下一个参数是一个CvSeq指针,headerSize是关于对象的信息,一般设置成sizeof(CvContour),最后两个参数是指定计算方法和如何计算。
mode表示检索的模式有四个选项:
CV_RETR_EXTERNAL:只检索最外面的轮廓;
CV_RETR_LIST:检索所有的轮廓,并将其放入list中;
CV_RETR_CCOMP:检索所有的轮廓,并将他们组织为两层:顶层是各部分的外部边界,第二层是空洞的边界;
CV_RETR_TREE:检索所有的轮廓,并重构嵌套轮廓的整个层次。
method表示边缘近似方法,有五个选项:
CV_CHAIN_CODE:以Freeman链码的方式输出轮廓,所有其他方法输出多边形(顶点的序列)。
CV_CHAIN_APPROX_NONE:将所有的连码点,转换成点。
CV_CHAIN_APPROX_SIMPLE:压缩水平的、垂直的和斜的部分,也就是,函数只保留他们的终点部分。
CV_CHAIN_APPROX_TC89_L1,CV_CHAIN_APPROX_TC89_KCOS:使用the flavors of Teh-Chin chain近似算法的一种。
CV_LINK_RUNS:通过连接水平段的1,使用完全不同的边缘提取算法。使用CV_RETR_LIST检索模式能使用此方法。
找到轮廓之后可以绘制出来,可以用函数cvDrawContours(),函数原型如下:
第一个参数表示要绘制的图像,第二个参数表示要绘制的轮廓,第三个参数外围轮廓的颜色,第四个参数内部轮廓的颜色。 max_level 画轮廓的最大层数。如果是0,只绘制contour;如果是1,将绘制contour后和contour同层的所有轮廓;如果是2,绘制contour后所有同层和低一层的轮廓,以此类推;如果值是负值,则函数并不绘制contour后的轮廓,但是将画出其子轮廓,一直到abs(max_level) - 1层。 thickness 绘制轮廓线的宽度。如果为负值(例如,等于CV_FILLED),则contour内部将被绘制。 line_type 轮廓线段的类型。
下面是在在一幅图像中找到轮廓并显示:
源码:
#include <cv.h>#include <highgui.h>IplImage* g_image = NULL;IplImage* g_gray = NULL;int g_thresh = 100;CvMemStorage* g_storage = NULL;//回调函数void on_trackbar(int) {if (g_storage == NULL) {g_gray = cvCreateImage(cvGetSize(g_image), 8, 1);g_storage = cvCreateMemStorage(0);}else {cvClearMemStorage(g_storage);}CvSeq* contours = 0;cvCvtColor(g_image, g_gray, CV_BGR2GRAY);cvThreshold(g_gray, g_gray, g_thresh, 255, CV_THRESH_BINARY);cvFindContours(g_gray, g_storage, &contours);cvZero(g_gray);if (contours)cvDrawContours(g_gray,contours,cvScalarAll(255),//绘制白线cvScalarAll(255),100);cvShowImage("Contours", g_gray);}int main(int argc, char** argv){g_image = cvLoadImage("99.jpg");cvNamedWindow("Contours", 1);cvCreateTrackbar("Threshold","Contours",&g_thresh,255,on_trackbar);on_trackbar(0);cvWaitKey(0);return 0;}
结果:
- opencv寻找轮廓源代码
- opencv寻找轮廓
- Opencv 寻找图像最大轮廓
- opencv寻找轮廓2--drawContours
- OpenCV: 寻找图像轮廓并绘制
- OpenCV: 寻找图像轮廓并绘制
- opencv学习之findcounters 寻找轮廓
- 【opencv练习33 - 寻找轮廓凸壳】
- opencv学习之寻找轮廓并绘制轮廓
- 寻找轮廓
- 寻找轮廓
- 寻找轮廓
- opencv基于轮廓寻找的视频流运动检测
- OpenCV使用的一些经验总结,寻找最大轮廓、旋转
- opencv学习之寻找凸包,使用多边形包围轮廓
- opencv学习(四十)之寻找图像轮廓findContours()
- OpenCV学习笔记(22)寻找轮廓小程序
- openCV轮廓
- Django -model的字段类型清单
- iOS开发Tap点击的区域问题。
- Beyond Compare复制文件的几种方式
- 二维数组m*n的鞍点
- 【Oracle】PLSQL Developer如何连接Oracle
- opencv寻找轮廓
- Android中的对话框
- 学习随笔
- UI Design
- 使用RxBinding响应控件的异步事件
- Android开发之自定义View --详解
- 在下拉列表Spinner中添加自定义文字和图标的方法。
- leetcode:SameTree java python
- Floyd判圈算法