检测出特定轮廓,可进一步对其特征进行描述,从而识别物体。

1. 如下函数,可以将轮廓以多种形式包围起来。

// 轮廓表示为一个矩形
Rect r = boundingRect(Mat(contours[]));
rectangle(result, r, Scalar(), );
// 轮廓表示为一个圆
float radius;
Point2f center;
minEnclosingCircle(Mat(contours[]), center, radius);
circle(result, Point(center), static_cast<int>(radius), Scalar(), );
// 轮廓表示为一个多边形
vector<Point> poly;
approxPolyDP(Mat(contours[]), poly, , true);
vector<Point>::const_iterator itp = poly.begin();
while (itp != (poly.end() - ))
{
line(result, *itp, *(itp + ), Scalar(), );
++itp;
}
line(result, *itp, *(poly.begin()), Scalar(), );
// 轮廓表示为凸多边形
vector<Point> hull;
convexHull(Mat(contours[]), hull);
vector<Point>::const_iterator ith = hull.begin();
while (ith != (hull.end() - ))
{
line(result, *ith, *(ith + ), Scalar(), );
++ith;
}
line(result, *ith, *(hull.begin()), Scalar(), );

2. 将轮廓数据存储在记事本中,然后读取数据,存入vector<cv::Point>中

void readFromTxt(string name,int q)
{
ifstream file(name);
int i = ;
while (file) {
string line;
getline(file, line);
if (line == "")break;
cv::Point p;
int num;
for (int i = ;; i++)
{
if (line[i] == ';') {
num = i + ;
break;
}
}
int x = , y = ;
int k;
for (int i = ; i < num; i++) {
if (line[i] == ',') {
k = i;
for (int j = ; j < k; j++)
{
x += (line[j] - '') * (pow(, k - j - ));
}
}
if (line[i] == ';') {
for (int j = k + ; j < i; j++) {
y += (line[j] - '') * (pow(, i - j - ));
}
}
}
p.x = x;
p.y = y;
if(q == )shitou.push_back(p);
else if (q == )jiandao.push_back(p);
else bu.push_back(p);
}
}

其中每行的存取格式为:

  , ;
, ;
, ;

3. 使用mathShapes函数比较两个形状的相似度

函数返回值 为 相似度大小,完全相同的图像返回值是0。对于第一种比较方法来说返回值最大是1。
double cvMatchShapes( const void* object1, const void* object2,
int method, double parameter= ); 参数含义
object1——第一个轮廓或灰度图像
object2——第二个轮廓或灰度图像
method——比较方法:
CV_CONTOURS_MATCH_I1
CV_CONTOURS_MATCH_I2
CV_CONTOURS_MATCH_I3.
parameter——比较方法的参数

4. 判断某点是否在轮廓内

double pointPolygonTest(InputArray contour, Point2f pt, bool measureDist)

   contour——输入轮廓

   pt ——要测试的点

   measureDist ——为真则计算点到最近轮廓的整数距离,

否则,只判断点的位置。返回值+1(在轮廓里面)、-1(在轮廓外面)、0(在轮廓上)。

参考:http://mobile.51cto.com/aengine-435442.htm

OpenCV——轮廓特征描述的更多相关文章

  1. OpenCV特征描述

    特征描述 目标 在本教程中,我们将涉及: 使用 DescriptorExtractor 接口来寻找关键点对应的特征向量. 特别地: 使用 SurfDescriptorExtractor 以及它的函数  ...

  2. OpenCV 特征描述

    #include <stdio.h> #include <iostream> #include "opencv2/core/core.hpp" #inclu ...

  3. DoG 、Laplacian、图像金字塔详解

    DoG(Difference of Gaussian) DoG (Difference of Gaussian)是灰度图像增强和角点检测的方法,其做法较简单,证明较复杂,具体讲解如下: Differe ...

  4. 第一篇 特征提取以及openvslam中的相关实现详解

    参考尺度空间理论 金字塔 当用一个机器视觉系统分析未知场景时,计算机没有办法预先知道图像中物体尺度,因此,我们需要同时考虑图像在多尺度下的描述,获知感兴趣物体的最佳尺度.所以在很多时候,我们会在将图像 ...

  5. opencv2.4.13+python2.7学习笔记--OpenCV中的图像处理--图像轮廓特征和几何矩

    阅读对象:对概率论中的期望有一点了解. 1.图像几何矩 1.1简述 图像的几何矩包括空间矩.中心矩和中心归一化矩.几何矩具有平移.旋转和尺度不变性,一般是用来做大粒度的区分,用来过滤显然不相关的图像. ...

  6. OpenCV成长之路(8):直线、轮廓的提取与描述

    基于内容的图像分析的重点是提取出图像中具有代表性的特征,而线条.轮廓.块往往是最能体现特征的几个元素,这篇文章就针对于这几个重要的图像特征,研究它们在OpenCV中的用法,以及做一些简单的基础应用. ...

  7. OpenCV成长之路:直线、轮廓的提取与描述

    http://ronny.blog.51cto.com/8801997/1394139 OpenCV成长之路:直线.轮廓的提取与描述 原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 . ...

  8. [OpenCV-Python] OpenCV 中图像特征提取与描述 部分 V (一)

    部分 V图像特征提取与描述 OpenCV-Python 中文教程(搬运)目录 29 理解图像特征 目标本节我会试着帮你理解什么是图像特征,为什么图像特征很重要,为什么角点很重要等.29.1 解释 我相 ...

  9. [OpenCV-Python] OpenCV 中图像特征提取与描述 部分 V (二)

    部分 V图像特征提取与描述 OpenCV-Python 中文教程(搬运)目录 34 角点检测的 FAST 算法 目标 • 理解 FAST 算法的基础 • 使用 OpenCV 中的 FAST 算法相关函 ...

随机推荐

  1. elasticsearch系列六:聚合分析(聚合分析简介、指标聚合、桶聚合)

    一.聚合分析简介 1. ES聚合分析是什么? 聚合分析是数据库中重要的功能特性,完成对一个查询的数据集中数据的聚合计算,如:找出某字段(或计算表达式的结果)的最大值.最小值,计算和.平均值等.ES作为 ...

  2. 用Visual C#创建Windows服务程序

    一.Windows服务介绍: Windows服务以前被称作NT服务,是一些运行在Windows NT.Windows 2000和Windows XP等操作系统下用户环境以外的程序.在以前,编写Wind ...

  3. Redis集群的操作

    1.原始集群 1.1    启动Redis集群 [root@cent03 ~]# /usr/local/redis/bin/redis-server /usr/local/redis-cluster/ ...

  4. linux stat命令参数及用法详解

    功能说明:显示inode内容.语 法:stat [文件或目录]补充说明:stat以文字的格式来显示inode的内容. ls 命令及其许多参数提供了一些非常有用的文件信息.另一个不太为人所熟知的命令 s ...

  5. winform中文本框,软键盘跟随

    private void textBox1_Click(object sender, EventArgs e) { //Control.MousePosition Point p = System.W ...

  6. Objective-c: 移除字符串中的指定字符

    string = [[string componentsSeparatedByCharactersInSet:[NSCharacterSet characterSetWithCharactersInS ...

  7. [WPF打印]WPF 文档元素(Run TextBlock Paragraph)的文字对齐方式

    最近开发WPF程序,需要打印,用到了FlowDocument(这相当于有了打印模版,而且可以随时修改,真的是挺方便的).可是在输出表格形数据(这种情况恐怕是大多数~)时遇到了点儿麻烦. 由于Table ...

  8. angular.extend深拷贝(deep copy)

    在用到angular.extend的时候,正好碰到一个对象,是层层嵌套的Array, 结果发现只能extend第一层,查阅官文档,确实不支持deep copy: Note: Keep in mind ...

  9. git远端删除被提交后又被加到.gitignore的文件

    远端删除文件而不影响本地文件 git rm [-r] --cached file_or_dir_name 利用.gitignore来自动删除所有匹配文件 我试过网上推荐的写法 git rm --cac ...

  10. 用iostat对linux硬盘IO性能进行检测

    近期公司安装了几台DELL PE2650和2850的服务器,统一安装的是RHLE5.132位系统,而服务器的SCSI硬盘都统一做了raid1.公司老总要求对硬盘IO作统一检测报告,在Linux下找了许 ...