一、简介

二、绘制点集的凸包

 #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. eclipse主题之-------DevStyle

    最佳因为经常熬夜  eclipse自带的背景 白色 太伤眼了 换了其他颜色但是 总感觉 差点什么    所以就去eclipse自带的插件下载中心 下载了  DevStyle 其实 有很多的 主题插件的 ...

  2. linux的基本操作(磁盘管理)

    磁盘管理 [查看磁盘或者目录的容量 df 和 du] df 查看已挂载磁盘的总容量.使用容量.剩余容量等,可以不加任何参数,默认是按k为单位显示的 df常用参数有 –i -h -k –m等 -i 使用 ...

  3. web项目访问地址前添加小图片

    修改HTML 1.head标签添加 <link rel="icon" type="image/x-icon" href="images/icon ...

  4. LINUXJI积算器bc

    hling@hling:~$ bcbc 1.06.95Copyright 1991-1994, 1997, 1998, 2000, 2004, 2006 Free Software Foundatio ...

  5. python学习之旅(三)

    Python基础知识(2):运算符 一.算术运算符 加 +,减 -,乘 *,除 /,幂 **,求余 %,取整 // 二.成员运算符 in,not in 判断一个字符是否在字符串中 name = &qu ...

  6. 最全的MonkeyRunner自动化测试从入门到精通(10)

    三.MonkeyRunner复杂的功能开始学习 (1)获取APK文件中ID的两种方式 Monkeyrunner的环境已经搭建完成,现在对Monkeyrunner做一个简介. Monkeyrunner工 ...

  7. iptables 分析(二)

    原文:http://blog.chinaunix.net/uid-24207747-id-2622901.html do_command()函数分析 //负责整个用户输入的命令处理 int do_co ...

  8. mybatis中namespace配置方式

    namespace有三种全路径的配置方式: namespace绑定实体类的全路径;绑定dao接口的全路径绑定;mapper的sql.xml文件第一种:namespace绑定实体类的全路径: 当name ...

  9. DNSmasq介绍

    DNSmasq介绍 转载自:http://www.cnblogs.com/demonxian3/p/7472300.html#top 云主机的mac地址由物理机的dnsmasq随机分配,如果要修改ma ...

  10. python基础(14)-反射&类的内置函数

    反射 几个反射相关的函数可参考python基础(10)-匿名函数&内置函数中2.2.4反射相关 类的一些内置函数 __str__()&__repr__() 重写__str__()函数类 ...