小编Chr*_*ais的帖子

Emgu CV(或OpenCV)中多边形集的Voronoi图

使用Emgu CV我从道路网络图像中的轮廓中提取了一组闭合多边形.多边形代表道路轮廓.结果如下所示,绘制在OpenStreetMaps地图上(来自Emgu CV的'像素'形式的多边形已转换为要绘制的纬度/经度形式).

代表道路轮廓的多边形集:

在此输入图像描述

我现在想要计算这组多边形的Voronoi图,这将帮助我找到道路的中心线.但在Emgu CV中,我只能找到一种方法来获得一组点的Voronoi图.这是通过找到点集的Delaunay三角剖分(使用Subdiv2D类)然后使用GetVoronoiFacets计算voronoi面来完成的.

我已经尝试计算由集合中所有多边形定义的的Voronoi图(每个多边形是一个点列表),但这给了我一个非常复杂的Voronoi图,正如人们可能期望的那样:

点集的Voronoi图:

在此输入图像描述

该图像显示了第一张图片的较小部分(为清楚起见,因为它是如此复杂).事实上,图中的某些线条似乎代表了道路中心线,但是还有很多其他线路,很难找到提取"好"线的标准.

我面临的另一个潜在问题是,正如你应该能够从第一张图片中看出的那样,一些多边形在其他人的内部,所以我们不处于一组不相交的闭合多边形的标准情况.也就是说,有时道路位于一个多边形的外边界和另一个多边形的内边界之间.

我正在寻找关于如何使用Emgu CV(或Open CV)计算多边形集的Voronoi图的建议,希望能够克服我已经概述的第二个问题.我也对其他建议如何在不使用Emgu CV的情况下实现这一点.

opencv voronoi polygons emgucv

10
推荐指数
1
解决办法
504
查看次数

跟随OpenCV的山脊 - 返回'ridges'阵列

我正在寻找一种方法,在图像中找到脊(局部最大值)并将它们作为脊的阵列返回(其中脊是定义脊的点的矢量).也就是说,一种方法,其行为与findContours(它找到轮廓并将它们作为定义轮廓的矢量数组返回)完全相同,除了脊.

这是否存在,如果不存在,我将如何实现这种效果?(我正在使用OpenCV的Emgu CV包装器)

我有这个图像(它有点模糊,对不起),使用道路系统的二进制图像的距离变换获得:

道路系统二值图像的距离变换

我可以轻松地在原始二进制图像上使用findContours来获取道路轮廓作为点的向量.但是我对道路中心线很感兴趣.道路中心线由上面的图像的局部最大值表示.

显然,在这张图片上使用findContours再次为我提供了道路轮廓.我打算使用非最大值抑制除去中心线以外的所有内容,并使用findContours,但我不知道如何进行非最大值抑制,因此我的问题在这里

opencv image-processing emgucv

5
推荐指数
1
解决办法
683
查看次数

传入并返回自定义数据 - 接口是否正确?

我正在C#库中编写代码来对(二维)数据集进行聚类 - 实际上是将数据分成组或集群.为了有用,库需要接收"通用"或"自定义"数据,对其进行聚类并返回聚簇数据.

为此,我需要假设传入的数据集中的每个数据都有一个与之关联的2D向量(在我的例子中Lat,Lng- 我正在使用坐标).

我的第一个想法是使用泛型类型,并传入两个列表,一个通用数据列表(即List<T>)和另一个指定2D向量的相同长度(即List<Coordinate>,Coordinate我的类用于指定lat,lng对),其中列表通过索引彼此对应.但这是相当繁琐的,因为这意味着在算法中我必须以某种方式跟踪这些指数.

我的下一个想法是使用界面,我定义一个界面

public interface IPoint
{
    double Lat { get; set; }
    double Lng { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

并确保我传入的数据实现了这个接口(即我可以假设传入的每个数据都有a Lat和a Lng).

但这对我来说也不是很有效.我正在使用我的C#库来集中传输网络中的停靠点(在不同的项目中).该类被调用Stop,并且该类也来自外部库,因此我无法实现该类的接口.

我所做的就是从中继承Stop,创建一个名为ClusterableStopthis的类:

public class ClusterableStop : GTFS.Entities.Stop, IPoint
{        

    public ClusterableStop(Stop stop)
    {
        Id = stop.Id;
        Code = stop.Code;
        Name = stop.Name;
        Description = stop.Description;
        Latitude = stop.Latitude;
        Longitude = stop.Longitude;
        Zone = stop.Zone; …
Run Code Online (Sandbox Code Playgroud)

c# generics interface

5
推荐指数
1
解决办法
59
查看次数

以声明式处理pandas数据

我有一个大熊猫的车辆坐标数据框(多天来自多辆车).对于每辆车和每天,我做两件事:要么对它应用算法,要么如果它不满足某些标准则完全从数据集中过滤掉它.

为了实现这一点,我使用df.groupby('vehicle_id', 'day')和然后.apply(algorithm).filter(condition) 在哪里,algorithm并且condition是接收数据帧的函数.

我希望我的数据集(涉及多个.apply.filter步骤)的完整处理以一种声明的方式写出来,而不是强制循环遍历这些组,整个目标看起来像:

df.group_by('vehicle_id', 'day').apply(algorithm1).filter(condition1).apply(algorithm2).filter(condition2)

当然,上面的代码是不正确的,因为.apply().filter()返回新的数据帧,这正是我的问题.他们将所有数据返回到一个数据帧中,我发现我已经.groupby('vehicle_id', 'day')连续申请了.

有没有一种很好的方式可以写出来,而不必一遍又一遍地按相同的列分组?

declarative dataframe pandas

5
推荐指数
1
解决办法
180
查看次数

为什么numpy的协方差与手动计算略有不同?

我只是好奇,我想我会问这个问题。当我手动计算一组数据的协方差矩阵时,为什么我的值与 numpy 的值略有不同?

我有两组X数据Y

data = io.loadmat("datafile.mat")['data']
X = data[:,0]
Y = data[:,1]
Run Code Online (Sandbox Code Playgroud)

协方差矩阵可以这样计算(通过查看 X 和 X、X 和 Y、Y 和 X 等之间的相关性)

n = len(X)
corXX = np.var(X)
corXY = (1/n)*np.dot(X - np.mean(X), Y - np.mean(Y))
corYY = np.var(Y)
covariance = np.array([[corXX, corXY], [corXY, corYY] ])
Run Code Online (Sandbox Code Playgroud)

对于我的数据集,这给了我:

array([[ 1.722105  ,  5.34104265],
   [ 5.34104265, 17.72717759]])
Run Code Online (Sandbox Code Playgroud)

而使用 numpy 的协方差函数covariance = np.cov(X,Y)给了我

array([[  1.7395    ,   5.39499258],
   [  5.39499258,  17.90623999]]) 
Run Code Online (Sandbox Code Playgroud)

类似,但不完全相同...

python numpy

5
推荐指数
1
解决办法
3303
查看次数

从 Azure 管道中的“az vm run-command”获取退出代码

我在我的 Azure 管道中运行了一个相当大的构建,它涉及处理大量数据,因此我的构建代理需要太多内存来处理。因此,我的方法是启动一个 linux VM,在那里运行构建,然后将生成的 docker 映像推送到我的容器注册表。

为了实现这一点,我使用Azure CLI 任务向 VM 发出命令(例如az vm startaz vm run-command ...等)。

我面临的问题是,az vm run-command即使您在 VM 上运行的脚本返回非零状态代码,它也会“成功”。例如,这个“坏”的虚拟机脚本:

az vm run-command invoke -g <group> -n <vmName> --command-id RunShellScript --scripts "cd /nonexistent/path"
Run Code Online (Sandbox Code Playgroud)

返回以下响应:

{
  "value": [
    {
      "code": "ProvisioningState/succeeded",
      "displayStatus": "Provisioning succeeded",
      "level": "Info",
      "message": "Enable succeeded: \n[stdout]\n\n[stderr]\n/var/lib/waagent/run-command/download/87/script.sh: 1: cd: can't cd to /nonexistent/path\n",
      "time": null
    }
  ]
}
Run Code Online (Sandbox Code Playgroud)

因此,该命令成功了,大概是因为它成功地在 VM 上执行了脚本。脚本实际上在 VM 上失败的事实隐藏在响应“消息”中

如果 VM 上的脚本返回非零状态代码,我希望我的 Azure 管道任务失败。我将如何实现这一目标? …

azure azure-cli azure-devops azure-pipelines azure-vm

5
推荐指数
1
解决办法
410
查看次数