OpenCV——轮廓特征描述

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

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

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

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

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

其中每行的存取格式为:

  136, 30;
  135, 31;
  134, 31;

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

函数返回值 为 相似度大小,完全相同的图像返回值是0,返回值最大是1。
double cvMatchShapes( const void* object1, const void* object2,
                      int method, double parameter=0 );

参数含义
object1——第一个轮廓或灰度图像
object2——第二个轮廓或灰度图像
method——比较方法:
   CV_CONTOURS_MATCH_I1
   CV_CONTOURS_MATCH_I2
   CV_CONTOURS_MATCH_I3.
parameter——比较方法的参数 

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

时间: 2024-12-19 20:00:11

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

图像特征提取:图像的矩特征

1. 矩的概念 图像识别的一个核心问题是图像的特征提取,简单描述即为用一组简单的数据(图像描述量)来描述整个图像,这组数据越简单越有代表性越好.良好的特征不受光线.噪点.几何形变的干扰.图像识别发展几十年,不断有新的特征提出,而图像不变矩就是其中一个. 矩是概率与统计中的一个概念,是随机变量的一种数字特征.设X为随机变量,c为常数,k为正整数.则量E[(x−c)k]称为X关于c点的k阶矩. 比较重要的有两种情况: 1. c=0.这时ak=E(Xk)称为X的k阶原点矩 2. c=E(X).这时μk

DoG 、Laplacian、图像金字塔详解

DoG(Difference of Gaussian) DoG (Difference of Gaussian)是灰度图像增强和角点检测的方法,其做法较简单,证明较复杂,具体讲解如下: Difference of Gaussian(DOG)是高斯函数的差分.我们已经知道可以通过将图像与高斯函数进行卷积得到一幅图像的低通滤波结果,即去噪过程,这里的Gaussian和高斯低通滤波器的高斯一样,是一个函数,即为正态分布函数. 那么difference of Gaussian 即高斯函数差分是两幅高斯图

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

参考尺度空间理论 金字塔 当用一个机器视觉系统分析未知场景时,计算机没有办法预先知道图像中物体尺度,因此,我们需要同时考虑图像在多尺度下的描述,获知感兴趣物体的最佳尺度.所以在很多时候,我们会在将图像构建为一系列不同尺度的图像集,在不同的尺度中去检测我们感兴趣的特征.比如:在Harr特征检测人脸的时候,因为我们并不知道图像中人脸的尺寸,所以需要生成一个不同大小的图像组成的金字塔,扫描其中每一幅图像来寻找可能的人脸. 图像金字塔化的一般步骤:首先,图像经过一个低通滤波器进行平滑(这个步骤会使图像变

【OpenCV入门教程之十八】OpenCV仿射变换 &amp; SURF特征点描述合辑

本系列文章由@浅墨_毛星云 出品,转载请注明出处. 文章链接:http://blog.csdn.net/poem_qianmo/article/details/33320997 作者:毛星云(浅墨)    微博:http://weibo.com/u/1723155442 知乎:http://www.zhihu.com/people/mao-xing-yun 邮箱: [email protected] 写作当前博文时配套使用的OpenCV版本: 2.4.9 本篇文章中,我们一起探讨了OpenCV中

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

http://ronny.blog.51cto.com/8801997/1394139 原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否则将追究法律责任.http://ronny.blog.51cto.com/8801997/1394139 基于内容的图像分析的重点是提取出图像中具有代表性的特征,而线条.轮廓.块往往是最能体现特征的几个元素,这篇文章就针对于这几个重要的图像特征,研究它们在OpenCV中的用法,以及做一些简单的基础应用. 一.Canny检测轮

OpenCV仿射变换 &amp; SURF特征点描述合辑

OpenCV仿射变换 & SURF特征点描述合辑 转载地址:http://blog.csdn.net/poem_qianmo/article/details/33320997?utm_source=tuicool&utm_medium=referral

OpenCV入门教程之八 直线、轮廓的提取与描述

基于内容的图像分析的重点是提取出图像中具有代表性的特征,而线条.轮廓.块往往是最能体现特征的几个元素,这篇文章就针对于这几个重要的图像特征,研究它们在OpenCV中的用法,以及做一些简单的基础应用. 一.Canny检测轮廓 在上一篇文章中有提到sobel边缘检测,并重写了soble的C++代码让其与matlab中算法效果一致,而soble边缘检测是基于单一阈值的,我们不能兼顾到低阈值的丰富边缘和高阈值时的边缘缺失这两个问题.而canny算子则很好的弥补了这一不足,从目前看来,canny边缘检测在

OpenCV之特征检测器(Feature Detector),描述子提取器(Descriptor Extractor)和描述子匹配器(Descriptor Matcher)

1.特征检测子 -Harris cv::cornerHarris(image,strength,3,3,0.01); -Fast cv::Ptr<cv::FastFeatureDetector> fast = cv::FastFeatureDetector::create(); //或 cv::FAST(InputArray image, std::vector<KeyPoint> &keypoints, int threshold) //或 cv::FAST(InputA

【OpenCV学习笔记】三十、轮廓特征属性及应用(七)—位置关系及轮廓匹配

http://blog.csdn.net/abc8730866/article/details/69219992 轮廓特征属性及应用(七)-位置关系及轮廓匹配 1.计算点与轮廓的距离及位置关系--pointPolygonTest() 2.矩的计算--moments() 3.形状匹配(比较两个形状或轮廓间的相似度)--matchShapes() 先上ppt: 代码:1.计算点到轮廓的距离与位置关系 [cpp] view plain copy ///计算点到轮廓的距离与位置关系 #include "