@@ -50,21 +50,22 @@ def hamming_distance(a, b):
50
50
return np .count_nonzero ((np .bitwise_xor (a ,b ) & r ) != 0 )
51
51
52
52
if __name__ == '__main__' :
53
- # cap = cv2.VideoCapture('./videos/1.MP4')
54
- # cap = cv2.VideoCapture('./videos/5.MP4')
55
- # cap = cv2.VideoCapture('./videos/test_ohio.mp4')
56
- # cap = cv2.VideoCapture('./videos/test_drone.mp4')
57
- # cap = cv2.VideoCapture('./videos/test_countryroad.mp4')
58
- # cap = cv2.VideoCapture('./videos/test_countryroad_reverse.mp4')
59
- # cap = cv2.VideoCapture('./videos/test_kitti984.mp4')
60
- # cap = cv2.VideoCapture('./videos/test_kitti984_reverse.mp4')
61
- cap = cv2 .VideoCapture ('./videos/test_freiburgxyz525.mp4' )
53
+ # cap = cv2.VideoCapture('.. /videos/1.MP4')
54
+ # cap = cv2.VideoCapture('.. /videos/5.MP4')
55
+ cap = cv2 .VideoCapture ('. ./videos/test_ohio.mp4' )
56
+ # cap = cv2.VideoCapture('.. /videos/test_drone.mp4')
57
+ # cap = cv2.VideoCapture('.. /videos/test_countryroad.mp4')
58
+ # cap = cv2.VideoCapture('.. /videos/test_countryroad_reverse.mp4')
59
+ # cap = cv2.VideoCapture('.. /videos/test_kitti984.mp4')
60
+ # cap = cv2.VideoCapture('.. /videos/test_kitti984_reverse.mp4')
61
+ # cap = cv2.VideoCapture('. ./videos/test_freiburgxyz525.mp4')
62
62
63
63
W = int (cap .get (cv2 .CAP_PROP_FRAME_WIDTH ))
64
64
H = int (cap .get (cv2 .CAP_PROP_FRAME_HEIGHT ))
65
- F = 500
66
- MIRROR = not True
67
- REVERSE = False
65
+ F = 500 # focal distance of camera
66
+ MIRROR = not True # try to recover points mis-triangulated behind the camera
67
+ REVERSE = False # hack for camera moving backwards
68
+ SBP_PX = 5 # max euclidian distance to search by projection
68
69
69
70
K = np .array ([[F , 0 , W / 2 ],
70
71
[0 , F , H / 2 ],
@@ -96,32 +97,33 @@ def hamming_distance(a, b):
96
97
pts_old = f_old .kps [idx_old ]
97
98
pts_new = f_new .kps [idx_new ]
98
99
99
- # optimize pose only
100
+ count_sbp = 0
101
+ projs = None
100
102
if f_new .id >= 2 :
103
+ # optimize pose only
101
104
c .optimize (K , frames = 1 , fix_points = True )
102
105
Rt = np .dot (f_new .pose , np .linalg .inv (f_old .pose ))
103
106
104
- count_sbp = 0
105
- for p in c .points :
106
- proj = p .project (f_new .pose , K )
107
- q = f_new .kd .query_ball_point (proj , 5 )
108
- for m_id in q :
109
- if f_new .pts [m_id ] is None :
110
- dist = cv2 .norm (p .orb (), f_new .des [m_id ], cv2 .NORM_HAMMING )
111
- # print(proj[0], proj[1], dist)
112
- if dist < 32 :
113
- # p.addObservation(f_new, m_id)
114
- # print("hdist", dist, "edist", np.linalg.norm(proj-f_new.kd.data[m_id]))
115
- count_sbp += 1
116
-
117
- # for p in c.points:
118
- #
119
- # projected = f_est.w2i.dot(np.hstack([p_est, [1]])) # only works because is VertexCam
120
- # projected = projected[:2] / projected[2] # don't forget to homo
121
- # errors.append(np.linalg.norm(measured-projected))
107
+ cloud_points = np .array ([p .pt4d for p in c .points ])
108
+ KP = np .dot (K , np .linalg .inv (f_new .pose )[:3 ])
109
+ projs = np .dot (KP , cloud_points .T ).T
110
+ projs = projs [:,:2 ] / projs [:,2 :]
111
+
112
+ # search by projection
113
+ for i ,p in enumerate (c .points ):
114
+ proj = projs [i ]
115
+ q = f_new .kd .query_ball_point (proj , 5 )
116
+ for m_id in q :
117
+ if f_new .pts [m_id ] is None :
118
+ dist = cv2 .norm (p .orb (), f_new .des [m_id ], cv2 .NORM_HAMMING )
119
+ if dist < 32 :
120
+ p .addObservation (f_new , m_id )
121
+ count_sbp += 1
122
122
123
123
# local
124
124
pts4d = triangulate (np .eye (4 ), Rt , pts_old , pts_new , MIRROR )
125
+ if len (pts4d ) == 0 :
126
+ print (Rt , pts_old , pts_new )
125
127
# to world
126
128
pts4d = np .dot (f_old .pose , pts4d .T ).T
127
129
# only create new Point if seen for the first time
@@ -149,11 +151,17 @@ def hamming_distance(a, b):
149
151
150
152
c .show ()
151
153
152
- kpus_old = f_old .kpus [idx_old ]
153
- kpus_new = f_new .kpus [idx_new ]
154
- for kpu_old , kpu_new in zip (kpus_old , kpus_new ):
155
- cv2 .circle (img , ipair (kpu_new ), color = (0 ,0 ,255 ), radius = 5 )
156
- cv2 .line (img , ipair (kpu_new ), ipair (kpu_old ), color = (0 ,0 ,255 ))
154
+ for i_old , i_new in zip (idx_old , idx_new ):
155
+ kpu_old = f_old .kpus [i_old ]
156
+ kpu_new = f_new .kpus [i_new ]
157
+ if f_new .pts [i_new ] is not None :
158
+ cv2 .circle (img , ipair (kpu_new ), color = (0 ,255 ,0 ), radius = 5 )
159
+ cv2 .line (img , ipair (kpu_new ), ipair (kpu_old ), color = (0 ,255 ,0 ))
160
+ else :
161
+ cv2 .circle (img , ipair (kpu_new ), color = (0 ,0 ,255 ), radius = 5 )
162
+ # if projs is not None:
163
+ # for proj in projs:
164
+ # cv2.circle(img, ipair(proj), color=(255,0,0), radius=3)
157
165
158
166
cv2 .imshow ('cv2' , img )
159
167
# time.sleep(3.5)
0 commit comments