pyclipper和ClipperLib操作多边型

目录

1. 等距离缩放多边形

1.1 python

1.2 c++


1. 等距离缩放多边形

1.1 python

环境配置

pip install opencv-python opencv-contrib-python
pip install pyclipper
pip install numpy
import cv2
import numpy as np
import pyclipper


def equidistant_zoom_contour(contour, margin):
    """
    等"距离"缩放多边形轮廓点
    :param contour: 一个图形的轮廓格式[[[x1, x2]],...],shape是(-1, 1, 2)
    :param margin: 轮廓外扩的像素距离,margin正数是外扩,负数是缩小
    :return: 外扩后的轮廓点
    """
    pco = pyclipper.PyclipperOffset()
    #  参数限制,默认成2,这里设置大一些,主要是用于多边形的尖角是否用圆角代替
    pco.MiterLimit = 10  # 2是圆角,10是尖角
    contour = contour[:, 0, :]
    pco.AddPath(contour, pyclipper.JT_MITER, pyclipper.ET_CLOSEDPOLYGON)
    solution = pco.Execute(margin)
    solution = np.array(solution).reshape(-1, 1, 2).astype(int)
    return solution


if __name__ == '__main__':
    poly = np.array([[[200, 200]], [[200, 300]], [[400, 350]], [[350, 200]], [[300, 200]], [[200, 100]]])
    contour1 = equidistant_zoom_contour(poly, 20)  # 等距离
    img = np.zeros((500, 500, 3))
    cv2.polylines(img, [contour1], True, (0, 255, 0), 3)
    cv2.polylines(img, [poly], True, (0, 0, 255), 3)

    cv2.namedWindow("img", cv2.WINDOW_NORMAL), cv2.imshow("img", img), cv2.waitKey()

参数MiterLimit=10是尖角(左图),默认值是2,圆角(右图) 

 

1.2 c++

第一版clipper: Download Clipper

最新版clipper2: https://github.com/AngusJohnson/Clipper2

官方介绍:https://angusj.com/clipper2/Docs/Overview.htm 

 (1)这里使用旧版clipper,下载后解压

(2)vs2019配置clipper环境,只需要添加包含目录即可。

(3) 添加现有clipper头文件和源码 clipper.cpp和clipper.hpp

#include <iostream>
#include <vector>
#include <clipper.hpp>

using namespace ClipperLib;

std::vector<IntPoint> equidistant_zoom_contour(const std::vector<std::vector<IntPoint>>& contours, double margin) {
    ClipperOffset co;
    co.MiterLimit = 10;  // 默认2圆角,10尖角
    co.AddPaths(contours, jtMiter, etClosedPolygon);
    Paths solution;
    co.Execute(solution, margin);

    std::vector<IntPoint> result;
    for (const auto& path : solution) {
        result.insert(result.end(), path.begin(), path.end());
    }

    return result;
}

int main() {
    Paths poly = {
        {{200, 200}, {200, 300}, {400, 350}, {350, 200}, {300, 200}, {200, 100}}
    };

    double margin = 20.0;

    std::vector<IntPoint> contour1 = equidistant_zoom_contour(poly, margin);

    cv::Mat img = cv::Mat::zeros(500, 500, CV_8UC3);
    std::vector<std::vector<cv::Point>> contours_cv(1);
    for (const auto& point : contour1) {
        contours_cv[0].emplace_back(point.X, point.Y);
    }

    cv::polylines(img, contours_cv, true, cv::Scalar(0, 255, 0), 3);

    contours_cv.clear();
    for (const auto& path : poly) {
        std::vector<cv::Point> contour_cv;
        for (const auto& point : path) {
            contour_cv.emplace_back(point.X, point.Y);
        }
        contours_cv.push_back(contour_cv);
    }

    cv::polylines(img, contours_cv, true, cv::Scalar(0, 0, 255), 3);

    cv::namedWindow("img", cv::WINDOW_NORMAL);
    cv::imshow("img", img);
    cv::waitKey(0);

    return 0;
}

MiterLimit默认2圆角(左图),10尖角 (右图)

 

待续。。。

参考:https://www.cnblogs.com/01black-white/p/15292193.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/152041.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

YOLOv8/YOLOv7/YOLOv5/YOLOv4/Faster-rcnn系列算法改进【NO.77】引入百度最新提出RT-DETR模型中AIFI模块

前言 作为当前先进的深度学习目标检测算法YOLOv8&#xff0c;已经集合了大量的trick&#xff0c;但是还是有提高和改进的空间&#xff0c;针对具体应用场景下的检测难点&#xff0c;可以不同的改进方法。此后的系列文章&#xff0c;将重点对YOLOv8的如何改进进行详细的介绍&…

openbabel包的安装

今天在安装openbabel的时候&#xff0c;使用pip / 通过源码的方式进行安装openbabel&#xff0c;但是都并没有什么用&#xff0c;直接使用&#xff1a; conda install openbabel 就openbabel3.1.1成功了

Authorization为啥必须要以Bearer开头

最近在公司使用JWT&#xff0c;对请求头信息中的Authorization必须要以Bearer开头有一些疑问&#xff0c;查了一下文档&#xff0c;知道了&#xff1a; Authorization: Bearer your_access_tokenBearer代表Authorization头定义的schema &#xff0c;除了Bearer&#xff0c;还有…

2760. 最长奇偶子数组 : 抽丝剥茧,图解双指针做法正确性

题目描述 这是 LeetCode 上的 「2698. 求一个整数的惩罚数」 &#xff0c;难度为 「简单」。 Tag : 「双指针」、「滑动窗口」 给你一个下标从 开始的整数数组 nums 和一个整数 threshold。 请你从 nums 的子数组中找出以下标 l 开头、下标 r 结尾 ( ) 且满足以下条件的 最长子…

【汇编】mov和add指令、确定物理地址的方法、内存分段表示法

文章目录 前言一、学习汇编指令——用中学1.1 汇编指令分析汇编输出分析 二、确定物理地址的方法2.1 什么叫做物理地址2.2 8086中的物理地址2.3 8086CPU给出物理地址的方法2.4 “段地址16偏移地址物理地址”的本质含义 三、内存分段表示法3.1 用分段的方式管理内存3.2 同一段内…

基于SSM的实验室仪器设备管理系统设计与实现

末尾获取源码 开发语言&#xff1a;Java Java开发工具&#xff1a;JDK1.8 后端框架&#xff1a;SSM 前端&#xff1a;采用JSP技术开发 数据库&#xff1a;MySQL5.7和Navicat管理工具结合 服务器&#xff1a;Tomcat8.5 开发软件&#xff1a;IDEA / Eclipse 是否Maven项目&#x…

【数据结构高阶】二叉搜索树

接下来我们来开始使用C来详细讲解数据结构的一些高阶的知识点 本期讲解的是二叉搜索树&#xff0c;对于初阶二叉树有所遗忘的同学可以看到这里&#xff1a; 【精选】【数据结构初阶】链式二叉树的解析及一些基本操作 讲解二叉搜索树主要是为了后面的map和set做铺垫&#xff…

HTML易忽略的角落【目录】

目前已有文章 **** 篇 本专栏是汇集了一些HTML常常被遗忘的知识&#xff0c;这里算是温故而知新&#xff0c;往往这些零碎的知识点&#xff0c;在你开发中能起到炸惊效果。我们每个人都没有过目不忘&#xff0c;过久不忘的本事&#xff0c;就让这一点点知识慢慢渗透你的脑海。 …

【Spring】超详细讲解AOP(面向切面编程)

文章目录 1. 前言2. 什么是AOP3. AOP快速入门4. AOP的核心概念5. 切点表达式6. 切点函数7. 通知8. 总结 1. 前言 本文围绕AOP进行讲解,AOP可以做什么,涉及到了哪些注解,以及各个注解运行的时机,以及Around相较于其它注解有什么不同,并且如果要执行目标方法需要怎么做 2. 什么…

群晖7.2版本通过Container Manager安装xiaoya-alist

小雅Alist&#xff0c;可以说是Alist应用中挂载阿里云最完美的成功案例。 一、下载镜像 注册表中下载镜像 Container Manager应该是7.2版本才改名&#xff0c;就是以前的docker。 打开【Container Manager】-【注册表】-【搜索框】搜索 xiaoya 内容区域&#xff0c;搜出的…

新零售系统平台解决方案 线上线下小程序怎么做

新零售线上线下解决方案是将传统零售业务与互联网科技相结合&#xff0c;通过数字化、智能化手段提升零售业务效率和用户体验的解决方案&#xff0c;它既有提供消费者线下体验&#xff0c;强调“稳”&#xff0c;又有互联网线上的“快”。 线上线下小程序可以通过一体化的进销存…

ubuntu20.04安装cv2

查看ubuntu的版本 cat /etc/lsb-release DISTRIB_IDUbuntu DISTRIB_RELEASE20.04 DISTRIB_CODENAMEfocal DISTRIB_DESCRIPTION"Ubuntu 20.04.3 LTS"更改镜像源 cp /etc/apt/sources.list /etc/apt/sources.list.bak cat > /etc/apt/sources.listdeb http://mirr…

第二证券:注册制退市规则?

跟着我国本钱商场不断发展和完善&#xff0c;持续注重退市原则改造也成为了商场中的热点话题。而注册制退市规矩的施行&#xff0c;无疑是新的退市原则下的一大重要内容。 首要&#xff0c;咱们需求了解什么是注册制退市规矩。所谓注册制退市规矩&#xff0c;指的是在注册制下…

App加固中的代码混淆功能,让逆向工程师很头疼

App加固中的代码混淆功能&#xff0c;让逆向工程师很头疼 “我想离开浪浪山。” 在数次尝试破解某个App 时&#xff0c;某个逆向工程师无奈感慨道。 逆向工程师顾名思义就是把一个个完整的软件逆推&#xff0c;还原成一段段代码&#xff0c;方便破解。 比如给他们一个手机Ap…

windows 使用WinSW制作服务

背景&#xff1a;最近维护老项目&#xff0c;需要使用windows server 2012 r2部署项目。使用springboot开发项目&#xff0c;nginx部署前端&#xff0c;于是打算把jar包和nginx都制作成服务 下载winsw地址&#xff1a;https://github.com/winsw/winsw/releases 下载这两个文件…

内衣迷你洗衣机什么牌子好?选购内衣裤洗衣机的方法

洗衣机在我们的生活中可谓是非常常见的了&#xff0c;几乎每家每户都具备着一台。即便是有洗衣机&#xff0c;也有不少人不会将自己我贴身衣物直接扔在洗衣机里清洗&#xff0c;而是会自己手工手洗。这跟我们传统上的观念有很大的关系&#xff0c;认为把内衣、内裤等贴身衣物放…

【23真题】发错试卷?想多了,只是题型大改!

今天分享的是23年南昌大学811的信号与系统试题及解析。南昌大学23年题型大改&#xff0c;加入了很多电路题目&#xff01;23考研的同学&#xff0c;甚至考场上以为发错试卷&#xff0c;考的电路原理。所以学有余力的同学&#xff0c;一定跟着我做各种院校的真题&#xff0c;见多…

华为 Mate 60 Pro 拆解:陆制零件比率上升至47% | 百能云芯

近日&#xff0c;日经新闻联合研究公司Fomalhaut Techno Solutions对华为 Mate 60 Pro 进行了拆解&#xff0c;揭示了这款于8月发布的新型智能手机的成本结构。拆解结果显示&#xff0c;该手机的国产零部件比例达到了47%&#xff0c;相较于三年前的 Mate 40 Pro&#xff0c;提高…

Js:获取最近6个月的月份(包含本月、不包含本月)

一、需求 获取最近6个月的月份&#xff08;不包含本月&#xff09;&#xff0c;比如现在是11月份&#xff0c;则需要获取到的月份是&#xff1a;10、9、8、7、6、5将月份从小到大排列 二、解决 1、获取最近的6个月份&#xff08;不包含本月&#xff09; var monthALL[]; …

欧盟铅镉RSL邻苯项目化学物质检测报告办理(RSL Report 资质)REACH 认证

如果您在亚马逊上销售商品&#xff0c;则必须遵守所有适用的欧盟和地方法律法规&#xff0c;以及适用于这些商品和商品信息的亚马逊政策。要在亚马逊上销售某些商品&#xff0c;)您需要向我们提供 REACH 符合性声明或检测报告。 RSL-Phthalate资质 欧盟RSL邻苯项目检测报告 Ph…