当前位置: 首页 > news >正文

如何顺时针或者逆时针记录多边形的每个点

问题定义:

按照顺时针或者逆时针提取多边形的各个顶点

问题解决:

针对一个凸多边形,假设多边形的中心为C,多边形的任意一个顶点为A

做一个辅助点,假设有一条水平线通过中心点C,并在c点右边设一个B点

这样,可以通过\overrightarrow{CA} 与\overrightarrow{CB} 的夹角确定A点的角度,这样根据不同位置的顶点就能得到其夹角。

具体python实现:

# -*- coding: utf-8 -*-

import numpy as np
import cv2
import cv2 as cv
from sklearn.cluster import DBSCAN
import copy

def obtain_corners(mask):
    dst = cv.cornerHarris(mask,5,5,0.04)
    # 设置阈值,将角点绘制出来,阈值根据图像进行选择
    pos = np.where(dst>0.001*dst.max())
    x = pos[1]
    y = pos[0]
    epsilon = 2
    min_samples=1
    ou = np.concatenate((x.reshape(-1,1),y.reshape(-1,1)), axis=1)
    db = DBSCAN(eps=epsilon, min_samples=min_samples).fit(ou)
    _labels = db.labels_
    points_poly = np.zeros([0,2], dtype=np.float32)
    for i in range(_labels.max()+1):
        vv = np.mean(ou[np.where(_labels == i)[0], :], 0)
        points_poly = np.concatenate((points_poly, vv.reshape(1,2)), axis=0)
    return points_poly


def dot_product_angle(v1, v2):
    if np.linalg.norm(v1) == 0 or np.linalg.norm(v2) == 0:
        print("Zero magnitude vector!")
    else:
        vector_dot_product = np.dot(v1, v2)
        arccos = np.arccos(vector_dot_product / (np.linalg.norm(v1) * np.linalg.norm(v2)))
        angle = np.degrees(arccos)
        return angle
    return 0

def obtain_vector(a, b, center):
    aa = copy.deepcopy(a)
    bb = copy.deepcopy(b)
    aa[0] = center[0] - aa[0]
    aa[1] = center[1] - aa[1]
    bb[0] = center[0] - bb[0]
    bb[1] = center[1] - bb[1]
    return aa, bb   


# load image
large = cv2.imread('ss_big.png', 0)

# obtain corners 
points_poly = obtain_corners(large)
_, temp_bin = cv2.threshold(large, 126, 255, cv2.THRESH_BINARY)
num_labels, labels, stats, centroids = cv2.connectedComponentsWithStats(temp_bin, connectivity=8)

# obtain the center
center = centroids[1, :]

# save angle
angle = []
b = np.array([center[0] + 10, center[1]], dtype=np.float32)
for i in range(points_poly.shape[0]):
    aa, bb = obtain_vector(points_poly[i,:], b, center)
    angle_ = dot_product_angle(aa, bb)
    #print(points_poly[i,:])
    if points_poly[i,1] > center[1]:
        angle_ += 180
    angle.append(angle_)

index_ = np.argsort(np.array(angle, dtype=np.float32))

# sorted by angle 
pos_poly = points_poly[index_,:]
print(pos_poly)

 结果:

[[1761.5         651.125     ]
 [1562.43636364  592.49090909]
 [1489.41666667  514.9375    ]
 [1527.11111111  310.44444444]
 [1499.36363636  272.04545455]
 [1261.42857143  219.03571429]
 [1224.15        234.15      ]
 [1180.          416.66666667]
 [ 890.18181818  395.42424242]
 [1638.48484848 1105.84848485]
 [1432.53061224 1043.44897959]
 [1360.25       1078.85      ]
 [1303.54166667 1246.16666667]
 [1240.48       1267.46      ]
 [ 965.09090909 1175.6969697 ]
 [1015.73076923 1001.42307692]
 [ 978.5         904.55555556]
 [ 793.65714286  833.8       ]]

相关文章:

  • 体验 Shifu 解决报错流程
  • SpringBoot+Vue项目在线学习网站
  • antd tree 懒加载+局部刷新
  • c# RestClient 请求接口
  • 为了面试大厂,熬夜肝完这份 “测试” 笔记后,我终于“硬”了一回
  • T1095 数1的个数(信息学一本通C++)
  • 八、class 与 style 绑定(1)
  • 职言 | 编码是测试自动化职业生涯的关键:你准备好了吗?
  • 92-Java的缓冲流概述、体系、字节缓冲流使用
  • 检测网络框架越来越多
  • Gee引擎常用功能简介
  • 微信小程序 - - - - - 瀑布流效果实现
  • 前端面试问题(3)
  • 面试复习题二(综合类)
  • HCIA网络基础7-VRP和命令行基础
  • [PHP内核探索]PHP中的哈希表
  • [NodeJS] 关于Buffer
  • 《网管员必读——网络组建》(第2版)电子课件下载
  • 【RocksDB】TransactionDB源码分析
  • Android开源项目规范总结
  • Js基础——数据类型之Null和Undefined
  • laravel5.5 视图共享数据
  • nginx 配置多 域名 + 多 https
  • Odoo domain写法及运用
  • react 代码优化(一) ——事件处理
  • SpringCloud集成分布式事务LCN (一)
  • vuex 笔记整理
  • Vue官网教程学习过程中值得记录的一些事情
  • 笨办法学C 练习34:动态数组
  • 从0到1:PostCSS 插件开发最佳实践
  • 汉诺塔算法
  • 前端路由实现-history
  • 深度学习在携程攻略社区的应用
  • 手机端车牌号码键盘的vue组件
  • 思维导图—你不知道的JavaScript中卷
  • 2017年360最后一道编程题
  • Nginx惊现漏洞 百万网站面临“拖库”风险
  • 国内唯一,阿里云入选全球区块链云服务报告,领先AWS、Google ...
  • ​ 无限可能性的探索:Amazon Lightsail轻量应用服务器引领数字化时代创新发展
  • ​LeetCode解法汇总2182. 构造限制重复的字符串
  • #pragam once 和 #ifndef 预编译头
  • #我与虚拟机的故事#连载20:周志明虚拟机第 3 版:到底值不值得买?
  • (06)Hive——正则表达式
  • (09)Hive——CTE 公共表达式
  • (1)(1.19) TeraRanger One/EVO测距仪
  • (pojstep1.1.2)2654(直叙式模拟)
  • (八)c52学习之旅-中断实验
  • (笔试题)分解质因式
  • (附源码)计算机毕业设计SSM教师教学质量评价系统
  • (附源码)流浪动物保护平台的设计与实现 毕业设计 161154
  • (论文阅读40-45)图像描述1
  • (全注解开发)学习Spring-MVC的第三天
  • (原)记一次CentOS7 磁盘空间大小异常的解决过程
  • (原創) 如何優化ThinkPad X61開機速度? (NB) (ThinkPad) (X61) (OS) (Windows)
  • .MSSQLSERVER 导入导出 命令集--堪称经典,值得借鉴!