采用OpenCv——多边形等距收缩实现

摘要最近由于公司业务需求,需要实现对一个多边形进行等距收缩一定距离,其实现效果图大致如下: 虽然单点距离貌似收缩情况不太正确,不过看起来还是蛮顺眼的。反正领导看到一眼就说他要这样的,好嘞,小二马上给你搞。由于OpenCv针对于图形处理具有较多优秀的算法,并且当时找到一篇收缩算法正是用这个玩意做的,于是参考该作者的C++代码,实现了一版Java对应的版本。由于OpenCv是C++函数库,并...
摘要由CSDN通过智能技术生成
摘要

最近由于公司业务需求,需要实现对一个多边形进行等距收缩一定距离,其实现效果图大致如下:
这里写图片描述
虽然单点距离貌似收缩情况不太正确,不过看起来还是蛮顺眼的。反正领导看到一眼就说他要这样的,好嘞,小二马上给你搞。由于OpenCv针对于图形处理具有较多优秀的算法,并且当时找到一篇收缩算法正是用这个玩意做的,于是参考该作者的C++代码,地址:https://blog.csdn.net/dcrmg/article/details/52517991,实现了一版Java对应的版本。由于OpenCv是C++函数库,并且对于Java的Api并没有太多的中文资料,所以本就菜鸟的作者也是花费不少时间才搞出来,所以在介绍收缩之前需安装OpenCv相关环境,可以参考本人博客:安装OpenCv环境

注意事项:其实安装OpenCv不管是在windows、MacOs还是Linux环境下都并不难,只需要两部分即可:1、OpenCv本身的C++函数库。2、OpenCv对于Java支持的Jar。

七夕大家都回家玩游戏陪女朋友,我特码还在公司看代码,还写个鸡毛博客,眼泪不争气地流了下来,算了没心情了,待更吧……


续更……
哈哈哈,经过几天的恢复,我胡汉三又回来啦,先把收缩相关代码贴出来给大伙尝尝鲜。

package com.lanxuewei.utils.opencv;

import static org.opencv.core.CvType.CV_32FC1;
import static org.opencv.core.CvType.CV_8UC1;
import static org.opencv.imgproc.Imgproc.*;

import java.awt.*;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import com.lanxuewei.utils.json.AiResultJsonModel;
import org.opencv.core.*;
import org.opencv.core.Point;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;


/**
 * @author lanxuewei Create in 2018/7/30 17:29
 * Description: 多边形等距收缩(需使用openCv,所以需要在支持openCv环境下使用) 
 */
public class PolygonScaleHelper {
   

    static {
        System.loadLibrary(Core.NATIVE_LIBRARY_NAME);               // 加载opencv的库
    }

    private static final Logger logger = LoggerFactory.getLogger(PolygonScaleHelper.class);


    /** x、y坐标最大最小值常量字符串 */
    private static final String XMax = "xMax";
    private static final String XMin = "xMin";
    private static final String YMax = "yMax";
    private static final String YMin = "yMin";

    /** List<Double>坐标中xy对应下标志 */
    private static final int X = 0;
    private static final int Y = 1;

    /** 平移时距离边框留白距离 */
    private static int PADDING = 10;

    /**
     * 更新多边形(收缩)
     *
     * @param points 多边形坐标集
     * @param scale 收缩比
     */
    public static List<List<Double>> updatePolygonByScale(List<List<Double>> points, float scale) {
        /**
         * 1.获取xy最大最小值
         * 2.平移坐标
         * 3.矩阵变换
         * 4.平移坐标
         */
        List<List<Double>> resultPoints = new ArrayList<>();
        if (points != null && points.size() > 0) {                  // 坐标不为空才进行处理
            List<MatOfPoint> matOfPoints = new ArrayList<>();       // 将List<Point>转化为List<
  • 1
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值