python 已知平行四邊形三個(gè)點(diǎn),求第四個(gè)點(diǎn)的案例
我就廢話不多說了,大家還是直接看代碼吧!
import numpy as np
#已知平行四邊形三個(gè)點(diǎn),求第四個(gè)點(diǎn)
#計(jì)算兩點(diǎn)之間的距離
def CalcEuclideanDistance(point1,point2):
vec1 = np.array(point1)
vec2 = np.array(point2)
distance = np.linalg.norm(vec1 - vec2)
return distance
#計(jì)算第四個(gè)點(diǎn)
def CalcFourthPoint(point1,point2,point3): #pint3為A點(diǎn)
D = (point1[0]+point2[0]-point3[0],point1[1]+point2[1]-point3[1])
return D
#三點(diǎn)構(gòu)成一個(gè)三角形,利用兩點(diǎn)之間的距離,判斷鄰邊AB和AC,利用向量法以及平行四邊形法則,可以求得第四個(gè)點(diǎn)D
def JudgeBeveling(point1,point2,point3):
dist1 = CalcEuclideanDistance(point1,point2)
dist2 = CalcEuclideanDistance(point1,point3)
dist3 = CalcEuclideanDistance(point2,point3)
dist = [dist1, dist2, dist3]
max_dist = dist.index(max(dist))
if max_dist == 0:
D = CalcFourthPoint(point1,point2,point3)
elif max_dist == 1:
D = CalcFourthPoint(point1,point3,point2)
else:
D = CalcFourthPoint(point2,point3,point1)
return D
print(JudgeBeveling((0,1),(1,0),(1,1)))
print(JudgeBeveling((5,39),(500,35),(496,17)))
補(bǔ)充知識(shí):計(jì)算圖像中任意四個(gè)點(diǎn)連成的四邊形面積與Ground truth的IOU(Python)
1.先求任意四個(gè)點(diǎn)連成四邊形的面積
這個(gè)問題可以用下面的圖簡單的看一下

圖像的坐標(biāo)如上圖所示,大致的想法就是四個(gè)點(diǎn)可以確定四條線,然后進(jìn)行判斷,在紅色區(qū)域中則為面積中的一個(gè)像素,否則不在。先求四條線的斜率
def line_slope(x1,y1,x2,y2,x3,y3,x4,y4):
k1=(y2-y1)/(x2-x1)
k2=(y3-y2)/(x3-x2)
k3=(y4-y3)/(x4-x3)
k4=(y1-y4)/(x1-x4)
return k1,k2,k3,k4
然后計(jì)算每個(gè)位置上的各個(gè)函數(shù)值
l1=int(tk1*(i-tx1)+ty1)
l2=int(tk2*(i-tx2)+ty2)
l3=int(tk3*(i-tx3)+ty3)
l4=int(tk4*(i-tx4)+ty4)
判斷條件很重要,因?yàn)樽筮吺悄菢优帕械?,所以判斷條件就是
(l1<=j)&(l2>=j)&(l3>=j)&(l4<=j)
也就是在紅色區(qū)域中任取一點(diǎn)都滿足這個(gè)條件。定義一個(gè)全局變量,滿足條件就+1。面積就求出來了。
其實(shí)求面積并不是我的目的
2.求相交的面積

兩個(gè)面積分別求出來以后,兩個(gè)面積的交集面積最簡單的可以通過對(duì)照兩個(gè)區(qū)域的坐標(biāo)進(jìn)行求解。
也就是在分別計(jì)算兩個(gè)面積的時(shí)候記下符合條件的坐標(biāo)(x,y)存放到數(shù)組中,最后比較兩個(gè)數(shù)組中相等的元素的個(gè)數(shù)即可求解。
3.并面積
交的面積計(jì)算完后,可以用下面的公式(S1:四邊形1的面積、S2:四邊形2的面積、iu:交面積)
并面積=S1-iu+S2
4.IOU
交面積/并面積
5.測試
(1)

(2)

(3)

可以看到最后一種情況紅框已經(jīng)把ground truth包含了,所以可以直接用S2/S1來檢驗(yàn)算法的準(zhǔn)確性
而13882/19307=0.719013829181126,可以證明算法的準(zhǔn)確性。
測試代碼:鏈接
和別的算法進(jìn)行比較
還是有區(qū)別的。。。
v2是向量方法計(jì)算
v3是shapely包計(jì)算
以上這篇python 已知平行四邊形三個(gè)點(diǎn),求第四個(gè)點(diǎn)的案例就是小編分享給大家的全部內(nèi)容了,希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
matplotlib bar()實(shí)現(xiàn)多組數(shù)據(jù)并列柱狀圖通用簡便創(chuàng)建方法
這篇文章主要介紹了matplotlib bar()實(shí)現(xiàn)多組數(shù)據(jù)并列柱狀圖通用簡便創(chuàng)建方法,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2021-02-02
給大家整理了19個(gè)pythonic的編程習(xí)慣(小結(jié))
這篇文章主要介紹了給大家整理了19個(gè)pythonic的編程習(xí)慣(小結(jié)),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-09-09
Python中還原JavaScript的escape函數(shù)編碼后字符串的方法
這篇文章主要介紹了Python中解析JavaScript的escape函數(shù)編碼后字符串的方法,即Python中如何還原JavaScript escape函數(shù)編碼后的字符串,需要的朋友可以參考下2014-08-08
淺談Keras中fit()和fit_generator()的區(qū)別及其參數(shù)的坑
這篇文章主要介紹了Keras中fit()和fit_generator()的區(qū)別及其參數(shù)的坑,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-05-05
Python寫的Socks5協(xié)議代理服務(wù)器
這篇文章主要介紹了Python寫的Socks5協(xié)議代理服務(wù)器,代碼來自網(wǎng)上,需要的朋友可以參考下2014-08-08
Python中將文件從一個(gè)服務(wù)器復(fù)制到另一個(gè)服務(wù)器的4種方法
Python中將文件從一個(gè)服務(wù)器復(fù)制到另一個(gè)服務(wù)器通常涉及到網(wǎng)絡(luò)傳輸,這個(gè)過程可以通過多種方式實(shí)現(xiàn),本文主要為大家介紹了4種常用方法,需要的可以參考下2024-10-10
Python3時(shí)間轉(zhuǎn)換之時(shí)間戳轉(zhuǎn)換為指定格式的日期方法詳解
這篇文章主要介紹了Python3時(shí)間轉(zhuǎn)換之時(shí)間戳轉(zhuǎn)換為指定格式的日期,需要的朋友可以參考下2021-04-04

