凸包

计算几何相关

耗尽温柔 提交于 2019-12-17 19:53:57
计算几何相关 向量表示法 这里最适合的就是用一个二维点对 \((a,b)\) 来表示了。 点积 \({a.x*b.x+a.y*b.y}\) 在向量的含义下: \(\vec{a}·\vec{b}=|\vec{a}||\vec{b}|cos<\vec{a},\vec b>\) 叉积 \({a.x*b.y-a.y*b.x}\) 这个东西很有用,首先这个东西的绝对值就是两个向量构成的三角形的面积的二倍。 证明的话只需要把图画出来,然后过向量端点的四条平行于坐标轴的直线将包含了整个向量的矩形分割成四个部分,然后割补法算一算就好了。 发现上面写面积的时候带了绝对值,当 \(b\) 在 \(a\) 的逆时针方向时,即 \(b\) 在 \(a\) 的左侧时,两者的叉积为正,否则叉积为负,所以通过叉积也可以很方便的计算向量之间的位置关系。 转角 把向量转动一个角度 \(\alpha\) 。 显然向量如果把它的模长变为 \(1\) ,就可以在单位圆上对应一个点,假设其模长为 \(R\) ,那么一个向量可以写为 \((R\cos\beta,R\sin\beta)\) ,那么转角只需要改变 \(\beta\) 即可。 再用三角函数的和角公式可以很容易拆分。 极角 其实就是如何计算上面那个 \(\beta\) ,直接 \(atan2(a.y,a.x)\) 就好了。 两条直线的交点

洛谷3829:信用卡凸包

∥☆過路亽.° 提交于 2019-12-14 22:32:18
洛谷3829:[SHOI2012]信用卡凸包 题目描述 有一种矩形,四个角做了圆滑处理,使他们都是与矩形的两边相切的 \(\frac{1}{4}\) 圆。现在平面上有一些这样规格相同的矩形,求凸包的周长。 输入格式 第一行输入一个正整数 \(n\) ,表示有多少个矩形。第二行给出三个实数 \(a,b,r\) 表示矩形的竖直+水平方向上的长度以及 \(\frac{1}{4}\) 圆的半径。 之后 \(n\) 行,每行包三个实数 \(x,y,θ\) ,表示一张矩形的中心(对角线交点)的横纵坐标以及绕中心逆时针旋转的弧度。 输出格式 输出一个实数表示凸包的周长,四舍五入精确到小数点后 \(2\) 位。 数据范围 \(1\leq n\leq 10^5\) 思路 如果这一题四个角没有做圆滑处理的话,也就是 \(r=0\) 的情况,就会容易很多,直接提取矩形的四个角之后跑Graham即可。 但其实仔细观察之后发现,几个圆弧形的地方总合起来的角度等于360度,也就是说对于有圆滑处理的矩形来说,最后的结果就相当于把未圆滑处理的矩形组成的凸包加上一个圆的周长。 如图所示 就相当于红色部分加上最外一周圆周长。 于是这题就变成了二维凸包裸题。 绕中心旋转处理要怎么做 假设原先没旋转前,中心点为 \((x,y)\) ,右上角的点是 \((x_0,y_0)\) ,矩形绕中心旋转 \(theta\)

寻找物体的凸包

北城以北 提交于 2019-12-07 20:34:33
1 寻找凸包:convexHull()函数 void convexHull(InputArray points,OutputArray hull,bool clockwise=false,bool returnPoints=true) //例子 include "opencv2/imgproc/imgproc.hpp" include "opencv2/highgui/highgui.hpp" include using namespace cv; using namespace std; //-----------------------------------【ShowHelpText( )函数】---------------------------------- // 描述:输出一些帮助信息 //---------------------------------------------------------------------------------------------- static void ShowHelpText() { //输出欢迎信息和OpenCV版本 printf("\n\n\t\t\t非常感谢购买《OpenCV3编程入门》一书!\n"); printf("\n\n\t\t\t此为本书OpenCV3版的第71个配套示例程序\n"); printf("

PCL 点云库 点云 凸包检测 Convex Hull 凸包顶点求解

守給你的承諾、 提交于 2019-12-07 17:17:15
点云凸包检测还是比较常用的,PCL自带的凸包检测 ConvexHull ,这个函数比较简单,设置凸包维度 setDimension即可,在这里记录一下 头文件:#include <pcl/surface/convex_hull.h> pcl::PointCloud<pcl::PointXYZ>::Ptr cloud(new pcl::PointCloud<pcl::PointXYZ>); pcl::io::loadPCDFile<pcl::PointXYZ>("bun_45.pcd", *cloud); pcl::ConvexHull<pcl::PointXYZ> hull; hull.setInputCloud(cloud); hull.setDimension(3); std::vector<pcl::Vertices> polygons; pcl::PointCloud<pcl::PointXYZ>::Ptr surface_hull(new pcl::PointCloud<pcl::PointXYZ>); hull.reconstruct(*surface_hull, polygons); cout << surface_hull->size() << endl; // ---------------------- Visualizer ------------------

2 实现函数 cv2.approxPloyDP

。_饼干妹妹 提交于 2019-12-07 17:17:01
凸形状内部的任意两点的连线都应该在形状里面。 1 道格拉斯-普克算法 Douglas-Peucker algorithm 这个算法在其他文章中讲述的非常详细,此处就详细撰述。 下图是引用维基百科的。ε称之为阈值 shreshold 图一 静态图如下: 具体详细的可以参考如下两篇文章。 相关文章如下: 道格拉斯-普克 抽稀算法 附javascript实现 ,该文章只看他的文字讲解就好,他的代码不是通过python实现的。 道格拉斯-普克算法(Douglas–Peucker algorithm) ,该文章讲的也比较详细。 Ramer-Douglas-Peucker算法 ,维基百科的名词诠释 2 实现函数 cv2.approxPloyDP 作用:对目标图像进行(按指定精度、阈值,两者是一个概念)进行近似多边形曲线拟合。 使用一个较少顶点的曲线/多边形去拟合一个顶点较多的曲线/多边形,两曲线/多边形间的距离小于或等于某一指定精度/阈值 cv2.approxPolyDP(curve, epsilon, closed) -> approxCurve 参数: curve - 2D点矢量,为图像的 “ 轮廓 ” 值。 epsilon - 指定近似精度的参数ε,这是原始曲线与其近似值之间的最大距离。参数越小,两直线越接近 closed - 若为true,曲线第一个点与最后一个点连接形成闭合曲线

Scipy 和opencv 计算凸包(convexHull)

本小妞迷上赌 提交于 2019-12-07 17:16:45
凸包:在数学中,在实向量空间 V 中的一组点 X 的凸包或凸包络是包含 X 的最小凸集。来自 Wikipedia 。通俗的来说就是包围一组散点的最小凸边形。 在 scipy.spatial 和 opencv 分别有计算凸包的函数, scipy 中 convexHull 输入的参数可以是 m*2 的点坐标。其返回值的属性 .verticess 是所有凸轮廓点在散点( m*2 )中的索引值。 注意:属性 .verticess 绘制出来的轮廓点是按照逆时针排序 在 opencv 中, cv2.convexHull 可以得到凸包的坐标值 / 凸包在轮廓的索引值(取决于参数 returnPoints=True/Fasle )。同时 opencv 中 convexityDefects 函数可计算凸缺陷,即使图像中所有的凹点。其函数返回值是 m*4 的数组,第一列是起点,第二列是终点,第三列是最远点,第四列是最远点到凸轮廓的距离。 图像的质心 ---- 利用图像矩, opencv--- cv2.moments( 轮廓 ) 其中 cx = int(M['m10']/M['m00']) ; y = int(M['m01']/M['m00']) Scipy 计算得到的凸包见下图: Opencv 计算凸包: 本次测试图为: 注意:本测试图阈值化的时候注意反转图像,牢记找轮廓是针对的“ 白像素”

opencv3检测凸包convexHull函数-使用方法一-滚动条

半城伤御伤魂 提交于 2019-12-07 17:16:10
#include<iostream> #include<opencv2/opencv.hpp> #include<vector> using namespace cv; using namespace std; int g_nColorThick = 0; int g_nLineThick = 0; int g_nBackBlue = 0; int g_nBackGreen = 0; int g_nBackRed = 0; int g_bPointWay = 0; int g_bLineWay = 0; int g_nPointBlue = 0; int g_nPointGreen = 0; int g_nPointRed = 0; int g_nLineBlue = 0; int g_nLineGreen = 0; int g_nLineRed = 0; int g_nShowWay = 0; int main() { //先初始化变量 Mat srcImage(Size(600, 600), CV_8UC3, Scalar(0)); Mat saveImage; srcImage.copyTo(saveImage); RNG &rng = theRNG(); namedWindow("【滚动条窗口】", 0); createTrackbar("circlethick", "

opencv3检测凸包convexHull函数-使用方式二-滚动条

泄露秘密 提交于 2019-12-07 17:15:50
#include<opencv2/opencv.hpp> #include<iostream> #include<vector> using namespace cv; using namespace std; int g_nMinThred = 125; int g_nMaxThred = 255; int g_nColor = 255; int g_CheckWay = 0; int g_nThick = 0; int main() { RNG &rng = theRNG(); Mat srcImage = imread("group.jpg"); imshow("【原图】", srcImage); //因为后期需要在二值图像中寻找轮廓,所以需要进行阀值操作或是使用canny边缘检测操作,无论是哪种方式,都需要输入一张灰度图像 //所以这里先进行图像格式的转换 Mat grayImage; cvtColor(srcImage, grayImage, CV_BGR2GRAY); //处理图像之前先对图像进行滤波操作 Mat blurImage; GaussianBlur(grayImage, blurImage, Size(3, 3), 0, 0); imshow("【高斯滤波后的灰度图】", blurImage); namedWindow("【滚动条窗口】", 0);

【小白】Open-CV 学习笔记 - 8.2 寻找和绘制物体的凸包convexHull()

风流意气都作罢 提交于 2019-12-07 17:15:19
概述 凸包(Convex Hull)是一个计算几何(图形学)中的概念 ,在一个实数向量空间V中,对于给定集合X,所有包含X的凸集的交集S被称为X的凸包。 X的凸包可以用X内所有点(x1, x2….xn)的线性组合来构造。在二维欧几里得空间中,凸包可以想象为一条刚好包着所有点的橡皮圈,用不严谨的话来讲,给定二维平面上的点集, 凸包就是将最外层的点连接起来构成的凸多边形,它能包含点集中所有的点接! API函数: void cv : : convexHull ( InputArray points , OutputArray hull , bool clockwise = false , bool returnPoints = true ) 参数解释 points:输入的二维点集,Mat类型数据即可 hull:输出参数,用于输出函数调用后找到的凸包 clockwise:操作方向,当标识符为真时,输出凸包为顺时针方向,否则为逆时针方向。 returnPoints:操作标识符,默认值为true,此时返回各凸包的各个点,否则返回凸包各点的指数,当输出数组时std::vector时,此标识被忽略。 //寻找物体的凸包convexHull //定义和输出vector容器点坐标 # include <opencv2/opencv.hpp> # include "opencv2/highgui

OpenCv--寻找凸包convexHull()

牧云@^-^@ 提交于 2019-12-07 17:14:48
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/keith_bb/article/details/70194073 1.概述 凸包(Convex Hull)是一个计算几何(图形学)中的概念,在一个实数向量空间V中,对于给定集合X,所有包含X的凸集的交集S被称为X的凸包。 X的凸包可以用X内所有点(x1, x2….xn)的线性组合来构造。在二维欧几里得空间中,凸包可以想象为一条刚好包着所有点的橡皮圈,用不严谨的话来讲,给定二维平面上的点集,凸包就是将最外层的点连接起来构成的凸多边形,它能包含点集中所有的点。常见的有Graham’s Scan法和Jarvis步进法 1.1 凸包的作用 凸包可以想象成一条刚好包住所有点的橡皮圈,对于二维的图像,凸包就是将最外层的点连接起来构成凸多边形,它能包含点集中所有的点。物体的凸包检测常常用于物体识别、手势识别及边界检测等领域。 OpenCV提供了函数convexHull()用于对物体轮廓凸包进行检测,对形状凸包缺陷分析时使用convexityDefects()函数,每个缺陷区包含四个特征量:起始点,结束点,距离及最远点。 2.原理 2.1Graham’s Scan法 Graham扫描法通过不断在凸壳中加入新的点和去除影响凸性的点,最后形成凸包。算法的主体由两部分组成,先是排序,然后扫描。 (1