摘要
最近由于公司业务需求,需要实现对一个多边形进行等距收缩一定距离,其实现效果图大致如下:
虽然单点距离貌似收缩情况不太正确,不过看起来还是蛮顺眼的。反正领导看到一眼就说他要这样的,好嘞,小二马上给你搞。由于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<