图片任意凸体区域识别

这个是通过数学方法【基于凸体的定义】实现假的图片识别,比如:我们在一个小区俯视图中,需要

通过点击图中的某个楼栋,需要得到这个楼栋的信息,比如我点击了15号楼,程序需要知道点的是15号楼。

而且支持图片的等比例缩放功能。这样可以满足实际中的图片拖动,放大缩小等等操作。

凸体的定义: 在凸几何中,凸集(convex set)是在凸组合下闭合的仿射空间的子集。更具体地说,在欧氏空间中,凸集是对于集合内的每一对点,连接该对点的直线段上的每个点也在该集合内。例如,立方体是凸集,但是任何中空的或具有凹痕的例如月牙形都不是凸集。

基于上面的凸体定义,实现方式如下:

1、首先采集需要识别的区域,比如在图中采集游轮的区域。



v2-8f02f2cfeeb2ec3e3cdab681b9721105_b.jpg


图1 采集游轮区域

假设采集的数据如下:

{"points":[{"x":475,"y":449},{"x":660,"y":439},{"x":626,"y":394},{"x":489,"y":399},{"x":493,"y":505},{"x":586,"y":515},{"x":594,"y":484}]};

注意: 此采集的点所构造的区域必须是一个凸体。

2、当用户点击图片时,判断用户的点击是否在此间的区域中。



v2-621f562842ac184d97f898356bf650f3_b.jpg


图二、判断所在区域

由上面采集的区域可构造一个凸型区域,假设用户点击了A点、B 点。现在如何判断A、B点与所构造区域的关系。

已知图形是由点R={a,b,c,d,e,f,g}依次链接所得。

1、判断A点是否在图形内部:

1)以a,b作为一条直线,判断A点与点R中除了a、b以为的所有点是否在同一侧。比如判断a,b所构造的直线下,A点与c点是否在直线的同一侧。若不在同一侧,说明A点一定不在图形中,若在同一侧,则判断A点与d点,依次下去,知道判断A点与g点为止。

2)、将a点换成b点,b换成c。执行1. 若一直判断都是true,则说明点A在图形中。否则表示在图形外。

经过上面的运行,可以得到A点在直线a,b下,与其他的cdefg都在同一侧,依次类推。在b、c直线下,在c、d直线下..... 在g、a直线下有A点与b、c、d、e、f都处于同一侧。故可以得到A点在图形内部。

而B点可以发现在直线d、e下,a点与B点处于直线的两侧。故在图形外部。


由此在多个图形下面,当然可以一个一个图形的去判断点与图的位置关系了



v2-6530f0391762d92b5d0f28c47b68578b_b.jpg


图三、多凸体情况下面的区域查找


最后附上我实现的代码:

gitee.com/pdycx/front.g

代码实现了凸体采集,已经应用。采集的时候会判断采集的图形是否凸体

发布了32 篇原创文章 · 获赞 2 · 访问量 8856
展开阅读全文

没有更多推荐了,返回首页

©️2019 CSDN 皮肤主题: 大白 设计师: CSDN官方博客

分享到微信朋友圈

×

扫一扫,手机浏览