我在OpenCV 3.4中使用Python。
我有一个由2个摄像头组成的系统,我想用它来跟踪对象并获取其轨迹,然后确定其速度。
目前,我可以对每个摄像机进行内部和外部校准。我可以通过视频跟踪对象,并在视频计划中获取2d坐标。
我现在的问题是我想将我的两个2D平面中的点投影到3D点中。我已经尝试过功能,triangulatePoints但似乎无法正常工作。这是获取3d坐标的实际功能。它返回一些与实际坐标相比似乎有些偏离的坐标
defget_3d_coord(left_two_d_coords,right_two_d_coords):pt1=left_two_d_coords.reshape((len(left_two_d_coords),1,2))pt2=right_two_d_coords.reshape((len(right_two_d_coords),1,2))extrinsic_left_camera_matrix,left_distortion_coeffs,extrinsic_left_rotation_vector,\
extrinsic_left_translation_vector=trajectory_utils.get_extrinsic_parameters(1)extrinsic_right_camera_matrix,right_distortion_coeffs,extrinsic_right_rotation_vector,\
extrinsic_right_translation_vector=trajectory_utils.get_extrinsic_parameters(2)#returns arrays of the same size(pt1,pt2)=correspondingPoints(pt1,pt2)projection1=computeProjMat(extrinsic_left_camera_matrix,extrinsic_left_rotation_vector,extrinsic_left_translation_vector)projection2=computeProjMat(extrinsic_right_camera_matrix,extrinsic_right_rotation_vector,extrinsic_right_translation_vector)out=cv2.triangulatePoints(projection1,projection2,pt1,pt2)oc=[]foridx,eleminenumerate(out[0]):oc.append((out[0][idx],out[1][idx],out[2][idx],out[3][idx]))oc=np.array(oc,dtype=np.float32)point3D=[]foridx,eleminenumerate(oc):W=out[3][idx]obj=[None]*4obj[0]=out[0][idx]/W
obj[1]=out[1][idx]/W
obj[2]=out[2]