我看基本全都是根据 起始点的 xy 坐标 和矩形的长宽来截取的, 有没有 通过四个坐标点 如 (x1,y1)(x2,y2)(x3,y3)(x4,y4) 来截取矩形的方法?
1
Xusually 2020-03-27 15:41:13 +08:00
你描述的其实是一回事儿啊。你四个点也需要截取矩形的话,起始点你选一个,其他长宽根据剩余的点就算出来了。
|
2
qiayue 2020-03-27 15:43:00 +08:00
根据四个点计算旋转角度,把图片旋转之后再截图
|
3
wangxiaoaer 2020-03-27 15:44:18 +08:00 via Android
外接矩形?
|
4
littleylv 2020-03-27 15:44:59 +08:00
楼主的意思是斜着截的那种?
不然给 4 个点和给起始+长宽,不是同一个概念么? |
7
Mithril 2020-03-27 15:49:01 +08:00
做不到的。
你这四个点围出来的都不一定是个凸多边形。 多学学数学吧少年。。。 |
9
cccy0 OP ![GPJbnI.png]( https://s1.ax1x.com/2020/03/27/GPJbnI.png)
可能是这样子斜着的 |
10
woodensail 2020-03-27 15:56:12 +08:00
楼上说的是不一定是个「凸」多边形。
也就是说你可能围出一个回力标的形状。 |
11
Xusually 2020-03-27 15:56:45 +08:00
@cccy0 #7 的意思是你只给四个点的话,可能不是一个凸多边形。比如你设想一个三角形的三个顶点,再加上一个三角形内部的一个点,这四个点就不能构成一个凸多边形。
|
12
cccy0 OP @woodensail #10 四个点是有顺序的
|
14
Mithril 2020-03-27 16:00:48 +08:00
@cccy0 四个独立点,不是一定可以围成凸多边形的。。。
你先百度一下凸多边形是个啥。 比如四个点,顺时针标记为 ABCD,那么多边形 ABCD 和多边形 ACBD 并不是同一个图形。同时你要定义好什么叫“内部”什么叫“外部”。 本质上是个图形学问题,跟你用什么语言没关系。 最简单的就是直接画个矩形的外接框,然后遍历这框里面所有点判断是否在多边形内。一般的话射线法就可以,不过同样有很多的细节情况需要考虑和处理。 |
15
luckyrayyy 2020-03-27 16:01:47 +08:00
倒是个有意思的问题,完全可以自己写个工具啊
|
17
cccy0 OP |
18
cccy0 OP 就是上面这个阿里云的 API, 需要把识别出来的人脸部分图片 截取出来
|
19
littleylv 2020-03-27 16:05:31 +08:00
根据四点,得到一个角度,把原图旋转这个角度,使其中两点的连线与 x 轴平行,就回到了正常的“原点+长宽”截图的情况了
@cccy0 #8 |
20
Xusually 2020-03-27 16:05:32 +08:00
@cccy0 如果确认只是矩形的话,最简单的办法楼上提到了,计算好旋转量,旋转到一边和 x/y 轴平行后用普通的裁切。
如果不一定是矩形,可能是某个普通的凸四边形的话,外接普通矩形定界,遍历,留意边界。 |
21
cccy0 OP 他返回的这个点, 是矩阵旋转之前的点
|
22
jmc891205 2020-03-27 16:12:30 +08:00 via iPhone
就截一个水平的外接矩形出来呗
多截的那些地方会影响到你? 斜着的直线会经过很多不完整的像素 处理起来很麻烦 |
23
woodensail 2020-03-27 16:18:58 +08:00
@cccy0 四个点,坐标分别是,[0,0] [10,0] [0,10] [1,1]
你来围一个凸多边形看看。 |
24
Mithril 2020-03-27 16:19:54 +08:00
这个倒是很简单。
因为原图肯定是矩形的,那么你就根据合适的分辨率新建一个矩形的图。 然后通过他给你的四个顶点位置,计算出来从新图坐标到你识别图坐标的变换矩阵。 然后遍历新图的每个像素,根据矩阵算出来原始图的像素坐标位置,插一下值。 这样一步操作可以连正畸加抠图全做了。 实际上核心就是算个透视变换的矩阵。 实在不会你可以 OpenCV 扣个代码改成 Java 的。 |
25
jifengg 2020-04-04 21:37:20 +08:00
我觉得楼主可以搜索”多边形截取”,应该能得到你要的结果
|