任意顺序的四个点获取矩形的中心点,长宽和角度
生活随笔
收集整理的這篇文章主要介紹了
任意顺序的四个点获取矩形的中心点,长宽和角度
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
假設你得到了四個任意順序的坐標,可以通過我編的程序獲得該矩形的長寬,角度和中心點
import cv2 import mathclass Point(object): # 坐標類def __init__(self, xParam=0.0, yParam=0.0):self.x = xParamself.y = yParamdef distance(self, pt):xDiff = self.x - pt.xyDiff = self.y - pt.yreturn math.sqrt(xDiff ** 2 + yDiff ** 2)def show(self):print("(%.2f, %.2f)" % (self.x, self.y))def substract(self, pt): # 減法生成向量newPt = Point()xNew = self.x - pt.xyNew = self.y - pt.yreturn Point(xNew, yNew)def add(self, pt): # 加法生成中心點newPt = Point()xNew = (self.x + pt.x) / 2yNew = (self.y + pt.y) / 2return Point(xNew, yNew)# 求取兩個向量間的余弦值 def cosVector(p1, p2):result1 = p1.x * p2.x + p1.y * p2.y result2 = p1.x ** 2 + p1.y ** 2 result3 = p2.x ** 2 + p2.y ** 2 return result1 / ((result2 * result3) ** 0.5)# 有向矩形的四個頂點輸入順序任意時,返回旋轉角度,w,h def points_to_grasps(p, num=4, is_pos=True): # 默認矩形框的w大于hres = []p = sorted(p, key=lambda Points: Points.x) d12 = p[0].distance(p[1])d13 = p[0].distance(p[2])center_O = p[0].add(p[3]) vector_OB = Point(1, 0) w = min(d12, d13)h = max(d12, d13)if d12 > d13: point_A = p[1].add(p[3])else:if p[1].y < p[2].y: point_A = p[2].add(p[3])else: point_A = p[0].add(p[1])vector_OA = point_A.substract(center_O) if is_pos: cos_AOB = cosVector(vector_OA, vector_OB)box_class = cos_to_class(cos_AOB)else:box_class = 0res.append(str(center_O.x))res.append(str(center_O.y))res.append(str(w))res.append(str(h))res.append(str(box_class))return res轉載請附上鏈接
總結
以上是生活随笔為你收集整理的任意顺序的四个点获取矩形的中心点,长宽和角度的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Android/Linux招聘要求
- 下一篇: 云计算与虚拟化技术【课堂笔记】