OpenCV Python 立体标定错误
我现在还在用旧版的Python CV接口,因为有些代码我不想迁移到新的Python CV2接口。当我使用立体标定函数时,我已经准备好了所有相机的内参,因为我之前用cameraCalibrate函数对两个相机进行了单独的标定。我只想找到R、T、E和F这几个矩阵。
我遇到了一个错误:
SystemError: new style getargs format but argument is not a tuple
这里贴出了相关的代码:
import cv
import numpy as np
import os
import shutil
from sys import getsizeof
import time
imagePoints = []
objectPoints = []
pointCounts = []
positions = 10
K1 = np.asarray([( 2303.88696, 0.00000000, 315.330859),
( 0.00000000, 2303.75915, 234.229586),
( 0.00000000, 0.00000000, 1.00000000)])
K2 = np.asarray([( 2294.70130, 0.00000000, 320.751796),
( 0.00000000, 2293.85357, 240.760682),
( 0.00000000, 0.00000000, 1.00000000)])
distcoeffs1 = np.asarray([( -7.42497976e-03, 3.74099082e+00, -1.81154814e-03, 3.65969196e-04)])
distcoeffs2 = np.asarray([( 4.05620881e-03, 3.27334706e+00, -5.00835868e-04, 1.56068477e-03)])
imageSize = (640,480)
R = np.asarray([(0., 0., 0.), (0., 0., 0.), (0., 0., 0.)])
T = np.asarray([(0., 0., 0.), (0., 0., 0.), (0., 0., 0.)])
E = np.asarray([(0., 0., 0.), (0., 0., 0.), (0., 0., 0.)])
F = np.asarray([(0., 0., 0.), (0., 0., 0.), (0., 0., 0.)])
images = range(0,positions)
for numberofimages in images:
print numberofimages
temp_output = []
temp_coord = []
f_output = file('/home/Desktop/output_stereo/output_cam1_%d.txt' %numberofimages, 'r')
f_coord = file('/home/Desktop/output_stereo/coord.txt', 'r')
for line_output in f_output:
row_output = line_output.split()
temp_output = temp_output + [row_output]
for line_coord in f_coord:
row_coord = line_coord.split()
temp_coord = temp_coord + [row_coord]
count_output = range(0,len(temp_output))
count_coord = range(0,len(temp_coord))
for index_output in count_output:
row_output = temp_output[index_output]
imagePoints = imagePoints + [(float(row_output[0]),float(row_output[1]))]
for index_coord in count_coord:
row_coord = temp_coord[index_coord]
objectPoints = objectPoints + [(float(row_coord[0]),float(row_coord[1]),0)]
#pointCounts = pointCounts + [len(temp_output)]
imagePoints1 = cv.fromarray(np.asarray(imagePoints))
objectPoints = cv.fromarray(np.asarray(objectPoints))
imagePoints = []
for numberofimages in images:
print numberofimages
temp_output = []
temp_coord = []
f_output = file('/home/Desktop/output_stereo/output_cam2_%d.txt' %numberofimages, 'r')
f_coord = file('/home/Desktop/output_stereo/coord.txt', 'r')
for line_output in f_output:
row_output = line_output.split()
temp_output = temp_output + [row_output]
for line_coord in f_coord:
row_coord = line_coord.split()
temp_coord = temp_coord + [row_coord]
count_output = range(0,len(temp_output))
count_coord = range(0,len(temp_coord))
for index_output in count_output:
row_output = temp_output[index_output]
imagePoints = imagePoints + [(float(row_output[0]),float(row_output[1]))]
pointCounts = pointCounts + [len(temp_output)]
imagePoints2 = cv.fromarray(np.asarray(imagePoints))
pointCounts = cv.fromarray(np.asarray(np.int32([pointCounts])))
cv.StereoCalibrate(objectPoints, imagePoints1, imagePoints2, pointCounts, cv.fromarray(K1), cv.fromarray(distcoeffs1), cv.fromarray(K2), cv.fromarray(distcoeffs2), imageSize, cv.fromarray(R), cv.fromarray(T), cv.fromarray(E), cv.fromarray(F), cv.CV_CALIB_FIX_INTRINSIC)
在StereoCalibrate函数中,只有一个参数是元组类型,那就是imageSize,但我已经把它创建成了元组。其他的参数都是CV数组。
到底是哪个参数导致了这个问题呢?错误信息没有给我任何提示。
1 个回答
0
如果有人看到这个,记得在最后一个参数中设置标志。错误信息并没有很清楚地告诉你哪里出错了。
应该是:
cv.StereoCalibrate(objectPoints, imagePoints1, imagePoints2, pointCounts, cv.fromarray(K1), cv.fromarray(distcoeffs1), cv.fromarray(K2), cv.fromarray(distcoeffs2), imageSize, cv.fromarray(R), cv.fromarray(T), cv.fromarray(E), cv.fromarray(F), flags = cv.CV_CALIB_FIX_INTRINSIC)
而不是:
cv.StereoCalibrate(objectPoints, imagePoints1, imagePoints2, pointCounts, cv.fromarray(K1), cv.fromarray(distcoeffs1), cv.fromarray(K2), cv.fromarray(distcoeffs2), imageSize, cv.fromarray(R), cv.fromarray(T), cv.fromarray(E), cv.fromarray(F), cv.CV_CALIB_FIX_INTRINSIC)