如何用代码表示图像上的一个范围?并看一个点是否在该范围内?

2020-06-05 16:34:39 +08:00
 Zhepro
有一张底图,希望能在上面用代码表示一个范围,并计算一个坐标是否在该范围内,怎么办?

目前的思路是用几个长方形和圆形拼接,但是很不精确,有更好的方法吗?
3028 次点击
所在节点    Python
15 条回复
Latin
2020-06-05 17:00:36 +08:00
绘制多边形啊
sivacohan
2020-06-05 17:06:57 +08:00
python cv2
图像就是一个二维数组,你就是检查数组里面某个特征点是否落在指定的 Index 范围。
Latin
2020-06-05 17:07:42 +08:00
判断点是否在多边形区域内的方法
https://paste.ubuntu.com/p/dbPJBCcf7j/
MLLB
2020-06-05 17:16:09 +08:00
numpy.array
littleylv
2020-06-05 17:22:35 +08:00
针对凸多边形,任意形状,任意边数,只需要知道连续的顶点的坐标,[x0,y0],[x1,y1]...[xn,yn]
对任意点[x,y],有一套算法可以得出[x,y]是否在多边形范围内
arrow8899
2020-06-05 17:26:36 +08:00
point in polygon 问题,github 上搜一大把
https://www.algorithms-and-technologies.com/point_in_polygon/
不过要注意一些特殊情况,比如点重合,点在边上等,然后结合需求修改代码。
RealMadrid
2020-06-06 08:07:31 +08:00
用 python 的话,可以用 matplotlib 里面 path,来判断点是否在一个多边形里
from matplotlib import path
def is_point_in_polygon(point, polygon):
p = path.Path(polygon)
return p.contains_point(point)
qile1
2020-06-06 10:14:25 +08:00
图像转为坐标点,然后判断两次 x 和 y 是否大于最大值是不是就可以,这个点你如何获取?
qile1
2020-06-06 10:39:55 +08:00
https://www.v2ex.com/t/674900#;
楼上几位大佬能不能帮看看我这个问题,谢谢
aguesuka
2020-06-06 15:29:47 +08:00
这是个很大的问题,计算机图形学的核心问题之一
tblxdezhu
2020-06-07 21:27:28 +08:00
楼上的都不知道这个库吗? Shapely,实例化 Point
文档在此: https://shapely.readthedocs.io/en/latest/manual.html
necomancer
2020-06-08 10:29:45 +08:00
1. 获取区域 pointcloud 的坐标,这个想办法,或者找现成工具例如 datathief;
2. 用 scipy 的 convex hull 模块生成 hull = convexhull(pointcloud);
3. 判断使用 point_in_hull = np.allclose([p.dot(_[:-1]) for _ in hull.equations],0)

如果不是用 Point cloud 表示一个奇怪的形状,而是有方程描述,直接用方程。尤其对形状有线性方程描述,直接使用上述的 3 就可以了。
necomancer
2020-06-08 10:34:36 +08:00
不是数据坐标的话,就用像素坐标
necomancer
2020-06-08 10:43:27 +08:00
我弄错了一个地方……sorry,应该是 np.all(hull.equations[:,:-1].dot(p) + hull.equations.T[-1] < 0)

The convex hull of a point set P is the smallest convex set that contains P. If P is finite, the convex hull defines a matrix A and a vector b such that for all x in P, Ax+b <= [0,...].

Qhull 的文档,我给搞成等于 0 了。
necomancer
2020-06-08 10:53:37 +08:00
np.all(np.less_equal(np.einsum('ij,...j->...i', hull.equations[:,:-1], <array(N_points, N_dimension)>) + hull.equations.T[-1], 0), axis=-1),可以做批量判断,numpy 的处理比 for 循环快很多。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/679023

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX