我正在使用广角镜头(178º对角线FOV),我正在尝试使用Opencv校准模块正确校准它.所有的检测和校准过程都工作正常,但结果很差.
我尝试了很多不同的配置:
我能得到的最好的是:
关于如何获得良好校准的任何想法?您是否认为同时使用两种校准模式,或使用圆形网格作为校准模式会有所帮助?
我在opencv 3.0中看到了薄棱镜系数的添加.我没试过,但我认为不会有所作为,对吧?编辑:检查它......没什么
camera opencv calibration computer-vision camera-calibration
我有一个PointGrey Ladybug3相机.它是一个全景(多)摄像头(5个摄像头可以360º和1个摄像头查找).我已经完成了所有的校准和校正,所以我最终得到的是6幅图像中的所有像素,我知道它是一个全局帧的3d位置.我现在要做的是将这个3d点转换为全景图像.最常见的是径向(Equirectangular)投影,如下所示:

对于所有3D点(X,Y,Z),可以找到theta和phi坐标,如:

我的问题是,是否可以使用opencv自动执行此操作?或者,如果我手动执行此操作,那么在theta中转换那组像素的最佳方法是什么,phi坐标到图像?
官方瓢虫SDK使用OpenGL进行所有这些操作,但我想知道是否可以在opencv中执行此操作.
谢谢,
何塞普
我想计算立体相机的极线。我知道相机内在矩阵以及 R 和 T。我试图计算学习 Opencv 书籍和维基百科中所述的基本矩阵。

其中 [t]x 是与 t 的叉积的矩阵表示。
所以

我试图用 python 实现这个,然后使用 opencv 函数cv2.computeCorrespondEpilines来计算外线。

问题是我得到的线没有像它们应该的那样收敛在一个点上......我想我在计算 F 时一定有问题。
这是相关的代码:
T #Contains translation vector
R #Rotation matrix
S=np.mat([[0,-T[2],T[1]],[T[2],0,-T[1]],[-T[1],T[0],0]])
E=np.mat(R)*S
M1=np.mat(self.getCameraMatrix(cam1))
M1_inv=np.linalg.inv(M1)
M2=np.mat(self.getCameraMatrix(cam2))
M2_inv=np.linalg.inv(M2)
F=(M2_inv.T)*E*M1_inv
Run Code Online (Sandbox Code Playgroud)
矩阵是:
M1=[[ 776.21275864 0. 773.70733324]
[ 0. 776.21275864 627.82872456]
[ 0. 0. 1. ]]
M2=[[ 764.35675708 0. 831.26052677]
[ 0. 764.35675708 611.85363745]
[ 0. 0. 1. ]]
R=[[ 0.9999902 0.00322032 0.00303674]
[-0.00387935 0.30727176 0.9516139 ]
[ 0.0021314 -0.95161636 0.30728124]]
T=[ 0.0001648 0.04149158 -0.02854541] …Run Code Online (Sandbox Code Playgroud) 我使用opencv的findFundamentalMat计算了两台摄像机之间的基本矩阵.然后我绘制图像中的极线.我得到类似的东西:
现在,我试图从基本矩阵中获得姿势,首先计算基本矩阵,然后使用Hartley和Zissserman方法.
K2=np.mat(self.calibration.getCameraMatrix(1))
K1=np.mat(self.calibration.getCameraMatrix(0))
E=K2.T*np.mat(F)*K1
Run Code Online (Sandbox Code Playgroud)

w,u,vt = cv2.SVDecomp(np.mat(E))
if np.linalg.det(u) < 0:
u *= -1.0
if np.linalg.det(vt) < 0:
vt *= -1.0
#Find R and T from Hartley & Zisserman
W=np.mat([[0,-1,0],[1,0,0],[0,0,1]],dtype=float)
R = np.mat(u) * W * np.mat(vt)
t = u[:,2] #u3 normalized.
Run Code Online (Sandbox Code Playgroud)
为了检查一切,直到这里是正确的,我重新计算E和F并再次绘制极线.
S=np.mat([[0,-T[2],T[1]],[T[2],0,-T[0]],[-T[1],T[0],0]])
E=S*np.mat(R)
F=np.linalg.inv(K2).T*np.mat(E)*np.linalg.inv(K1)
Run Code Online (Sandbox Code Playgroud)
但令人惊讶的是,线条已经移动,他们不再通过积分了.我做错了什么吗?

它可能与这个问题有关http://answers.opencv.org/question/18565/pose-estimation-produces-wrong-translation-vector/,但他们没有提供解决方案
我得到的矩阵是:
Original F=[[ -1.62627683e-07 -1.38840952e-05 8.03246936e-03]
[ 5.83844799e-06 -1.37528349e-06 -3.26617731e-03]
[ -1.15902181e-02 1.23440336e-02 1.00000000e+00]]
E=[[-0.09648757 -8.23748182 -0.6192747 ]
[ 3.46397143 -0.81596046 0.29628779]
[-6.32856235 -0.03006961 -0.65380443]]
R=[[ 9.99558381e-01 …Run Code Online (Sandbox Code Playgroud) 我有一个python脚本,使用calibratecamera2方法从棋盘的几个视图校准相机.校准成功后,我会检查所有原始点并做一些绘图并再次计算重新投影误差.令我惊讶的是,opencv和我计算的重投影错误有点不同.我发现它很奇怪.我是以错误的方式计算它的吗?
obj_points = []# 3d point in real world space. List of arrays
img_points = []# 2d points in image plane. List of arrays
...
ret, camera_matrix, dist_coeffs, rvecs, tvecs = cv2.calibrateCamera(obj_points, img_points, (w, h), camera_matrix, dist_coeffs, rvecs, tvecs, calib_flags +cv2.CALIB_USE_INTRINSIC_GUESS, criteria)
print "Final reprojection error opencv: ", ret #Compute mean of reprojection error
tot_mean_error=0
mean_error_image = 0
for i in xrange(len(obj_points)):
reprojected_points, _ = cv2.projectPoints(obj_points[i], rvecs[i], tvecs[i], camera_matrix, dist_coeffs)
reprojected_points=reprojected_points.reshape(-1,2)
mean_error_image=np.sum(np.sum(np.abs(img_points[i]-reprojected_points)**2,axis=-1)**(1./2))/np.alen(reprojected_points)
tot_mean_error +=mean_error_image
mean_error=tot_mean_error/len(obj_points)
print "Mean reprojection error: ", …Run Code Online (Sandbox Code Playgroud) 我在 XY 平面中有一个 numpy 点数组,例如:

我想从所有这些点中选择更好地分布的 n 个点(比如 100 个)。也就是说,我希望点的密度在任何地方都是恒定的。
像这样的东西:

是否有任何 pythonic 方式或任何 numpy/scipy 函数来做到这一点?
我有兴趣根据我计算的查找表将多个(6)MP4视频重新映射到高分辨率的最终视频中.这个想法是根据一个equirectangular投影转换360º视频中的6个独立视频.
有没有办法用ffmpeg或任何其他Linux程序重新映射?现在我正在从视频中提取所有帧,创建equirectangular单个图像并再次将它们连接到视频中.必须有一个更好的方法...
更新:
根据Mulyva的建议,我首先使用重映射过滤器重新映射每个单独的视频.未覆盖的全景视频的那些部分被解释为像色度键像素一样使用:
ffmpeg -i videos/camera1.MP4 -i camera0_map_x_radius5.pgm -i camera0_map_y_radius5.pgm -lavfi remap -qscale 1 out0.MP4
Run Code Online (Sandbox Code Playgroud)
然后我尝试使用chomakey过滤器覆盖它们:
ffmpeg -i out0.MP4 -i out1.MP4 -filter_complex "[1:v]chromakey=0x12da11:0.2:0.2[chromakey_res];[0:v][chromakey_res]overlay=eof_action=pass[out]" -map "[out]" out.mp4
Run Code Online (Sandbox Code Playgroud)
如您所见,最终结果有一个不受欢迎的绿色阴影.知道如何删除它吗?