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

一、简介

二、绘制点集的凸包

 1 #include<opencv2/opencv.hpp>
 2 using namespace cv;
 3
 4 void main()
 5 {
 6     //---绘制点集的凸包
 7     Mat img(400, 400, CV_8UC3, Scalar::all(0));  //定义绘制图像
 8     RNG rng;  //定义随机数对象
 9     while(1)
10     {
11         char key;
12         int count = (unsigned int)rng % 100;  //定义点的个数
13         vector<Point> points;  //定义点集
14         for(int i=0; i<count; i++)
15         {
16             Point pt;
17             pt.x = rng.uniform(img.cols/4, img.cols*3/4);  //设定点的x范围
18             pt.y = rng.uniform(img.rows/4, img.rows*3/4);  //设定点的y范围
19             points.push_back(pt);
20         }
21
22         //检测凸包
23         vector<int> hull;
24         convexHull(Mat(points), hull, true);
25
26         img = Scalar::all(0);
27         for(int i = 0; i < count; i++ )
28             circle(img, points[i], 3, Scalar(rng.uniform(0, 255), rng.uniform(0, 255), rng.uniform(0, 255)), CV_FILLED, CV_AA);
29
30         //准备参数
31         int hullcount = (int)hull.size(); //凸包的边数
32         Point point0 = points[hull[hullcount-1]]; //连接凸包边的坐标点
33
34         //绘制凸包的边
35         for(int  i = 0; i < hullcount; i++ )
36         {
37             Point point = points[hull[i]];
38             circle(img, point, 8, Scalar(0, 255, 0), 2, 8);
39             line(img, point0, point, Scalar(255, 255, 255), 2, CV_AA);
40             point0 = point;
41         }
42
43         //显示效果图
44         imshow("img", img);
45
46         //按下ESC,Q,或者q,程序退出
47         key = (char)waitKey();
48         if( key == 27 || key == ‘q‘ || key == ‘Q‘ )
49             break;
50     }
51}

三、绘制轮廓的凸包

 1 #include<opencv2/opencv.hpp>
 2 using namespace cv;
 3
 4 void main()
 5 {
 6     Mat srcImg = imread("E://12.jpg");
 7     imshow("src", srcImg);
 8     Mat dstImg2 = srcImg.clone();
 9     Mat tempImg(srcImg.rows, srcImg.cols, CV_8UC3, Scalar::all(0));  //用于绘制凸包
10     Mat dstImg(srcImg.rows, srcImg.cols, CV_8UC3, Scalar::all(0));  //用于绘制轮廓
11     cvtColor(srcImg, srcImg, CV_BGR2GRAY);
12     threshold(srcImg, srcImg, 100, 255, CV_THRESH_BINARY); //二值化
13
14     vector<vector<Point>> contours;
15     vector<Vec4i> hierarcy;
16     findContours(srcImg, contours, hierarcy, CV_RETR_EXTERNAL, CV_CHAIN_APPROX_NONE);
17     vector<vector<Point>> hull(contours.size());
18     for(int i=0; i<contours.size(); i++)
19     {
20         convexHull(Mat(contours[i]), hull[i], true);     //查找凸包
21         drawContours(dstImg, contours, i, Scalar(255, 255, 255), -1, 8);  //绘制轮廓
22         //drawContours(dstImg, hull, i, Scalar(rand()%255, rand()%255, rand()%255), 2, 8);
23         drawContours(tempImg, hull, i, Scalar(255, 255, 255), -1, 8);
24     }
25     imshow("hull", tempImg);
26     imshow("contours", dstImg);
27
28     Mat diffImg;
29     absdiff(tempImg, dstImg, diffImg);  //图像相减
30     Mat element = getStructuringElement(MORPH_RECT, Size(3, 3), Point(-1, -1));
31     erode(diffImg, diffImg, element);
32     imshow("diff", diffImg);
33
34     vector<vector<Point>> contours2;
35     vector<Vec4i> hierarcy2;
36     cvtColor(diffImg, diffImg, CV_BGR2GRAY); //转为灰度图
37     threshold(diffImg, diffImg, 100, 255, CV_THRESH_BINARY); //二值化
38     findContours(diffImg, contours2, hierarcy2, CV_RETR_EXTERNAL, CV_CHAIN_APPROX_NONE);
39     drawContours(dstImg2, contours2, -1, Scalar(0, 0, 255), 2, 8);  //红色绘制缺陷轮廓
40     imshow("defects", dstImg2);
41     waitKey(0);
42 }

时间: 2024-12-31 19:54:05

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

linux学习之路之磁盘管理和文件系统三

ext3文件系统和ext2文件系统的区别? 在某些时候,某个用户在linux系统上写入数据,这时系统正好断电或者系统核心出现错误,写入的数据仅有inode table和datablock而已,可能会导致之前写过的数据没有保存在磁盘上.而当系统重启后,系统可能会对没有保存的数据进行数据恢复.但是,由于系统并不知道是哪个文件不完整,因此会遍历整个文件系统中inode,来查看block是否完整.不过,当某个文件的数据太大时,数据的恢复时间可能会比较长,而这对于服务器来说是不利的.所以在这种情况下,也就

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

一.简介 二.外接矩形的查找绘制 1 #include "opencv2/opencv.hpp" 2 using namespace cv; 3 void main() 4 { 5 //外接矩形的查找绘制 6 Mat srcImg =imread("E://12.jpg"); 7 imshow("src",srcImg); 8 Mat dstImg = srcImg.clone(); //原图备份 9 cvtColor(srcImg, srcIm

opencv学习之路(27)、轮廓查找与绘制(六)——外接圆

一.最小外接圆 1 #include "opencv2/opencv.hpp" 2 #include<iostream> 3 using namespace std; 4 using namespace cv; 5 6 void main() { 7 Mat srcImg = imread("E://10.png"); 8 imshow("src", srcImg); 9 Mat dstImg = srcImg.clone(); 10

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

一.简介 二.轮廓最小外接矩形的绘制 1 #include "opencv2/opencv.hpp" 2 using namespace cv; 3 4 void main() 5 { 6 //轮廓最小外接矩形的绘制 7 Mat srcImg = imread("E://00.png"); 8 Mat dstImg = srcImg.clone(); 9 cvtColor(srcImg, srcImg, CV_BGR2GRAY); 10 threshold(srcI

25、【opencv入门】轮廓查找与绘制(3)——凸包

一简介 1.凸包 凸包(Convex Hull)是一个计算机几何图形学中的概念, 简单来说, 给定二维平面点集, 凸包就是能够将最外层的点连接起来构成的凸多边形, 它能够包含点集中所有的点.物体的凸包检测场应用在物体识别.手势识别及边界检测等领域. A-H是被标出的凸包缺陷 2.寻找凸包---convexHull() 1 CV_EXPORTS_W void convexHull(InputArray points, OutputArray hull, bool clockwise=false,

26、【opencv入门】轮廓查找与绘制(4)——正外接矩形

一.简介 1.使用特定形状的轮廓包围 在实际应用中, 经常会有将检测到的轮廓用多边形表示出来的需求, 提取包围轮廓的多边形也方便我们做进一步分析, 轮廓包围主要有一下几种: 轮廓外接矩形.轮廓最小外接矩形(旋转).轮廓最小包围圆形.轮廓拟合椭圆.轮廓逼近多边形曲线 2.轮廓外接矩形 --- boundingRect() 1 CV_EXPORTS_W Rect boundingRect(InputArray points); points: 输入的二维点集, 可以填Mat类型或std::vecto

OpenCV学习代码记录—— Snake轮廓

很久之前学习过一段时间的OpenCV,当时没有做什么笔记,但是代码都还在,这里把它贴出来做个记录. 代码放在码云上,地址在这里https://gitee.com/solym/OpenCVTest/tree/master/OpenCVTest #include <opencv2/core.hpp> #include <opencv2/highgui.hpp> #include <opencv2/imgproc.hpp> #include <opencv2/legac

30、【opencv入门】轮廓查找与绘制(8)——轮廓特征属性及应用

一.简介 1.HSV颜色空间(hue色调,saturation饱和度,value亮度) HSV颜色空间与人眼所看色彩较接近, 故常用于颜色检测与识别.其中H(色调).S(饱和度).V(亮度) H---不同的颜色(红色/绿色/蓝色)---范围: 0~360 S---颜色深浅(浅红/深红)---范围: 0.0~1.0 V---颜色亮暗(暗红/亮红)---范围: 0.0~1.0 OpenCV默认的HSV范围分别是: H: 0~180,  S: 0~255,  V: 0~255 2.相关知识点 颜色空间

opencv学习之路(21)、模板匹配及应用

一.模板匹配概念 二.单模板匹配 1 #include "opencv2/opencv.hpp" 2 #include <iostream> 3 using namespace std; 4 using namespace cv; 5 6 void main() 7 { 8 Mat temp=imread("E://mu.jpg"); 9 Mat src=imread("E://lena.jpg"); 10 Mat dst=src.c