博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
OpenCV——轮廓特征描述
阅读量:5938 次
发布时间:2019-06-19

本文共 2577 字,大约阅读时间需要 8 分钟。

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

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
(radius), Scalar(255), 2); // 轮廓表示为一个多边形 vector
poly; approxPolyDP(Mat(contours[2]), poly, 5, true); vector
::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
hull; convexHull(Mat(contours[3]), hull); vector
::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——比较方法的参数

 

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

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

   contour——输入轮廓

   pt ——要测试的点

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

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

 

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

转载地址:http://spvtx.baihongyu.com/

你可能感兴趣的文章
基于托管C++的增删改查及异步回调小程序
查看>>
Oracle DBMS_STATS 包 和 Analyze 命令的区别
查看>>
给Visual Studio 2010中文版添加Windows Phone 7模板
查看>>
linux下基本命令
查看>>
windows server 2008R2 上安装配置freesshd
查看>>
手动删除SVCH0ST.EXE的方法
查看>>
MySQL多源复制【转】
查看>>
Mysql连接问题:com.mysql.jdbc.exceptions.jdbc4.MySQLNonTransientConnectionException
查看>>
WebStorm使用快速入门
查看>>
oracle addm报告
查看>>
Git分支合并:Merge、Rebase的选择
查看>>
技术文章是怎样炼成的?
查看>>
HDU-1128 Self Numbers 筛选
查看>>
Silverlight 5 深入理解 - TechEd2011葡萄城讲师课程
查看>>
js 选择 checkbox
查看>>
What is The Rule of Three?
查看>>
使用HTML5画布实现的超棒javascript动画仪表板:gauge.js
查看>>
node.js入门 - 2.创建一个简单聊天室
查看>>
For tomorrow's English test
查看>>
内容激活码jsp发送email
查看>>