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



二、绘制点集的凸包
#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)、轮廓查找与绘制(三)——凸包的更多相关文章
- opencv学习之路(23)、轮廓查找与绘制(二)——访问轮廓每个点
一.简介 二.画出每个轮廓的每个点 #include "opencv2/opencv.hpp" using namespace cv; void main() { Mat src= ...
- opencv学习之路(22)、轮廓查找与绘制(一)
一.简介 图2 二.代码 #include"opencv2/opencv.hpp" #include<iostream> using namespace std; us ...
- opencv学习之路(28)、轮廓查找与绘制(七)——位置关系及轮廓匹配
一.点与轮廓的距离及位置关系 #include "opencv2/opencv.hpp" #include <iostream> using namespace std ...
- opencv学习之路(27)、轮廓查找与绘制(六)——外接圆、椭圆拟合、逼近多边形曲线、计算轮廓面积及长度、提取不规则轮廓
一.最小外接圆 #include "opencv2/opencv.hpp" #include<iostream> using namespace std; using ...
- opencv学习之路(25)、轮廓查找与绘制(四)——正外接矩形
一.简介 二.外接矩形的查找绘制 #include "opencv2/opencv.hpp" using namespace cv; void main() { //外接矩形的查找 ...
- opencv学习之路(29)、轮廓查找与绘制(八)——轮廓特征属性及应用
一.简介 HSV颜色空间(hue色调,saturation饱和度,value亮度) 二.HSV滑动条 #include "opencv2/opencv.hpp" #include ...
- opencv学习之路(26)、轮廓查找与绘制(五)——最小外接矩形
一.简介 二.轮廓最小外接矩形的绘制 #include "opencv2/opencv.hpp" using namespace cv; void main() { //轮廓最小外 ...
- opencv学习之路(39)、PCA
一.PCA理论介绍 网上已经有许多介绍pca原理的博客,这里就不重复介绍了.详情可参考 http://blog.csdn.net/zhongkelee/article/details/44064401 ...
- opencv学习之路(37)、运动物体检测(二)
一.运动物体轮廓椭圆拟合及中心 #include "opencv2/opencv.hpp" #include<iostream> using namespace std ...
随机推荐
- highcharts.js的时间轴折线图
工作中正好用到. 鼠标按住左键 左右移动可以试试 <!DOCTYPE> <html lang='en'> <head> <title>4-Highcha ...
- JAVA课程课后作业03之动手动脑
一.构造函数 问题一: 错误代码如图: 错误原因:从图片中的编译报错的地方来看,程序是在给新的对象分配空间是出现了问题,因而我们往下观察Foo类,Foo类的构造方法是有一个参数的有参方法,而前面构造新 ...
- Coffee and Coursework (Hard Version)
Coffee and Coursework (Hard Version) time limit per test 2.5 seconds memory limit per test 256 megab ...
- 前端自动化构建工具webpack (一)之webpack安装 和 设置webpack.confi.js
目的: 模块化开发,组件化开发,让代码符合开发规范,更高效 webpack作用:从pack,就知道这是包的意思,比较专业点叫做前端自动化打包构建工具,代码错误检查,预处理,文件合并(打包),代码压缩 ...
- ajax里post 设置请求头的编码格式
我们常用的ajax形式就是post和get.post需要设置请求头,那么问题来了: 首先,为什么get不需要设置编码格式? 其次:不设置post请求头编码格式可以吗? 还有:常用的请求头编码格式有哪些 ...
- 二、JavaScript基础(2)
BOM基础加强 1.浏览器对象BOM DOM Window DOM Navigator DOM Screen DOM History DOM Location 2.浏览器对象的使用 History H ...
- ubuntu安装notepad++
sudo add-apt-repository ppa:notepadqq-team/notepadqq sudo apt-get update sudo apt-get install notepa ...
- mui 滑块开关 进度条 以及如何获取值
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <meta name ...
- Pycharm调试:进入调用函数后返回
在菜单栏的view中勾选toolbar,然后点击工具栏中左箭头返回到调用函数处.
- 使用scrapy入门教程
创建项目 scrapy startprogect demo 创建爬虫 scrapy genspider myDomain madomian.com 直接创建文件也可以 运行爬虫 scrapy craw ...