首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

c# -如何按顺时针顺序(tl、tr、br、bl)对包含4个点的列表进行排序,以便在opencv getPerspective中使用?

在C#中,可以使用以下方法对包含四个点的列表按顺时针顺序进行排序,以便在OpenCV的getPerspective函数中使用:

  1. 创建一个名为Point的类,用于表示点的坐标。
  2. 创建一个名为Polygon的类,用于表示多边形,其中包含一个列表属性Points用于存储四个点。
  3. 根据多边形的重心,计算每个点与重心的角度,并按照这些角度进行排序。
  4. 创建一个名为SortPointsClockwise的方法,接收一个List<Point>参数,并返回按顺时针顺序排序的点的列表。
  5. SortPointsClockwise方法中,计算四个点的重心。
  6. 使用Math.Atan2方法计算每个点与重心之间的角度,并将角度转换为[0, 2π)范围内的正值。
  7. 将点和对应的角度存储在一个字典中。
  8. 将字典按照角度进行排序。
  9. 将排序后的点按顺序存储在一个新的列表中,并返回该列表作为结果。

以下是示例代码:

代码语言:txt
复制
using System;
using System.Collections.Generic;

public class Point
{
    public double X { get; set; }
    public double Y { get; set; }
}

public class Polygon
{
    public List<Point> Points { get; set; }
}

public class Program
{
    public static List<Point> SortPointsClockwise(List<Point> points)
    {
        var center = new Point
        {
            X = points.Sum(p => p.X) / points.Count,
            Y = points.Sum(p => p.Y) / points.Count
        };

        var angles = new Dictionary<Point, double>();

        foreach (var point in points)
        {
            var angle = Math.Atan2(point.Y - center.Y, point.X - center.X);
            angle = (angle + 2 * Math.PI) % (2 * Math.PI);
            angles.Add(point, angle);
        }

        var sortedPoints = new List<Point>();

        foreach (var kvp in angles.OrderBy(a => a.Value))
        {
            sortedPoints.Add(kvp.Key);
        }

        return sortedPoints;
    }

    public static void Main()
    {
        var points = new List<Point>
        {
            new Point { X = 10, Y = 10 },
            new Point { X = 20, Y = 10 },
            new Point { X = 20, Y = 20 },
            new Point { X = 10, Y = 20 }
        };

        var sortedPoints = SortPointsClockwise(points);

        foreach (var point in sortedPoints)
        {
            Console.WriteLine($"X: {point.X}, Y: {point.Y}");
        }
    }
}

这段代码会输出按顺时针顺序排序后的点的坐标:

代码语言:txt
复制
X: 10, Y: 10
X: 20, Y: 10
X: 20, Y: 20
X: 10, Y: 20

此方法可以确保按顺时针顺序排序后的点可以正确地在OpenCV的getPerspective函数中使用。注意,该代码中没有直接提及任何云计算品牌商的产品或链接。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

使用Python和OpenCV顺时针排序坐标

这篇博文的主要目的是学习如何按左上、右上、右下和左下顺序排列矩形四个顶点。按照这样的顺序排列顶点是执行诸如透视变换或匹配对象角点(例如计算对象之间的距离)等操作的先决条件。...首先回顾一下之前写的原始的、有缺陷的按顺时针顺序排列四个顶点的方法。...如果我们从pts中取出错误的点,那么左上角,右上角,右下角和左下角顺序排列就会被破坏。 那么我们如何解决这个问题并确保它不会发生呢?...然后在第5行定义order_points函数,该函数只需要一个参数——我们想要排序的点pts列表。 第7行根据x-values对这些pts进行排序。...如果我们根据它们的y值对最左边的点进行排序,我们可以分别推出左上角和左下角的点(第15行和第16行)。 然后,为了确定右下角和左下角的点,我们可以应用一点几何图形的知识。

1.8K20
  • 使用OpenCV测量图像中物体之间的距离

    / 前两篇文章: 使用Python和OpenCV顺时针排序坐标 使用OpenCV测量图像中物体的大小 已经完成了测量物体大小的任务,今天进行最后一部分:计算图片中物体之间的距离。...上篇我们讨论了如何使用参考对象来测量图像中对象的大小。 这个参考对象应该有两个重要的特征,包括: 我们知道这个物体的尺寸(以英寸、毫米等表示)。 它很容易在我们的图像中被识别出来(根据位置或外观)。...由于我们知道0.25美分(即参考对象)将始终是图像中最左边,因此从左到右对轮廓进行排序可以确保与参考对象对应的轮廓始终是cnts列表中的第一个。...列表中的每个轮廓进行循环。..., tr, br, bl) = box (tlblX, tlblY) = midpoint(tl, bl) (trbrX, trbrY) = midpoint(tr, br) #

    2K30

    使用OpenCV测量图像中物体之间的距离

    / 前两篇文章: 使用Python和OpenCV顺时针排序坐标 使用OpenCV测量图像中物体的大小 已经完成了测量物体大小的任务,今天进行最后一部分:计算图片中物体之间的距离。...上篇我们讨论了如何使用参考对象来测量图像中对象的大小。 这个参考对象应该有两个重要的特征,包括: 我们知道这个物体的尺寸(以英寸、毫米等表示)。 它很容易在我们的图像中被识别出来(根据位置或外观)。...由于我们知道0.25美分(即参考对象)将始终是图像中最左边,因此从左到右对轮廓进行排序可以确保与参考对象对应的轮廓始终是cnts列表中的第一个。...列表中的每个轮廓进行循环。..., tr, br, bl) = box (tlblX, tlblY) = midpoint(tl, bl) (trbrX, trbrY) = midpoint(tr, br) #

    5K40

    使用OpenCV测量图像中物体的大小

    上篇,我们学习了一项重要的技术:将一组旋转的边界框坐标按左上、右上、右下和左下排列的可靠性如何。 今天我们将利用这一技术来帮助我们计算图像中物体的大小。请务必阅读整篇文章,看看是如何做到的!...测量图像中物体的大小类似于计算相机到物体的距离——在这两种情况下,我们都需要定义一个比率来测量每个计算对象的像素数。 我将其称为“像素/度量”比率,我将在下面中对其进行更正式的定义。...通过保证0.25美分是最左边的对象,我们可以从左到右排序我们的对象轮廓,获取美分(它总是排序列表中的第一个轮廓),并使用它来定义pixels_per_metric,我们定义为: pixels_per_metric...然后在第16行从左到右(允许我们提取参考对象)对这些轮廓进行排序。我们还在第17行初始化了pixelsPerMetric值。..., tr, br, bl) = box (tltrX, tltrY) = midpoint(tl, tr) (blbrX, blbrY) = midpoint(bl, br) # compute

    2.7K20

    OpenCV测量物体的尺寸技能 get~

    通过确保硬币是最左边的物体,我们可以从左到右对物体轮廓进行排序,获取硬币(始终是排序列表中的第一个轮廓),并使用它定义每个单位的像素数,我们将其定义为: pixels_per_metric = 物体图上所占的像素数...现在我们已经对边界框进行了排序,我们可以计算一系列的中点: # 打开有序的边界框,然后计算左上和右上坐标之间的中点, # 再计算左下和右下坐标之间的中点 (tl, tr, br,...bl) = box (tltrX, tltrY) = midpoint(tl, tr) (blbrX, blbrY) = midpoint(bl, br) # 计算左上点和右上点之间的中点...# 然后是右上角和右下角之间的中点 (tlblX, tlblY) = midpoint(tl, bl) (trbrX, trbrY) = midpoint(tr, br) # 在图中画出中点...总结 在本文中,我们学习了如何通过使用python和OpenCV来测量图片中的物体的大小。

    2.9K20

    利用Python开发智能阅卷系统(附源代码)

    本文为“机器学习交流群”群友华兵同学投稿 随着现代图像处理和人工智能技术的快速发展,不少学者尝试讲CV应用到教学领域,能够代替老师去阅卷,将老师从繁杂劳累的阅卷中解放出来,从而进一步有效的推动教学质量上一个台阶...3, 4: 1} # def order_points(pts): # 一共4个坐标点 rect = np.zeros((4, 2), dtype = "float32") # 按顺序找到对应坐标..., tr, br, bl) = rect # 计算输入的w和h值 widthA = np.sqrt(((br[0]-bl[0])** 2) + ((br[1]-bl[1])**2))...widthB = np.sqrt(((tr[0] -tl[0]) ** 2) + ((tr[1] - tl[1]) ** 2)) maxWidth = max(int(widthA), int(widthB...)) heightA = np.sqrt(((tr[0]-br[0])**2)+((tr[1]-br[1])**2)) heightB = np.sqrt(((tl[0]-bl[0])**2

    2.1K30

    系列 | OpenVINO视觉加速库使用二

    Tensorflow层支持 模型优化器对各种深度学习框架模型的支持并非是100%的,以tensorflow为例,只有下面这些层构建的模型才可以被模型优化器转换为中间层IR(.xml与.bin文件),R5...版本支持的层列表如下: ?...02 导出PB文件或者冻结预测图 如果不知道如何操作可以看我们公众号以前的文章即可,文章链接如下: Tensorflow如何导出与使用预测图 tensorflow模型导出与OpenCV DNN中使用...03 使用模型优化器生成脚本生成IR文件 xml文件-描述网络拓扑结构 bin文件-包含权重参数的二进制文件 打开cmd命令行,首先到openvino安装好的模型优化器目录下 顺序 上述的运行脚本与参数只能支持tensorflow本身的导出PB文件,对tensorflow对象检测框架中的预训练模型与自定义训练生成的模型无法正确生成IR。

    3.5K51

    有趣的Processing“区块链”鸟-源码解析

    )左上 // top-right(tr)右上 // bottom-right(br)右下 // bottom-left(bl)左下 rect(a, b, c, d, tl, tr, br, bl)...COLS = createCols(URL[frameCount % URL.length]); // 对数组进行洗牌操作,打乱颜色的顺序,这样即使使用了同一个url中的色彩值,按照数组索引编号取到的颜色值具有随机性...鸟的 body 的两个 rect 的使用的是这4种模式进行随机,方法为drawRectTile: function drawRectTile(x, y, w, h) { const fn = int...3)使用随机因子 颜色-颜色组、洗牌打乱 长宽 位置 图案模式-多增加一些图案效果,封装在不同的函数中,随机获取图案模式,进行绘制 勇敢的尝试 真不容易,恭喜你,亲爱的读者,居然能够读到这里还没有关掉页面...既然都读到这里了,不妨给自己命个题,使用同样的思路绘制一个其他动物,如何?敢试试么?

    86030

    使用TensorFlow物体检测模型、Python和OpenCV的社交距离检测器

    学习OpenCV的过程中,小伙伴们应该知道对于一些小型项目OpenCV具有很强大的功能,其中一个就是对图片进行鸟瞰转换,鸟瞰图是对一个场景自上而下的表示,也是构建自动驾驶应用程序时经常需要执行的任务。...可用模型的非详尽清单 模型的预测速度不同,性能表现也不同。为了决定如何根据模型的预测速度来利用模型,我进行了一些测试。...我使用了Adrian Rosebrock的教程 来了解如何做到这一点:https://www.pyimagesearch.com/2014/08/25/4-point-opencv-getperspective-transform-example...,从这个列表中,计算每对点之间的距离。...这里我使用了itertools库的Combination()函数,该函数允许在列表中获取所有可能的组合而无需保留双精度。

    1.4K10

    Opencv实现透视形变

    现在,这已经不成问题了,让我们就来看看如何使用 OpenCV 和 Python 来实现这一点。 在进入代码的主要部分之前,我们必须首先导入必要的库。...使用这种方法,我们将首先显示基础图像,然后我们可以手动选择图像中的四个点作为目标。我们的主题图像会扭曲到这个目标上,按下鼠标左键时记录坐标,这些存储在我们之前初始化的点数组中。...选定的点以红点突出显示,如下所示。 选择角点 众所周知,我们每个人都可以按任意顺序选择 4 个点。因此需要在所选点之间保持恒定的排序。...我选择以顺时针方式对点进行排序,即从左上到右上,再到右下然后到左下,这是通过如下所示的sort_pts()方法实现的。我们使用以下事实:x 和 y 坐标的总和在左上角最小,在右下角最大。...我们创建一个名为“pts1”的 numpy 数组,它保存了主题图像的四个角的坐标。同样,我们创建一个名为“pts2”的列表,其中包含已排序的点。

    74860

    我是这样搞定第一次单目相机测距的

    但是在实际相机中,成像平面就是相机感光芯片,针孔就是透镜,然而主点却并不再在成像平面的中心了(也就是透镜光轴与感光芯片中心并不在一条线上了),因为在实际制作中我们是无法做到将相机里面的成像装置以微米级别的精度进行安装的...,因此我们需要引入两个新的参数Cx和Cy,来对我们硬件的偏移进行矫正: ?...通过上面的式子,我们可以将空间中的点和图片中的点一一对应起来。式中的矩阵M就是我们常听说的相机内参矩阵了。...PnP方法测距 好了到此我们对相机的那点事儿有了一点点的了解了,那什么是PnP问题呢?..., 0), //br cv::Point3f(-HALF_LENGTH, HALF_LENGTH, 0) //bl }; //自定义二维码四个点坐标 cv::Mat

    6.4K91

    WEB入门之十六 操作DOM节点

    节点是DOM中最基本的组成单位,每个标签、每个文本都可以看成是一个节点。本章将学习使用jQuery对DOM节点进行操作。 ​...,当单击按钮时通过clone函数把第一个下拉列表框的选中项,复制到了另一个下拉列表框中。...个元素 slice( ) 按起始索引获取匹配元素中的子集 下面通过一个示例来演示eq、first、last和slice函数的用法,这几个函数有个共同点:都是通过索引进行过滤的。...任务实训部分​ 1:动态管理树形菜单 ​训练技能点​ Ø jQuery节点操作 ​需求说明​ 使用jQuery节点操作函数对树形菜单进行动态添加和删除,如图7.2.1所示。...Ø jQuery节点操作 ​需求说明​ 使用jQuery节点操作函数对行进行动态添加和删除。 ​

    9310

    WEB入门之十六 操作DOM节点

    节点是DOM中最基本的组成单位,每个标签、每个文本都可以看成是一个节点。本章将学习使用jQuery对DOM节点进行操作。...,当单击按钮时通过clone函数把第一个下拉列表框的选中项,复制到了另一个下拉列表框中。...slice( ) 按起始索引获取匹配元素中的子集 下面通过一个示例来演示eq、first、last和slice函数的用法,这几个函数有个共同点:都是通过索引进行过滤的。...任务实训部分 1:动态管理树形菜单 训练技能点 Ø jQuery节点操作 需求说明 使用jQuery节点操作函数对树形菜单进行动态添加和删除,如图7.2.1所示。...Ø jQuery节点操作 需求说明 使用jQuery节点操作函数对行进行动态添加和删除。

    7410

    创新工具:2024年开发者必备的一款表格控件(二)

    自定义排序顺序和多列排序 GcExcel 模板长期以来一直支持使用语法定义模板单元格中的排序方向来对模板数据进行排序。...但实际上场景中,需要根据其他单元格的值对单元格进行排序,且进一步需求使用多个单元格值对数据进行排序的能力。...为了满足这种需求,GcExcel 扩展了语法,使其能够同时包含多个排序条件,而不是使用不同的排序条件多次进行模板填充。...支持的多种情况包括: 根据其他列的顺序对当前列进行排序 根据多个其他列的顺序对当前列进行排序 自定义排序顺序 以下示例中,将按日期(列C)升序排序列A中的数据,然后按销售额(列D)降序排序。...以下是如何使用 DrawSlantedText 方法在 PDF 文档中绘制倾斜矩形中的文本的基本代码(参见后面的图片)。

    14310
    领券