首页
学习
活动
专区
工具
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.7K20
  • 使用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) #

    4.9K40

    使用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.6K20

    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.8K20

    利用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

    2K30

    系列 | OpenVINO视觉加速库使用

    Tensorflow层支持 模型优化器各种深度学习框架模型支持并非是100%tensorflow为例,只有下面这些层构建模型才可以被模型优化器转换为中间层IR(.xml与.bin文件),R5...版本支持列表如下: ?...02 导出PB文件或者冻结预测图 如果不知道如何操作可以看我们公众号以前文章即可,文章链接如下: Tensorflow如何导出与使用预测图 tensorflow模型导出与OpenCV DNN中使用...03 使用模型优化器生成脚本生成IR文件 xml文件-描述网络拓扑结构 bin文件-包含权重参数二进制文件 打开cmd命令行,首先到openvino安装好模型优化器目录下 <INSTALL_DIR...表示交换R与B通道顺序 上述运行脚本与参数只能支持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)使用随机因子 颜色-颜色组、洗牌打乱 长宽 位置 图案模式-多增加一些图案效果,封装在不同函数,随机获取图案模式,进行绘制 勇敢尝试 真不容易,恭喜你,亲爱读者,居然能够读到这里还没有关掉页面...既然都读到这里了,不妨给自己命个题,使用同样思路绘制一个其他动物,如何?敢试试么?

    85430

    使用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”列表,其中包含排序

    73660

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

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

    6.1K91

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

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

    12810

    【Python100天学习笔记】Day7 字符串和常用数据结构

    接下来我们要介绍列表(list),也是一种结构化、非标量类型,它是值有序序列,每个值都可以通过索引进行标识,定义列表可以将列表元素放在[],多个元素用,进行分隔,可以使用for循环列表元素进行遍历...) 下面的代码演示了如何列表添加元素以及如何列表移除元素。...# 函数设计就应该像sorted函数一样尽可能不产生副作用 list3 = sorted(list1, reverse=True) # 通过key关键字参数指定根据字符串长度进行排序而不是默认字母表顺序...' ', 'TR': ' ', 'ML': ' ', 'MM': ' ', 'MR': ' ', 'BL': ' ', 'BM': ' ', 'BR': ' '...Python将日常工作自动化的人来说还是不错选择),代码做了一调整。

    32910

    生成模型学习特征属性如何操作修改等介绍

    在我NVIDIA Titan X板上,花了8个小时来DIGITS200k图像数据集进行了60个历元。...用生成对话网络进行图像重建 我使用我经过训练模型来生成数据集中前25个图像重建。图4显示了原始和重建图像。让我们回顾一下在那里发生事情:我将每个图像都输入到E找到相应z向量。...由于CelebA图像已经被标记,所以在数据集上尝试这一是不公平,但是我认为在现实世界尝试它是有趣。我再次使用E找到我输入图像z向量。...我GAN-Auto-Encoder框架允许我图像执行相同类比,在潜在空间中使用简单算术。看看图7,看看你在实践如何工作令人惊讶(从[3]借来方法)。表2引导您完成整个过程。...花一些时间思考这个比喻美丽。 ? 图7:类比网格:左上角(TL),右上(TR)和左下(BL)图像作为输入。右下(BR)图像是计算结果:BR = BL + TR-TL

    1K20
    领券