一、点与轮廓的距离及位置关系

 #include "opencv2/opencv.hpp"
#include <iostream>
using namespace std;
using namespace cv; void main()
{
//计算点到轮廓的距离与位置关系
Mat srcImg = imread("E://00.png");
imshow("src", srcImg); Mat dstImg = srcImg.clone();
cvtColor(srcImg, srcImg, CV_BGR2GRAY);
threshold(srcImg, srcImg, , , CV_THRESH_BINARY);
imshow("threshold", srcImg); //查找轮廓
vector<vector<Point>> contours;
vector<Vec4i> hierarcy;
findContours(srcImg, contours, hierarcy, CV_RETR_TREE, CV_CHAIN_APPROX_NONE);//TREE:提取所有轮廓 NONE:画出轮廓所有点
cout << "contours.size()=" << contours.size() << endl;
for (int i = ; i < contours.size(); i++)//遍历每个轮廓
{
for (int j = ; j < contours[i].size(); j++)//遍历轮廓每个点
{
cout << "(" << contours[i][j].x << "," << contours[i][j].y << ")" << endl;
}
} double a0 = pointPolygonTest(contours[], Point(, ), true);//点到轮廓的最短距离
double b0 = pointPolygonTest(contours[], Point(, ), false);//点与轮廓的位置关系:-1表示外部;0表示在轮廓上;1表示轮廓内部
cout << "a0=" << a0 << endl;
cout << "b0=" << b0 << endl;
waitKey();
}

a0之所以是负数,是因为点在轮廓外部

二、轮廓的矩

轮廓矩的介绍:

http://blog.csdn.net/cp32212116/article/details/38374015
http://blog.csdn.net/huixingshao/article/details/42060231

 #include "opencv2/opencv.hpp"
#include <iostream>
using namespace std;
using namespace cv; void main()
{
Mat srcImg = imread("E://00.png");
imshow("src", srcImg); Mat dstImg = srcImg.clone();
cvtColor(srcImg, srcImg, CV_BGR2GRAY);
threshold(srcImg, srcImg, , , CV_THRESH_BINARY);
//imshow("threshold", srcImg); vector<vector<Point>> contours;
vector<Vec4i> hierarcy;
findContours(srcImg, contours, hierarcy, CV_RETR_TREE, CV_CHAIN_APPROX_NONE);
cout << "contours.size()=" << contours.size() << endl;
Moments moment0 = moments(contours[], false);
cout << moment0.m00<< endl;
waitKey();
}

三、形状匹配--matchShapes()

注意与模板匹配matchTemplate()相区分。形状匹配对于旋转、尺度、位移都能适应。

 #include "opencv2/opencv.hpp"
#include <iostream>
#include <iomanip>
using namespace std;
using namespace cv; void main()
{
Mat srcImg = imread("1.jpg"); //模板图像
imshow("src", srcImg);
cvtColor(srcImg, srcImg, CV_BGR2GRAY);
threshold(srcImg, srcImg, , , CV_THRESH_BINARY);
vector<vector<Point>> contours;
vector<Vec4i> hierarcy;
findContours(srcImg, contours, hierarcy, CV_RETR_EXTERNAL, CV_CHAIN_APPROX_NONE); Mat srcImg2 = imread("2.jpg"); //待测试图片
imshow("src2", srcImg2);
Mat dstImg = srcImg2.clone();
cvtColor(srcImg2, srcImg2, CV_BGR2GRAY);
threshold(srcImg2, srcImg2, , , CV_THRESH_BINARY);
vector<vector<Point>> contours2;
vector<Vec4i> hierarcy2;
findContours(srcImg2, contours2, hierarcy2, CV_RETR_EXTERNAL, CV_CHAIN_APPROX_NONE);
while ()
{
for (int i = ; i<contours2.size(); i++)
{
double matchRate = matchShapes(contours[], contours2[i], CV_CONTOURS_MATCH_I1, 0.0);//形状匹配:值越小越相似
cout << "index=" << i << "---" << setiosflags(ios::fixed) << matchRate << endl;//setiosflags(ios::fixed)是用定点方式表示实数,保留相同位数,相同格式输出
if (matchRate <= 0.1)
drawContours(dstImg, contours2, i, Scalar(, , ), , );
imshow("dst", dstImg);
/*char key = waitKey();
if (key == 27)
break;*/
}
break;
}
waitKey();
}

opencv学习之路(28)、轮廓查找与绘制(七)——位置关系及轮廓匹配的更多相关文章

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

    http://blog.csdn.net/abc8730866/article/details/69219992 轮廓特征属性及应用(七)—位置关系及轮廓匹配 1.计算点与轮廓的距离及位置关系——po ...

  2. opencv学习之路(23)、轮廓查找与绘制(二)——访问轮廓每个点

    一.简介 二.画出每个轮廓的每个点 #include "opencv2/opencv.hpp" using namespace cv; void main() { Mat src= ...

  3. opencv学习之路(22)、轮廓查找与绘制(一)

    一.简介 图2 二.代码 #include"opencv2/opencv.hpp" #include<iostream> using namespace std; us ...

  4. opencv学习之路(16)、膨胀腐蚀应用之走迷宫

    一.分析 贴出应用图片以供直观了解 红色部分,因图而异(某些参数,根据图片的不同需要进行相应的修改) 二.代码 #include "opencv2/opencv.hpp" #inc ...

  5. opencv学习之路(27)、轮廓查找与绘制(六)——外接圆、椭圆拟合、逼近多边形曲线、计算轮廓面积及长度、提取不规则轮廓

    一.最小外接圆 #include "opencv2/opencv.hpp" #include<iostream> using namespace std; using ...

  6. opencv学习之路(25)、轮廓查找与绘制(四)——正外接矩形

    一.简介 二.外接矩形的查找绘制 #include "opencv2/opencv.hpp" using namespace cv; void main() { //外接矩形的查找 ...

  7. opencv学习之路(24)、轮廓查找与绘制(三)——凸包

    一.简介 二.绘制点集的凸包 #include<opencv2/opencv.hpp> using namespace cv; void main() { //---绘制点集的凸包 Mat ...

  8. opencv学习之路(29)、轮廓查找与绘制(八)——轮廓特征属性及应用

    一.简介 HSV颜色空间(hue色调,saturation饱和度,value亮度) 二.HSV滑动条 #include "opencv2/opencv.hpp" #include ...

  9. opencv学习之路(26)、轮廓查找与绘制(五)——最小外接矩形

    一.简介 二.轮廓最小外接矩形的绘制 #include "opencv2/opencv.hpp" using namespace cv; void main() { //轮廓最小外 ...

随机推荐

  1. 禅道docker化(Centos7.2)

    操作步骤 确认服务器禅道版本及容器禅道版本 服务器禅道版本:9.6.2 容器禅道版本:9.6.3 版本sql比对 下载官方9.6.3源码包url:http://dl.cnezsoft.com/zent ...

  2. java的方法重载

    1丶java的方法重载特性 满足以下条件的两个或多个方法构成“重载”关系:(1)方法名相同 (2)参数类型不同,参数个数不同或者参数类型的顺序不同 像System.out.println一样,就是重载 ...

  3. Python学习之旅(二十九)

    Python基础知识(28):常用第三方模块 一.Pillow PIL(Python Imaging Library):提供了强大的图像操作功能,可以通过简单的代码完成复杂的图像处理,是Python平 ...

  4. python全栈开发 * 进程池,线程理论 ,threading模块 * 180727

    一.进程池 (同步 异步 返回值) 缺点: 开启进程慢 几个CPU就能同时运行几个程序 进程的个数不是无线开启的 应用: 100个任务 进程池 如果必须用多个进程 且是高计算型 没有IO型的程序 希望 ...

  5. TX2-入门坑点-Ubuntu16.04任务栏消失

    问题:安装cuda过程中出现任务栏消失,快捷键失效的现象. 解决方法:重装桌面无法解决,使用cssm无法解决,最后删除home目录下的 .cache文件夹重启后解决

  6. mysql提权常用方法。 hack某某

    一般是root权限,知道mysql root权限,root账号密码 启动项提权:原理:利用高权限的root写入一个vbs脚本到启动项,再通过一些方法如ddos,社工管理员之类的方法来让服务器重启,运行 ...

  7. Appium下载安装及环境配置

    下载地址:https://bitbucket.org/appium/appium.app/downloads/ windows安装: 下载 AppiumForWindows.zip 解压 Appium ...

  8. vue:不同环境配置不同打包命令

    修改prod.env.js 'use strict'const target = process.env.npm_lifecycle_event;if (target == 'build') { // ...

  9. Ext 修改内容之后 不做任何动作 再次修改时的数据是原来第一次修改前的数据

    转自  http://blog.csdn.net/jaune161/article/details/18220257 在项目开发中遇到这样一个问题,点击Grid中的一条记录并修改,修改完后保存并且刷新 ...

  10. Django中一个项目使用多个数据库

    在django项目中, 一个工程中存在多个APP应用很常见. 有时候希望不同的APP连接不同的数据库,这个时候需要建立多个数据库连接. 参考:http://blog.csdn.net/songfree ...