一、简介

二、绘制点集的凸包

 #include<opencv2/opencv.hpp>
using namespace cv; void main()
{
//---绘制点集的凸包
Mat img(, , CV_8UC3, Scalar::all()); //定义绘制图像
RNG rng; //定义随机数对象
while()
{
char key;
int count = (unsigned int)rng % ; //定义点的个数
vector<Point> points; //定义点集
for(int i=; i<count; i++)
{
Point pt;
pt.x = rng.uniform(img.cols/, img.cols*/); //设定点的x范围
pt.y = rng.uniform(img.rows/, img.rows*/); //设定点的y范围
points.push_back(pt);
} //检测凸包
vector<int> hull;
convexHull(Mat(points), hull, true); img = Scalar::all();
for(int i = ; i < count; i++ )
circle(img, points[i], , Scalar(rng.uniform(, ), rng.uniform(, ), rng.uniform(, )), CV_FILLED, CV_AA); //准备参数
int hullcount = (int)hull.size(); //凸包的边数
Point point0 = points[hull[hullcount-]]; //连接凸包边的坐标点 //绘制凸包的边
for(int i = ; i < hullcount; i++ )
{
Point point = points[hull[i]];
circle(img, point, , Scalar(, , ), , );
line(img, point0, point, Scalar(, , ), , CV_AA);
point0 = point;
} //显示效果图
imshow("img", img); //按下ESC,Q,或者q,程序退出
key = (char)waitKey();
if( key == || key == 'q' || key == 'Q' )
break;
}
}

三、绘制轮廓的凸包

 #include<opencv2/opencv.hpp>
using namespace cv; void main()
{
Mat srcImg = imread("E://12.jpg");
imshow("src", srcImg);
Mat dstImg2 = srcImg.clone();
Mat tempImg(srcImg.rows, srcImg.cols, CV_8UC3, Scalar::all()); //用于绘制凸包
Mat dstImg(srcImg.rows, srcImg.cols, CV_8UC3, Scalar::all()); //用于绘制轮廓
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);
vector<vector<Point>> hull(contours.size());
for(int i=; i<contours.size(); i++)
{
convexHull(Mat(contours[i]), hull[i], true); //查找凸包
drawContours(dstImg, contours, i, Scalar(, , ), -, ); //绘制轮廓
//drawContours(dstImg, hull, i, Scalar(rand()%255, rand()%255, rand()%255), 2, 8);
drawContours(tempImg, hull, i, Scalar(, , ), -, );
}
imshow("hull", tempImg);
imshow("contours", dstImg); Mat diffImg;
absdiff(tempImg, dstImg, diffImg); //图像相减
Mat element = getStructuringElement(MORPH_RECT, Size(, ), Point(-, -));
erode(diffImg, diffImg, element);
imshow("diff", diffImg); vector<vector<Point>> contours2;
vector<Vec4i> hierarcy2;
cvtColor(diffImg, diffImg, CV_BGR2GRAY); //转为灰度图
threshold(diffImg, diffImg, , , CV_THRESH_BINARY); //二值化
findContours(diffImg, contours2, hierarcy2, CV_RETR_EXTERNAL, CV_CHAIN_APPROX_NONE);
drawContours(dstImg2, contours2, -, Scalar(, , ), , ); //红色绘制缺陷轮廓
imshow("defects", dstImg2);
waitKey();
}

opencv学习之路(24)、轮廓查找与绘制(三)——凸包的更多相关文章

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

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

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

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

  3. opencv学习之路(28)、轮廓查找与绘制(七)——位置关系及轮廓匹配

    一.点与轮廓的距离及位置关系 #include "opencv2/opencv.hpp" #include <iostream> using namespace std ...

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

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

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

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

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

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

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

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

  8. opencv学习之路(39)、PCA

    一.PCA理论介绍 网上已经有许多介绍pca原理的博客,这里就不重复介绍了.详情可参考 http://blog.csdn.net/zhongkelee/article/details/44064401 ...

  9. opencv学习之路(37)、运动物体检测(二)

    一.运动物体轮廓椭圆拟合及中心 #include "opencv2/opencv.hpp" #include<iostream> using namespace std ...

随机推荐

  1. 谢大神给的C++和C# DES加解密代码

    // CPPdesTest.cpp : 定义控制台应用程序的入口点.// #include "stdafx.h"//#include <windows.h>//#inc ...

  2. 最新版本sublime text3注册码

    TwitterInc 200 User License EA7E-890007 1D77F72E 390CDD93 4DCBA022 FAF60790 61AA12C0 A37081C5 D03164 ...

  3. Solve Error: 'NSInvalidArgumentException', reason: '-[UITableView mas_makeConstraints:]: unrecognized selector sent to instance 0x7fa5c402fa00'

    下面是iOS开发用第三方库可能出现的错误,及其解决方法: 1. 'NSInvalidArgumentException', reason: '-[UITableView mas_makeConstra ...

  4. 剑指offer——python【第56题】删除链表中的重复节点

    题目描述 在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针. 例如,链表1->2->3->3->4->4->5 处理后 ...

  5. Python学习之旅(十四)

    Python基础知识(13):函数(Ⅳ) Python内置函数 1.abs:取绝对值 abs(-1) 1 2.all:把序列中的每一个元素拿出来做布尔运算,都为真则返回True,如果序列中有None. ...

  6. 关于ie浏览器信任站点的代码

    1检测用户当前浏览器是否将域名的ip添加信任站点 js代码 //域名ip的获取 var hostname = window.location.hostname;       var WshShell ...

  7. CodeForces 733B Parade

    B. Parade time limit per test1 second memory limit per test256 megabytes inputstandard input outputs ...

  8. Mybatis 使用了哪些设计模式?

    https://mp.weixin.qq.com/s/ZTh4a-YST5RdIipHykWpPQ

  9. java学习笔记-连数据库JDBC

    查看JDK API文档,学习JDBC中类和接口的定义,分析其中的方法 ===============PreparedStatement ===================查询

  10. DIOCP3-粘包处理

    DIOCP3-粘包处理   什么是粘包: 第一次发送  12345, 第二次发送abcde, 底层socket可能会一次性进行发送12345abcde,或者对方可能一次性进行了接收,那接收的时候,你可 ...