V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
cccy0
V2EX  ›  问与答

Java 有什么能根据四个坐标点截取图片一部分的方法

  •  
  •   cccy0 · 2020-03-27 15:39:12 +08:00 · 1949 次点击
    这是一个创建于 1701 天前的主题,其中的信息可能已经有所发展或是发生改变。

    我看基本全都是根据 起始点的 xy 坐标 和矩形的长宽来截取的, 有没有 通过四个坐标点 如 (x1,y1)(x2,y2)(x3,y3)(x4,y4) 来截取矩形的方法?

    25 条回复    2020-04-04 21:37:20 +08:00
    Xusually
        1
    Xusually  
       2020-03-27 15:41:13 +08:00
    你描述的其实是一回事儿啊。你四个点也需要截取矩形的话,起始点你选一个,其他长宽根据剩余的点就算出来了。
    qiayue
        2
    qiayue  
       2020-03-27 15:43:00 +08:00
    根据四个点计算旋转角度,把图片旋转之后再截图
    wangxiaoaer
        3
    wangxiaoaer  
       2020-03-27 15:44:18 +08:00 via Android
    外接矩形?
    littleylv
        4
    littleylv  
       2020-03-27 15:44:59 +08:00
    楼主的意思是斜着截的那种?
    不然给 4 个点和给起始+长宽,不是同一个概念么?
    cccy0
        5
    cccy0  
    OP
       2020-03-27 15:45:59 +08:00
    @Xusually #1 说错了, 不一定是矩形, 可能是四个点围成的别的四边形
    cccy0
        6
    cccy0  
    OP
       2020-03-27 15:46:43 +08:00
    @littleylv #4 可能这四个点围起来的四边形是斜着的
    Mithril
        7
    Mithril  
       2020-03-27 15:49:01 +08:00
    做不到的。
    你这四个点围出来的都不一定是个凸多边形。
    多学学数学吧少年。。。
    cccy0
        8
    cccy0  
    OP
       2020-03-27 15:50:16 +08:00
    @Mithril #7 一定是个四边形的, 不存在 俩点 xy 相同的这种情况
    cccy0
        9
    cccy0  
    OP
       2020-03-27 15:52:52 +08:00
    ![GPJbnI.png]( https://s1.ax1x.com/2020/03/27/GPJbnI.png)
    可能是这样子斜着的
    woodensail
        10
    woodensail  
       2020-03-27 15:56:12 +08:00
    楼上说的是不一定是个「凸」多边形。
    也就是说你可能围出一个回力标的形状。
    Xusually
        11
    Xusually  
       2020-03-27 15:56:45 +08:00
    @cccy0 #7 的意思是你只给四个点的话,可能不是一个凸多边形。比如你设想一个三角形的三个顶点,再加上一个三角形内部的一个点,这四个点就不能构成一个凸多边形。
    cccy0
        12
    cccy0  
    OP
       2020-03-27 15:58:29 +08:00
    @woodensail #10 四个点是有顺序的
    cccy0
        13
    cccy0  
    OP
       2020-03-27 15:59:02 +08:00
    @Xusually #11 四个点是有顺序的, 不存在这种情况
    Mithril
        14
    Mithril  
       2020-03-27 16:00:48 +08:00
    @cccy0 四个独立点,不是一定可以围成凸多边形的。。。
    你先百度一下凸多边形是个啥。
    比如四个点,顺时针标记为 ABCD,那么多边形 ABCD 和多边形 ACBD 并不是同一个图形。同时你要定义好什么叫“内部”什么叫“外部”。
    本质上是个图形学问题,跟你用什么语言没关系。
    最简单的就是直接画个矩形的外接框,然后遍历这框里面所有点判断是否在多边形内。一般的话射线法就可以,不过同样有很多的细节情况需要考虑和处理。
    luckyrayyy
        15
    luckyrayyy  
       2020-03-27 16:01:47 +08:00
    倒是个有意思的问题,完全可以自己写个工具啊
    cccy0
        16
    cccy0  
    OP
       2020-03-27 16:04:07 +08:00
    @Mithril #14 哦哦,. 数学不是很好
    cccy0
        18
    cccy0  
    OP
       2020-03-27 16:04:46 +08:00
    就是上面这个阿里云的 API, 需要把识别出来的人脸部分图片 截取出来
    littleylv
        19
    littleylv  
       2020-03-27 16:05:31 +08:00
    根据四点,得到一个角度,把原图旋转这个角度,使其中两点的连线与 x 轴平行,就回到了正常的“原点+长宽”截图的情况了
    @cccy0 #8
    Xusually
        20
    Xusually  
       2020-03-27 16:05:32 +08:00
    @cccy0 如果确认只是矩形的话,最简单的办法楼上提到了,计算好旋转量,旋转到一边和 x/y 轴平行后用普通的裁切。
    如果不一定是矩形,可能是某个普通的凸四边形的话,外接普通矩形定界,遍历,留意边界。
    cccy0
        21
    cccy0  
    OP
       2020-03-27 16:05:59 +08:00
    他返回的这个点, 是矩阵旋转之前的点
    jmc891205
        22
    jmc891205  
       2020-03-27 16:12:30 +08:00 via iPhone
    就截一个水平的外接矩形出来呗
    多截的那些地方会影响到你?

    斜着的直线会经过很多不完整的像素 处理起来很麻烦
    woodensail
        23
    woodensail  
       2020-03-27 16:18:58 +08:00
    @cccy0 四个点,坐标分别是,[0,0] [10,0] [0,10] [1,1]
    你来围一个凸多边形看看。
    Mithril
        24
    Mithril  
       2020-03-27 16:19:54 +08:00
    这个倒是很简单。
    因为原图肯定是矩形的,那么你就根据合适的分辨率新建一个矩形的图。
    然后通过他给你的四个顶点位置,计算出来从新图坐标到你识别图坐标的变换矩阵。
    然后遍历新图的每个像素,根据矩阵算出来原始图的像素坐标位置,插一下值。
    这样一步操作可以连正畸加抠图全做了。

    实际上核心就是算个透视变换的矩阵。
    实在不会你可以 OpenCV 扣个代码改成 Java 的。
    jifengg
        25
    jifengg  
       2020-04-04 21:37:20 +08:00
    我觉得楼主可以搜索”多边形截取”,应该能得到你要的结果
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1039 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 27ms · UTC 23:10 · PVG 07:10 · LAX 15:10 · JFK 18:10
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.