OpenCV学习笔记(十八):凸包,最小包围区域算子:convexHull(),minAreaRect(),minEnclosingTriangle(),minEnclosingCircle()

OpenCV学习笔记(十八):凸包,最小包围区域算子:convexHull(),minAreaRect(),minEnclosingTriangle(),minEnclosingCircle()

1、convexHull()函数

计算出图像点集的凸包,根据图像的轮廓点,通过函数convexhull转化成凸包的点坐标,从而画出图像的凸包。

void convexHull(
InputArray points,		// 输入的点集,一般是用图像轮廓函数求得的轮廓点
OutputArray hull,		// 输出的是凸包的二维xy点的坐标值,针对每一个轮廓形成的。
bool clockwise =  false,	//  表示凸包的方向,true顺时针  flase 逆时针
bool returnPoints = true    // true表示返回点,false返回点地址的索引值
==returnPoints 标识符==
当输出数组"hull" 是std::vector时,忽略该标志,输出取决于向量的类型:
std::vector<int>表示 returnPoints=false, 返回索引值
std::vector<Point>表示 returnPoints=true。返回点	
)

2、boundingRect()函数

该函数计算并返回指定点集的最小右上界矩形。

Rect cv::boundingRect(InputArray points)	

3、minAreaRect()函数

对给定的2D 点集,寻找可旋转的最小面积包围矩形

RotatedRect cv::minAreaRect(InputArray points)	

4、minEnclosingCircle()函数

找到包围2D点集的最小面积的圆。

void cv::minEnclosingCircle(	
InputArray 	points,
Point2f & 	center,
float & 	radius 
)	

5、minEnclosingTriangle()函数

找到一个包含2D点集的最小面积三角形,并返回其面积。

double cv::minEnclosingTriangle(	
InputArray 	points,
OutputArray triangle 
)		

6、minEnclosingTriangle()函数

在一组二维点周围拟合一个椭圆。

RotatedRect cv::fitEllipse(
InputArray points
)	

7、approxPolyDP()函数

以指定的精度近似生成多边形曲线。
函数逼近一条曲线或另一条曲线/顶点较少的多边形,使它们之间的距离小于或等于指定的精度。它使用Douglas-Peucker算法

void approxPolyDP(
InputArray curve,			// 输入的点集(存储在std::vector或Mat中的二维点的输入向量)
OutputArray approxCurve, 	// 输出的点集,当前点集是能最小包容指定点集的。draw出来即是一个多边形;
double epsilon, 			// 指定的精度,也即是原始曲线与近似曲线之间的最大距离。
bool closed					// 若为true,则说明近似曲线是闭合的,它的首位都是相连,反之,若为false,则断开。
);

8、示例一: (凸包)

#include <opencv2/opencv.hpp>using namespace cv;
using namespace std;int main()
{// 1、初始化变量和随机值Mat image(600, 600, CV_8UC3);RNG& rng = theRNG(); // 生成单个均匀分布的随机数或随机数数组。// 2、循环,按下ESC,Q,q键程序退出,否则有键按下便一直更新while(1){// 2.1 参数初始化char key;//键值int count = (unsigned)rng%100 + 3;//随机生成点的数量(最少3个点)vector<Point> points; //点值// 2.2 随机生成点坐标for(int i = 0; i < count; i++ ){Point point;point.x = rng.uniform(image.cols/4, image.cols*3/4);    // 一定范围内点坐标point.y = rng.uniform(image.rows/4, image.rows*3/4);points.push_back(point);}// 2.3 检测凸包// 操作方向为 顺市时针vector<Point> hull;  // 输出凸包点集 坐标索引值convexHull(Mat(points), hull, true);// 2.4 绘制出随机颜色的点image = Scalar::all(0); // 背景清零(设为黑色)for(int i = 0; i < count; i++ )// 绘制点circle(image, points[i], 3, Scalar(rng.uniform(0, 255), rng.uniform(0, 255), rng.uniform(0, 255)), CV_FILLED, CV_AA);//         // 根据凸包点集的索引 绘制凸包线
//        int hullcount = (int)hull.size();                   //凸包的边数(点数)
//        for(int  i = 0; i < hullcount; i++ )
//        {
//            Point point = points[hull[i]];  // 第一个点坐标            // 方式一:从最后一个点为起点绘制
            Point point_last = points[hull[hullcount-1]];   //连接凸包边的坐标点(hull[hullcount-1]:凸包最后一个点 索引值)
            line(image, point_last, point, Scalar(255, 255, 255), 1, CV_AA);
            point_last = point;//            // 方式二:第一个点为起点绘制
//            Point point1= points[hull[(i+1)%hullcount]];   // 第二个点
//            line(image, point, point1, Scalar(255, 255, 255), 1, CV_AA);
//        }// 2.5 根据凸包点集 绘制凸包线int hullcount = (int)hull.size();for(int  i = 0; i < hullcount; i++ ){Point point = hull[i];  // 第一个点坐标Point point1= hull[(i+1)%hullcount];   // 第二个点line(image, point, point1, Scalar(255, 255, 255), 1, CV_AA);}// 2.6 显示效果图imshow("凸包检测示例", image);//按下ESC,Q,或者q,程序退出key = (char)waitKey();if( key == 27 || key == 'q' || key == 'Q' )break;}waitKey(0);return 0;
}

在这里插入图片描述
在这里插入图片描述

9、示例二: (最小包围区域)

这个程序演示了如何使用函数minAreaRect() minEnclosingTriangle() minEnclosingCircle()找到一组点的最小包围矩形、三角形、圆形。随机点生成,然后封闭。按ESC,'Q’或’q’退出和任何其他键重新生成点集。

#include <opencv2/opencv.hpp>
#include<vector>using namespace cv;
using namespace std;//using std::vector;int main()
{// 1、创建背景图片Mat img(500, 500, CV_8UC3,Scalar::all(0));// 2、返回默认的随机数生成器RNG& rng = theRNG();        for(;;){// 随机生成一些点// 首先就是随机生成点的总数量int i, count = rng.uniform(1, 101);vector<Point> points;// 3、生成一组随机的点for( i = 0; i < count; i++ ){Point pt;pt.x = rng.uniform(img.cols/4, img.cols*3/4);pt.y = rng.uniform(img.rows/4, img.rows*3/4);points.push_back(pt);}// 4、找出随机点所在区域的最小包围矩形RotatedRect box = minAreaRect(points);  // 获得旋转矩形 box// 将box变量中存储的坐标值放到 fourPoint的数组中Point2f fourPoint[4];box.points(fourPoint);// 5、找出最小包围三角形vector<Point2f> triangle;minEnclosingTriangle(points, triangle);// 6、找出最小包围圆的圆心center和半径radiusPoint2f center;float radius = 0;minEnclosingCircle(points, center, radius);///7、绘制所生产的随机点for( i = 0; i < count; i++ )circle( img, points[i], 3, Scalar(0, 0, 255), FILLED, LINE_AA );// 8、绘制最小包围矩形for( i = 0; i < 4; i++ )line(img, fourPoint[i], fourPoint[(i+1)%4], Scalar(0, 255, 0), 1, LINE_AA);///9、绘制最小包围三角形for( i = 0; i < 3; i++ )line(img, triangle[i], triangle[(i+1)%3], Scalar(255, 255, 0), 1, LINE_AA);// 10、绘制最小包围圆circle(img, center, cvRound(radius), Scalar(0, 255, 255), 1, LINE_AA);// 11、显示imshow( "Rectangle, triangle & circle", img );// 键盘命令输入char key = (char)waitKey();if( key == 27 || key == 'q' || key == 'Q' ) // 'ESC'break;elseimg = Scalar::all(0);  // 背景清空}return 0;
}

结果:

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/491116.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

为什么技术进步让我们越来越焦虑不安?

转自&#xff1a;FT中文网技术进步究竟给我们带来了多少货真价实的福利&#xff1f;还是我们只是在忙忙碌碌和变动不居中收获了一些假象而已&#xff1f;“中国是个匆忙的国家。”这是谷歌董事长埃里克•施密特两年多前在中国举行的某个论坛上说的&#xff0c;这句话想必激起了…

OpenCV学习(十九) :图像的矩:moments(),HuMoments()

OpenCV学习(十九) &#xff1a;图像的矩:moments()&#xff0c;HuMoments() 参考博客&#xff1a; 图像的矩特征 Structural Analysis and Shape Descriptors&#xff1a;opencv 形态描述 【图像算法】图像特征&#xff1a;几何不变矩–Hu矩 如何理解概率论的“矩”&#xff1…

全球半导体现状分析

来源&#xff1a;行业报告研究院前景乐观当今科技创新迅猛发展&#xff0c;半导体行业有望持续增长。对半导体行业来说&#xff0c;2019年会相对疲软&#xff0c;但普华永道预计其将在2020年实现复苏并保持繁荣。2018年半导体行业销售总额为4,810亿美元。今后四年&#xff0c;即…

OpenCV学习(二十) :分水岭算法:watershed()

OpenCV学习(二十) &#xff1a;分水岭算法:watershed() 参考博客&#xff1a; OpenCV—分水岭算法 图像处理——分水岭算法 OpenCV学习(7) 分水岭算法(1) Opencv分水岭算法——watershed自动图像分割用法 -牧野- 分水岭算法是一种图像区域分割法&#xff0c;在分割的过程中&a…

人工智能的下一个道德挑战:如何对待动物

来源&#xff1a;爱范儿去年 11 月份&#xff0c;一段关于母熊和它幼崽的视频在网络上传播开来。根据画面中显示&#xff0c;在一片被白雪覆盖的陡峭斜坡上&#xff0c;一头雌性棕熊正带着它的幼崽艰难的攀爬。虽然因为陡峭的坡度和积雪导致小熊一直在打滑&#xff0c;但最终还…

SQLite的使用(二):数据增删改查

SQLiteDatabase 用来管理SQLite数据库的类。SQLiteDatabase新增、修改、删除和查询数据库数据的方法&#xff0c;还可以执行其他常见的数据库管理任务。 方法 描述 (void) execSQL(String sql) 执行一个SQL语句的方法 (long) insert(String table,String nullColumnHack,Co…

OpenCV学习(二十一) :计算图像连通分量:connectedComponents(),connectedComponentsWithStats()

OpenCV学习(二十一) &#xff1a;计算图像连通分量:connectedComponents(),connectedComponentsWithStats() 1、connectedComponents()函数 Connected Components即连通体算法用id标注图中每个连通体&#xff0c;将连通体中序号最小的顶点的id作为连通体的id。如果在图G中&am…

github上只下载部分文件

有时候我们不想在github上下载整个压缩包&#xff0c;因为压缩包可能比较大&#xff0c;而我们只想要其中的代码文件&#xff0c;也就是只想下载部分文件&#xff0c;例如下面这个网页我们只想下载后缀名为py的文件&#xff0c;这可以通过tortoisesvn来完成 https://github.co…

【机器视觉】机器视觉产业链

来源&#xff1a;产业智能官机器视觉&#xff08;Machine Vision&#xff09;指的是通过光学的装置和非接触的传感器自动的接收和处理真实物体的图像&#xff0c;以获得所需信息或控制机器人运动的装置&#xff0c;通俗的说就是应用在工业领域的视觉应用。▲机器视觉系统组成另…

OpenCV学习笔记(十七):图像修补:inpaint()

OpenCV学习笔记&#xff08;十七&#xff09;&#xff1a;图像修补&#xff1a;inpaint() inpaint()函数 使用区域邻域在图像中还原选定区域。 void inpaint( InputArray src, // 表示要修复的图像,8位三通道或三通道 InputArray inpaintMask, // 表示修复模板(掩模)&a…

plt.errorbar画误差曲线

plt.errorbar(x, y, yerrNone, xerrNone, fmt, ecolorNone, elinewidthNone, capsizeNone, capthickNone ) 功能&#xff1a;画误差曲线&#xff0c;也可以用于画置信区间/标准差/方差参数&#xff1a;x&#xff1a;横坐标的值&#xff0c;y&#xff1a;纵坐标的值&#xff0c…

OpenCV学习(二十) :直方图匹配、对比:calcHist(),minMaxLoc(),compareHist()

直方图匹配、对比:calcHist ,minMaxLoc,compareHist1、calcHist()函数2、归一化&#xff1a;normalize()函数3、minMaxLoc()函数4、compareHist()函数5、示例一&#xff1a;H-S彩色图像的色调、饱和度二维直方图绘制6、示例二&#xff1a;灰度值一维直方图绘制7、示例三&#x…

Intel和IBM押重注的神经模态计算,会给行业带来什么样的变化

Intel发布的Pohoiki Beach加速卡&#xff0c;含有64块Loihi芯片来源&#xff1a; 半导体行业观察上周&#xff0c;Intel发布了基于其神经模态&#xff08;neuromorphic&#xff09;计算芯片Loihi的加速卡Pohoiki Beach&#xff0c;该加速卡包含了64块Loihi芯片&#xff0c;共含…

OpenCV学习(二十二) :反向投影:calcBackProject(),mixChannels()

OpenCV学习(二十二) &#xff1a;反向投影:calcHist(),minMaxLoc(),compareHist() 参考博客&#xff1a; 反向投影backproject的直观理解 opencv 反向投影 颜色直方图的计算、显示、处理、对比及反向投影 一、概述 1、官方解释&#xff1a;反向投影是一种记录给定图像中的像…

美国正式宣告将在月球建立永久存在基地

来源&#xff1a;凤凰新闻央视网消息&#xff1a;7月20号是人类首次载人登陆月球50周年纪念日&#xff0c;美国公布了“阿尔忒弥斯计划”的官方标志图案&#xff0c;正式宣告将在月球建立永久存在基地。美国媒体直呼&#xff0c;美国要“占领”月球了。1969年&#xff0c;美国的…

一文看懂5G芯片背后的明争暗斗

来源&#xff1a;鲜枣课堂6月6日工信部正式发放5G商用牌照之后&#xff0c;国内5G网络建设的步伐大幅加快了。越来越多的城市出现了5G基站和5G信号&#xff0c;5G离我们的距离更近了。面对激动人心的5G&#xff0c;我们普通用户最关心的问题&#xff0c;当然是什么时候才能用上…

OpenCV学习(二十三) :模板匹配:matchTemplate(),minMaxLoc()

OpenCV学习(二十三) &#xff1a;模板匹配:matchTemplate() 1、概述 模板匹配是一种最原始、最基本的模式识别方法&#xff0c;研究某一特定对象物的图案位于图像的什么地方&#xff0c;进而识别对象物&#xff0c;这就是一个匹配问题。 它是图像处理中最基本、最常用的匹配方…

CSS3实现图形曲线阴形和翘边阴影

首先&#xff0c;来看看完成之后的效果图&#xff1a; 实现原理 ①曲线阴影实现&#xff1a; 多个阴影重叠&#xff0c;就是正常阴影曲线阴影 正常情况下&#xff0c;有个矩形有正常的阴影&#xff0c;作为主投影&#xff0c;这时候再定义一个有一定弧度圆角的圆角矩形&#xf…

腾飞资本任溶 :互联网大脑,新的天方夜谭?—评《崛起的超级智能》

作者&#xff1a;任 溶 腾飞资本董事长&#xff0c;城市大脑创新合伙人基金管理合伙人因为我做科技产业投资工作&#xff0c;投资领域涉及互联网等新经济、新模式和新技术等&#xff0c;所以这几年总是听到一些言论&#xff0c;诸如“互联网已死”&#xff0c;或者“互联网红利…

OpenCV学习(二十四 ):角点检测(Corner Detection):cornerHarris(),goodFeatureToTrack()

OpenCV学习(二十四 &#xff09;&#xff1a;角点检测(Corner Detection):cornerHarris(),goodFeatureToTrack() 参考博客&#xff1a; Harris角点检测原理详解 Harris角点检测原理及C实现 OpenCV亚像素角点cornerSubPixel()源代码分析 Taylor公式&#xff08;泰勒公式&#x…