定位原理很简单,故不赘述,直接上源码,内附注释。(如果对您的学习有所帮助,还请帮忙点个赞,谢谢了)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
|
#!/usr/bin/env python3 # -*- coding: utf-8 -*- """ created on wed may 16 10:50:29 2018 @author: dag """ import sympy import numpy as np import math from matplotlib.pyplot import plot from matplotlib.pyplot import show import matplotlib.pyplot as plt import matplotlib #解决无法显示中文问题,fname是加载字体路径,根据自身pc实际确定,具体请百度 zhfont1 = matplotlib.font_manager.fontproperties(fname = '/system/library/fonts/hiragino sans gb w3.ttc' ) #随机产生3个参考节点坐标 maxy = 1000 maxx = 1000 cx = maxx * np.random.rand( 3 ) cy = maxy * np.random.rand( 3 ) dot1 = plot(cx,cy, 'k^' ) #生成盲节点,以及其与参考节点欧式距离 mtx = maxx * np.random.rand() mty = maxy * np.random.rand() plt.hold( 'on' ) dot2 = plot(mtx,mty, 'go' ) da = math.sqrt(np.square(mtx - cx[ 0 ]) + np.square(mty - cy[ 0 ])) db = math.sqrt(np.square(mtx - cx[ 1 ]) + np.square(mty - cy[ 1 ])) dc = math.sqrt(np.square(mtx - cx[ 2 ]) + np.square(mty - cy[ 2 ])) #计算定位坐标 def triposition(xa,ya,da,xb,yb,db,xc,yc,dc): x,y = sympy.symbols( 'x y' ) f1 = 2 * x * (xa - xc) + np.square(xc) - np.square(xa) + 2 * y * (ya - yc) + np.square(yc) - np.square(ya) - (np.square(dc) - np.square(da)) f2 = 2 * x * (xb - xc) + np.square(xc) - np.square(xb) + 2 * y * (yb - yc) + np.square(yc) - np.square(yb) - (np.square(dc) - np.square(db)) result = sympy.solve([f1,f2],[x,y]) locx,locy = result[x],result[y] return [locx,locy] #解算得到定位节点坐标 [locx,locy] = triposition(cx[ 0 ],cy[ 0 ],da,cx[ 1 ],cy[ 1 ],db,cx[ 2 ],cy[ 2 ],dc) plt.hold( 'on' ) dot3 = plot(locx,locy, 'r*' ) #显示脚注 x = [[locx,cx[ 0 ]],[locx,cx[ 1 ]],[locx,cx[ 2 ]]] y = [[locy,cy[ 0 ]],[locy,cy[ 1 ]],[locy,cy[ 2 ]]] for i in range ( len (x)): plt.plot(x[i],y[i],linestyle = '--' ,color = 'g' ) plt.title( '三边测量法的定位' ,fontproperties = zhfont1) plt.legend([ '参考节点' , '盲节点' , '定位节点' ], loc = 'lower right' ,prop = zhfont1) show() derror = math.sqrt(np.square(locx - mtx) + np.square(locy - mty)) print (derror) |
输出效果图:
补充:python opencv实现三角测量(triangulation)
看代码吧~
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
|
import cv2 import numpy as np import scipy.io as scio if __name__ = = '__main__' : print ( "main function." ) #验证点 point = np.array([ 1.0 , 2.0 , 3.0 ]) #获取相机参数 cams_data = scio.loadmat( '/data1/dy/supersmpl/data/amafmvs_dataset/cameras_i_crane.mat' ) pmats = cams_data[ 'pmats' ] # pmats(8, 3, 4) 投影矩阵 p1 = pmats[ 0 ,::] p3 = pmats[ 2 ,::] #通过投影矩阵将点从世界坐标投到像素坐标 pj1 = np.dot(p1, np.vstack([point.reshape( 3 , 1 ),np.array([ 1 ])])) pj3 = np.dot(p3, np.vstack([point.reshape( 3 , 1 ),np.array([ 1 ])])) point1 = pj1[: 2 ,:] / pj1[ 2 ,:] #两行一列,齐次坐标转化 point3 = pj3[: 2 ,:] / pj3[ 2 ,:] #利用投影矩阵以及对应像素点,进行三角测量 points = cv2.triangulatepoints(p1,p3,point1,point3) #齐次坐标转化并输出 print (points[ 0 : 3 ,:] / points[ 3 ,:]) |
以上为个人经验,希望能给大家一个参考,也希望大家多多支持服务器之家。如有错误或未考虑完全的地方,望不吝赐教。
原文链接:https://blog.csdn.net/weixin_41285821/article/details/80360924