使用Emgu CV我从道路网络图像中的轮廓中提取了一组闭合多边形.多边形代表道路轮廓.结果如下所示,绘制在OpenStreetMaps地图上(来自Emgu CV的'像素'形式的多边形已转换为要绘制的纬度/经度形式).
代表道路轮廓的多边形集:
我现在想要计算这组多边形的Voronoi图,这将帮助我找到道路的中心线.但在Emgu CV中,我只能找到一种方法来获得一组点的Voronoi图.这是通过找到点集的Delaunay三角剖分(使用Subdiv2D类)然后使用GetVoronoiFacets计算voronoi面来完成的.
我已经尝试计算由集合中所有多边形定义的点的Voronoi图(每个多边形是一个点列表),但这给了我一个非常复杂的Voronoi图,正如人们可能期望的那样:
点集的Voronoi图:
该图像显示了第一张图片的较小部分(为清楚起见,因为它是如此复杂).事实上,图中的某些线条似乎代表了道路中心线,但是还有很多其他线路,很难找到提取"好"线的标准.
我面临的另一个潜在问题是,正如你应该能够从第一张图片中看出的那样,一些多边形在其他人的内部,所以我们不处于一组不相交的闭合多边形的标准情况.也就是说,有时道路位于一个多边形的外边界和另一个多边形的内边界之间.
我正在寻找关于如何使用Emgu CV(或Open CV)计算多边形集的Voronoi图的建议,希望能够克服我已经概述的第二个问题.我也对其他建议如何在不使用Emgu CV的情况下实现这一点.
我正在寻找一种方法,在图像中找到脊(局部最大值)并将它们作为脊的阵列返回(其中脊是定义脊的点的矢量).也就是说,一种方法,其行为与findContours(它找到轮廓并将它们作为定义轮廓的矢量数组返回)完全相同,除了脊.
这是否存在,如果不存在,我将如何实现这种效果?(我正在使用OpenCV的Emgu CV包装器)
我有这个图像(它有点模糊,对不起),使用道路系统的二进制图像的距离变换获得:
我可以轻松地在原始二进制图像上使用findContours来获取道路轮廓作为点的向量.但是我对道路中心线很感兴趣.道路中心线由上面的图像的局部最大值表示.
显然,在这张图片上使用findContours再次为我提供了道路轮廓.我打算使用非最大值抑制除去中心线以外的所有内容,并使用findContours,但我不知道如何进行非最大值抑制,因此我的问题在这里
我正在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
,创建一个名为ClusterableStop
this的类:
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) 我有一个大熊猫的车辆坐标数据框(多天来自多辆车).对于每辆车和每天,我做两件事:要么对它应用算法,要么如果它不满足某些标准则完全从数据集中过滤掉它.
为了实现这一点,我使用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')
连续申请了.
有没有一种很好的方式可以写出来,而不必一遍又一遍地按相同的列分组?
我只是好奇,我想我会问这个问题。当我手动计算一组数据的协方差矩阵时,为什么我的值与 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)
类似,但不完全相同...
我在我的 Azure 管道中运行了一个相当大的构建,它涉及处理大量数据,因此我的构建代理需要太多内存来处理。因此,我的方法是启动一个 linux VM,在那里运行构建,然后将生成的 docker 映像推送到我的容器注册表。
为了实现这一点,我使用Azure CLI 任务向 VM 发出命令(例如az vm start
,az 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 管道任务失败。我将如何实现这一目标? …