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

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. 近期小结 之 Servlet规范及HTTP

    最近认真看了下Servlet 3.1的规范,略有收获,如下: 如果客户端不指定编码,Servlet容器必须使用ISO-8859-1编码来处理,且不能添加相应编码信息. Servlet 3 可以手动开启 ...

  2. 第三百六十一节,Python分布式爬虫打造搜索引擎Scrapy精讲—elasticsearch(搜索引擎)倒排索引

    第三百六十一节,Python分布式爬虫打造搜索引擎Scrapy精讲—elasticsearch(搜索引擎)倒排索引 倒排索引 倒排索引源于实际应用中需要根据属性的值来查找记录.这种索引表中的每一项都包 ...

  3. Python——eventlet

    eventlet语境下的“绿色线程”普通线程之间的区别: 1. 绿色线程几乎没有开销,不用像保留普通线程一样保留“绿色线程”,每一个网络连接对应至少一个“绿色线程”: 2. 绿色线程需要人为的设置使其 ...

  4. table中td的内容换行。

    table设置样式: table-layout: fixed; td设置: word-wrap: break-word;

  5. .NET条形码

    建议不要用CODE-39码,改用CODE-128码: CODE-39码密度比较低,条码数字内容太多,导致条码太长,缩短长度就只能减小X尺寸,造成识读困难: CODE-128码密度高,相同的数字生成条码 ...

  6. vue父组件向子组件动态传值的两种方法

    在一些项目需求中需要父组件向子组件动态传值,比如我这里的需求是,父组件动态通过axios获取返回的图片url数组然后传给子组件,上传图片的子组件拿到该数组后进行遍历并展示图片,因为有时候获取到的会是空 ...

  7. 解决parseSdkContent failed java.lang.NullPointerException错误

    今天我的eclipse崩溃了,报“parseSdkContent failed java.lang.NullPointerException”的错误. 所有的安卓项目都不正常,创建项目就会报 java ...

  8. 查询SQL阻塞语句

    SELECT SPID=p.spid, DBName = convert(CHAR(),d.name), ProgramName = program_name, LoginName = convert ...

  9. 怎样把网站升级到http/2

    https://juejin.im/post/59c63adf6fb9a00a4c271484

  10. 奔五的人学ios:swift竟然没有字符串包括,找个简单的解决方法

    swift关于字符串的推断中 有前导.有后缀 两个方法.竟然没有包括推断. 经过学习找了个简单的解决方法: extension String { func has(v:String)->Bool ...