OpenCV示例学习笔记(1)-contours2.cpp-通过findContours 函数实现轮廓提取
本文记录了对OpenCV示例contours2.cpp的分析。
资料地址:http://docs.opencv.org/3.0.0/d0/d2a/contours2_8cpp-example.html
1.findContours函数轮廓检测函数原型:void findContours(InputOutputArray image, OutputArrayOfArrays contours, OutputArray hierarchy, int mode, int method, Point offset=Point());
CHAIN_APPROX_NONE存储所有的轮廓点,相邻的两个点的像素位置差不超过1,即max(abs(x1-x2),abs(y2-y1))==1
CHAIN_APPROX_SIMPLE压缩水平方向,垂直方向,对角线方向的元素,只保留该方向的终点坐标,例如一个矩形轮廓只需4个点来保存轮廓信息
CHAIN_APPROX_TC89_L1,CV_CHAIN_APPROX_TC89_KCOS使用teh-Chinl chain 近似算法
offset:代表轮廓点的偏移量,可以设置为任意值。对ROI图像中找出的轮廓,并要在整个图像中进行分析时,这个参数还是很有用的。
函数原型:
参数说明:
InputArray curve:输入的点集
OutputArray approxCurve:输出的点集,当前点集是能最小包容指定点集的。draw出来即是一个多边形;
double epsilon:指定的精度,也即是原始曲线与近似曲线之间的最大距离。
bool closed:若为true,则说明近似曲线是闭合的,它的首位都是相连,反之,若为false,则断开。
drawContours(InputOutputArray image, InputArrayOfArrays contours, int contourIdx, const Scalar& color, int thickness=1, int lineType=8, InputArray hierarchy=noArray(), int maxLevel=INT_MAX, Point offset=Point() )
maxLevel=0,绘制与输入轮廓属于同一等级的所有轮廓即输入轮廓和与其相邻的轮廓
maxLevel=1, 绘制与输入轮廓同一等级的所有轮廓与其子节点。
maxLevel=2,绘制与输入轮廓同一等级的所有轮廓与其子节点以及子节点的子节点
PS:findContours()运行的时候,这个图像会被直接涂改,因此如果是将来还有用的图像,应该复制之后再传给findContours()。
以上描述摘至参考资料5
trackbarname:滑动空间的名称;
winname:滑动空间用于依附的图像窗口的名称;
value:初始化阈值;
count:滑动控件的刻度范围;
TrackbarCallback是回调函数。

取消approxPolyDP调用

Example分析
1.申明需要使用的变量
for( int i = ; i < ; i++ )
{
int dx = (i%)* - ;
int dy = (i/)*;
const Scalar white = Scalar();
const Scalar black = Scalar();
if( i == )
{
for( int j = ; j <= ; j++ )
{
double angle = (j+)*CV_PI/;
line(img, Point(cvRound(dx++j*-*cos(angle)),
cvRound(dy+-*sin(angle))),
Point(cvRound(dx++j*-*cos(angle)),
cvRound(dy+-*sin(angle))), white, , , );
}
}
ellipse( img, Point(dx+, dy+), Size(,), , , , white, -, , );
ellipse( img, Point(dx+, dy+), Size(,), , , , black, -, , );
ellipse( img, Point(dx+, dy+), Size(,), , , , black, -, , );
ellipse( img, Point(dx+, dy+), Size(,), , , , white, -, , );
ellipse( img, Point(dx+, dy+), Size(,), , , , white, -, , );
ellipse( img, Point(dx+, dy+), Size(,), , , , black, -, , );
ellipse( img, Point(dx+, dy+), Size(,), , , , black, -, , );
ellipse( img, Point(dx+, dy+), Size(,), , , , black, -, , );
ellipse( img, Point(dx+, dy+), Size(,), , , , black, -, , );
ellipse( img, Point(dx+, dy+), Size(,), , , , white, -, , );
ellipse( img, Point(dx+, dy+), Size(,), , , , white, -, , );
}
2.3.创建显示源图像的窗口
#include "opencv2/imgproc/imgproc.hpp"
#include "opencv2/highgui/highgui.hpp"
#include <math.h>
#include <iostream> using namespace cv;
using namespace std; static void help()
{
cout
<< "\nThis program illustrates the use of findContours and drawContours\n"
<< "The original image is put up along with the image of drawn contours\n"
<< "Usage:\n"
<< "./contours2\n"
<< "\nA trackbar is put up which controls the contour level from -3 to 3\n"
<< endl;
} const int w = ;
int levels = ; vector<vector<Point> > contours;
vector<Vec4i> hierarchy; static void on_trackbar(int, void*)
{
Mat cnt_img = Mat::zeros(w, w, CV_8UC3);
int _levels = levels - ;
drawContours( cnt_img, contours, _levels <= ? : -, Scalar(,,),
, LINE_AA, hierarchy, std::abs(_levels) ); imshow("contours", cnt_img);
} int main( int argc, char**)
{
Mat img = Mat::zeros(w, w, CV_8UC1);
if(argc > )
{
help();
return -;
}
//Draw 6 faces
for( int i = ; i < ; i++ )
{
int dx = (i%)* - ;
int dy = (i/)*;
const Scalar white = Scalar();
const Scalar black = Scalar(); if( i == )
{
for( int j = ; j <= ; j++ )
{
double angle = (j+)*CV_PI/;
line(img, Point(cvRound(dx++j*-*cos(angle)),
cvRound(dy+-*sin(angle))),
Point(cvRound(dx++j*-*cos(angle)),
cvRound(dy+-*sin(angle))), white, , , );
}
} ellipse( img, Point(dx+, dy+), Size(,), , , , white, -, , );
ellipse( img, Point(dx+, dy+), Size(,), , , , black, -, , );
ellipse( img, Point(dx+, dy+), Size(,), , , , black, -, , );
ellipse( img, Point(dx+, dy+), Size(,), , , , white, -, , );
ellipse( img, Point(dx+, dy+), Size(,), , , , white, -, , );
ellipse( img, Point(dx+, dy+), Size(,), , , , black, -, , );
ellipse( img, Point(dx+, dy+), Size(,), , , , black, -, , );
ellipse( img, Point(dx+, dy+), Size(,), , , , black, -, , );
ellipse( img, Point(dx+, dy+), Size(,), , , , black, -, , );
ellipse( img, Point(dx+, dy+), Size(,), , , , white, -, , );
ellipse( img, Point(dx+, dy+), Size(,), , , , white, -, , );
}
//show the faces
namedWindow( "image", );
imshow( "image", img );
//Extract the contours so that
vector<vector<Point> > contours0;
findContours( img, contours0, hierarchy, RETR_TREE, CHAIN_APPROX_SIMPLE); contours.resize(contours0.size());
for( size_t k = ; k < contours0.size(); k++ )
approxPolyDP(Mat(contours0[k]), contours[k], , true); namedWindow( "contours", );
createTrackbar( "levels+3", "contours", &levels, , on_trackbar ); on_trackbar(,);
waitKey(); return ;
}
OpenCV示例学习笔记(1)-contours2.cpp-通过findContours 函数实现轮廓提取的更多相关文章
- Android NDK开发及OpenCV初步学习笔记
https://www.jianshu.com/p/c29bb20908da Android NDK开发及OpenCV初步学习笔记 Super_圣代 关注 2017.08.19 00:55* 字数 6 ...
- OpenCV入门学习笔记
OpenCV入门学习笔记 参照OpenCV中文论坛相关文档(http://www.opencv.org.cn/) 一.简介 OpenCV(Open Source Computer Vision),开源 ...
- OpenCV图像处理学习笔记-Day1
OpenCV图像处理学习笔记-Day1 目录 OpenCV图像处理学习笔记-Day1 第1课:图像读入.显示和保存 1. 读入图像 2. 显示图像 3. 保存图像 第2课:图像处理入门基础 1. 基本 ...
- OpenCV图像处理学习笔记-Day03
OpenCV图像处理学习笔记-Day03 目录 OpenCV图像处理学习笔记-Day03 第31课:Canny边缘检测原理 第32课:Canny函数及使用 第33课:图像金字塔-理论基础 第34课:p ...
- OpenCV图像处理学习笔记-Day4(完结)
OpenCV图像处理学习笔记-Day4(完结) 第41课:使用OpenCV统计直方图 第42课:绘制OpenCV统计直方图 pass 第43课:使用掩膜的直方图 第44课:掩膜原理及演示 第45课:直 ...
- MYSQL学习笔记三:日期和时间函数
MYSQL学习笔记三:日期和时间函数 1. 获取当前日期的函数和获取当前时间的函数 /*获取当前日期的函数和获取当前时间的函数.将日期以'YYYY-MM-DD'或者'YYYYMMDD'格式返回 */ ...
- 播放一个视频并用滚动条控制进度-OpenCV应用学习笔记二
今天我们来做个有趣的程序实现:利用OpenCV读取本地文件夹的视频文件,并且在窗口中创建拖动控制条来显示并且控制视频文件的读取进度. 此程序调试花费了笔者近一天时间,其实大体程序都已经很快写出,结果执 ...
- C++ Primer学习笔记(三) C++中函数是一种类型!!!
C++中函数是一种类型!C++中函数是一种类型!C++中函数是一种类型! 函数名就是变量!函数名就是变量!函数名就是变量! (---20160618最新消息,函数名不是变量名...囧) (---201 ...
- JavaScript学习笔记(十)——高阶函数之map,reduce,filter,sort
在学习廖雪峰前辈的JavaScript教程中,遇到了一些需要注意的点,因此作为学习笔记列出来,提醒自己注意! 如果大家有需要,欢迎访问前辈的博客https://www.liaoxuefeng.com/ ...
随机推荐
- PHP jpgraph的一点小提示(附安装方法)
PHP中的GD库本身是一套很强大的绘图库了,绘制的图像基本可以满足日常要求,但强大规强大,还是不够方便哈,因为强大方便的基于PHP的GD库的jpgraph也就诞生啦! PHP默认是不启用GD库的,因为 ...
- SQL点滴15—在SQL Server 2008中调用C#程序
原文:SQL点滴15-在SQL Server 2008中调用C#程序 T-SQL的在执行普通的查询的时候是很高效的,但是在执行循环,判断这样的语句的时候效率就不那么的高了.这时可以借助CLR了,我们可 ...
- Javascript实战开发:教你使用raphael.js绘制中国地图
最近的数据统计项目中要用到中国地图,也就是在地图上动态的显示某个时间段某个省份地区的统计数据,我们不需要flash,仅仅依靠raphael.js以及SVG图像就可以完成地图的交互操作.在本文中,我给大 ...
- QT最简单的程序执行过程分析(内含C++基础知识)
打开QT Creator,新建一个“应用程序-Qt Widgets Application”项目: 输入名称scdc之后点击下一步. 在“构建套件”这个页面中直接点出下一步,然后再输入自己的类名Dat ...
- codeforces #257 C称号Jzzhu and Chocolate
职务地址:http://codeforces.com/contest/450/problem/C 这次CF的时候绝壁脑残了. ..A题和C题都出现了脑残失误... 唯一一个AC的B题还是被HACK了. ...
- Android 实现用户列表信息的功能,然后选择删除幻灯片删除功能
在项目开发过程中.经常须要对用户列表的信息进行删除的操作.Android中经常使用的删除操作方式有两种 .一种就是类似微信的滑动出现删除button方式,另一种是通过CheckBox进行选择.然后通过 ...
- 转: js快速分享代码
这是一款简单易用的文章分享工具,您只需将下面的html代码拷贝到模板中就可以实现文章快速分享功能.如果您想分享你的博客.个人网站或者企业网站等等,下面是两款不错的分享工具,值得拥有! 1. [html ...
- 学习Sass之安装Sass
学习Sass之安装Sass 为什么使用Sass 作为前端(html.javascript.css)的三大马车之一的css,一直以静态语言存在,HTML5火遍大江南北了.javascript由于NODE ...
- .NET面试问答集锦
程序员级别鉴定书(.NET面试问答集锦) 提供避免元素命名冲突的方法 DOM适合的使用场景是什么?是否有尺寸限制? DOM是一种与浏览器,平台,语言无关的接口,使你可以访问页面其他的标准组件. DOM ...
- iOS基础 - UIButton - UIImageView
封装思想:将相同的重复东西保存到方法里,不同的东西用参数代替.不相同的东西交给方法调用者,相同东西自己搞定. 一.UIButton和UIImageView的区别 1.显示图片 1> UIImag ...