Opencv查找轮廓并绘制
注意:转载请注明出处!
图像处理中的边缘检测是根据像素间的差异检测出轮廓边缘的像素,但它没有将轮廓作为一个整体。将这些轮廓边缘像素组装成一个整体(轮廓),就要进行轮廓检测.opencv提供了轮廓检测的函数cvFindContours,函数参数如下:
cvFindContours(CvArr *图像,CvMemStorage *存储,CvSeq ** first_contour,
int header_size CV_DEFAULT(sizeof(CvContour)),
int模式CV_DEFAULT(CV_RETR_LIST),
int方法CV_DEFAULT(CV_CHAIN_APPROX_SIMPLE),
CvPoint偏移量CV_DEFAULT(cvPoint(0,0)) );
具体参数含义如下:
图片
8比特单通道的源二值图像。非零像素作为1处理,0像素保存不变。从一个灰度图像得到二值图像的函数有:cvThreshold,cvAdaptiveThreshold和cvCanny。
存储
返回轮廓的容器。
first_contour
输出参数,用于存储指向第一个外接轮廓。
header_size
header sequence列的尺寸。如果选择方法= CV_CHAIN_CODE,则header_size> = sizeof(CvChain);其他,则
header_size> = sizeof(CvContour)。
模式
CV_RETR_EXTERNAL:只检索最外面的轮廓;
CV_RETR_LIST:检索所有的轮廓,并将其放入列表中;
CV_RETR_CCOMP:检索所有的轮廓,并将他们组织为两层:顶层是各部分的外部边界,第二层是空洞的边界;
CV_RETR_TREE:检索所有的轮廓,并重构嵌套轮廓的整个层次。
蓝色表示v_next,绿色表示h_next
方法
边缘近似方法(除了CV_RETR_RUNS使用内置的近似,其他模式均使用此设定的近似算法)可取值如下:
CV_CHAIN_CODE:以弗里曼链码的方式输出轮廓,所有其他方法输出多边形(顶点的序列)。
CV_CHAIN_APPROX_NONE:将所有的连码点,转换成点。
CV_CHAIN_APPROX_SIMPLE:压缩水平的,垂直的和斜的部分,也就是,函数只保留他们的终点部分。
CV_CHAIN_APPROX_TC89_L1,CV_CHAIN_APPROX_TC89_KCOS:使用Teh-Chin链的味道近似算法
的一种。
CV_LINK_RUNS:通过连接水平段的1,使用完全不同的边缘提取算法使用CV_RETR_LIST检索模式能使用此方法。
抵消
偏移量,用于移动所有轮廓点。当轮廓是从图像的ROI提取的,并且需要在整个图像中分析时,这个参数将很有用。
绘制检测轮廓的函数为:
cvDrawContours(CvArr * img,CvSeq * contour,
CvScalar external_color,CvScalar hole_color,
int max_level,int thickness CV_DEFAULT(1),
int line_type CV_DEFAULT(8),
CvPoint offset CV_DEFAULT(cvPoint(0,0)));
轮廓检测例子代码如下:
#include <cv.h>
#include <highgui.h>
using namespace cv;
using namespace std;
IplImage *g_image = NULL;
IplImage *g_gray = NULL;
int g_thresh = 10;
int g_Mathresh = 255;
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 = NULL;
cvCvtColor(g_image,g_gray,CV_RGB2GRAY);
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()
{
g_image=cvLoadImage("C:/Users/Administrator/Desktop/0.jpg");
cvNamedWindow("Contours",1);
cvCreateTrackbar("Threshold","Contours",&g_thresh,g_Mathresh,on_trackbar);
on_trackbar(0);
cvWaitKey();
return 0;
}
原图如下:
检测效果如下:
Opencv查找轮廓并绘制相关推荐
- imutils基础(7)使用 OpenCV 查找轮廓中的极值点
今天,我将使用 OpenCV 和 Python 根据轮廓查找极值点. 在本博客的其余部分,我将演示如何根据轮廓找到极北.极南.极东和极西 (x, y) 坐标,如本博文顶部的图像所示. 虽然这项技能本身 ...
- python使用opencv查找轮廓_(八)OpenCV-Python学习—轮廓查找,绘制和拟合
针对物体轮廓,opencv还提供了一些相关的函数,来处理轮廓查找,绘制,拟合,以及计算轮廓周长和面积等,详细介绍如下: 1. 寻找和绘制轮廓 opencv的findContours()能寻找图片中的轮 ...
- python使用opencv查找轮廓_Python+opencv学习记录20:轮廓发现,Pythonopencv
1.轮廓发现 轮廓发现是基于图像边缘提取的基础寻找对象轮廓的方法,所以边缘提取的阈值选定会影响最终轮廓发现结果. 1.1发现轮廓 在此步骤中我们会使用到findContours这个API,其原型为: ...
- OpenCV查找轮廓
转自:http://westice.javaeye.com/blog/721225 主要函数是 cvFindContours(tour_buf,storage,&contour,s ...
- OpenCV 图像轮廓检测
本文是OpenCV图像视觉入门之路的第15篇文章,本文详细的介绍了图像轮廓检测的各种操作,例如:轮廓检索模式.轮廓逼近算子等操作. 图像轮廓是具有相同颜色或灰度的连续点的曲线,轮廓在形状分析和物体的检 ...
- opencv 查找并绘制轮廓
一个轮廓一般对应一系列的点, 也就是图像中的一条曲线.其表示方法可能根据不同的情况而有所不同. 在opencv中可以用findContours()函数从二值图像查找轮廓 findContours()函 ...
- Opencv——查找并绘制凸包、凸包与轮廓的关系
定义 给定二维平面上的点集,凸包就是将最外层的点连接起来构成的凸多边型. 理解物体形状或轮廓的一 种比较有用的方法便是计算一个物体的凸包,然后计算其凸缺陷(convexity defects). 检测 ...
- 使用Python,OpenCV进行基本的图像处理——提取红色圆圈轮廓并绘制
使用Python,OpenCV进行基本的图像处理--提取红色圆圈轮廓并绘制 1. 效果图 1.1 形态学图像处理效果图 1.2 转换HSV色彩空间提取 2. 源码 2.1 形态学图像处理提取源码 2. ...
- openCV专栏(八):图像轮廓:绘制轮廓
OPENCV基础操作 提示:本专栏所用版本仅供参考,其他版本也可 库 版本 python Python 3.9.3 opencv 4.5.5 matplotlib 3.4.3 numpy 1.19.5 ...
- 使用Python,OpenCV进行涂鸦(绘制文字、线、圆、矩形、椭圆、多边形轮廓、多边形填充、箭头~)
使用Python,OpenCV进行涂鸦(绘制文字.线.圆.矩形.椭圆.多边形轮廓.多边形填充.箭头) 1. 效果图 2. 原理 2.1 绘制线:cv2.line(canvas, (300, 0), ( ...
最新文章
- NASM学习之Windows下编写16位程序
- tab-pane 怎么家点击事件_想起爆款?怎么样去打造一个人见人点的爆款主图?
- 时间管理无非就是一个玩耍俄罗斯方块的过程,堆堆堆哈哈哈哈
- 利用 Docker 搭建单机的 Cloudera CDH 以及使用实践
- NB-IOT技术以及物联网安全问题简述
- 动态RAM的刷新(资料来源于网上自己查找搜索)
- 终于,我们的新产品Fotor Slideshow Maker上线了!!
- ArcGIS js Api 4.x修改三维球背景技巧
- mysql tuner sh_MySQL性能提议者:mysqltuner.pl
- 【分布式定时任务】定时任务实现几种方式
- position:fixed;支持ie6,清除e6下抖动。
- 利用计算机Tracert,tracert,教您tracert命令使用详解
- 由内而外全面造就自己
- 怎么画人体(动漫人体教程)
- 【自学C++】C++ cout clog cerr区别
- 10份可直接套用的华为项目管理模板
- vue:实现锚点双向滚动/文章章节联动滚动效果
- stress命令安装
- Linux中使用mvn命令(使用Maven:-bash:mvn:command not fonud)随笔
- 2010年4月51CTO壁纸点评活动获奖公告
热门文章
- usc计算机博士游戏专业,USC工科博士专业排名,必然得仔细的看
- file is not a zip file_如何使用JavaScript解压压缩后的zip文件
- python如何选择两种不同输入方式_从Python到空间分析arcpy || 第一回:关于连载的总介绍...
- python token验证失败百分百解决_微信公众号token验证失败解决方案
- Java基础(四):异常处理
- 计算几何——交点、面积的计算
- sqlserver常用语法
- 关于super关键字
- MVC5为WebAPI添加命名空间的支持
- 【转】小结登录的几种交互方式