相关疑难解决方法(0)

Python Opencv SolvePnP产生错误的翻译向量

我正在尝试使用单应性校准并在Blender 3d中找到单个虚拟相机的位置和旋转.我正在使用Blender,以便在我进入真实世界之前我可以仔细检查我的结果.我在固定相机的视野中渲染了十张不同位置的棋盘图片和旋转.使用opencv的python,我使用cv2.calibrateCamera从十个图像中检测到的棋盘角上找到内在矩阵,然后在cv2.solvePnP中使用它来查找外部参数(平移和旋转).然而,尽管估计的参数接近实际参数,但仍然存在一些可疑的参数.我对翻译的初步估计是(-0.11205481,-0.0490256,8.13892491).实际位置是(0,0,8.07105).非常接近吧?但是,当我移动并稍微旋转相机并重新渲染图像时,估计的平移变得更远了.估计:( - 0.15933154,0.13367286,9.34058867).实际:( - 1.7918,-1.51073,9.76597).Z值接近,但X和Y不接近.我完全糊涂了.如果有人能帮助我解决这个问题,我将非常感激.这是代码(它基于随opencv提供的python2校准示例):

#imports left out
USAGE = '''
USAGE: calib.py [--save <filename>] [--debug <output path>] [--square_size] [<image mask>]
'''   

args, img_mask = getopt.getopt(sys.argv[1:], '', ['save=', 'debug=', 'square_size='])
args = dict(args)
try: img_mask = img_mask[0]
except: img_mask = '../cpp/0*.png'
img_names = glob(img_mask)
debug_dir = args.get('--debug')
square_size = float(args.get('--square_size', 1.0))

pattern_size = (5, 8)
pattern_points = np.zeros( (np.prod(pattern_size), 3), np.float32 )
pattern_points[:,:2] = np.indices(pattern_size).T.reshape(-1, 2)
pattern_points *= square_size

obj_points = []
img_points = []
h, w = 0, …
Run Code Online (Sandbox Code Playgroud)

python opencv camera-calibration

17
推荐指数
1
解决办法
1万
查看次数

OpenCV:solvePnP tvec单位和轴方向

我试图找到相机相对于棋盘的相对位置(或者相反的方向) - 我觉得在不同的坐标系之间进行转换是合适的,例如这里建议的.我决定在这个阶段使用棋盘不仅用于校准而且还用于实际位置确定,因为我可以使用它findChessboardCorners来获得imagePoints(并且这可以正常工作).

我已经阅读了很多关于这个主题的内容,并且觉得我理解了solvePnP输出(即使我是openCV一般的新手和计算机视觉).不幸的是,我得到的结果solvePnP和物理测量测试设置的结果是不同的:z方向的平移偏差大约.25%.x并且y方向是完全错误的 - 几个数量级和不同的方向比我读到的相机坐标系统(x指向图像,y向右,z远离相机).所不同的坚持,如果我转换tvec,并rvec以相机姿态在世界坐标.

我的问题是:

  • 相机和世界坐标系轴的方向是什么?
  • 是否solvePnP以我指定的相同单位输出翻译objectPoints
  • 我将世界原点指定为objectPoints(棋盘角落之一)中的第一个.这样可以tvec从摄像机坐标转换到那个点吗?

这是我的代码(我附加备考,因为它不会抛出任何异常等).我使用灰度图像来获取校准期间的相机内在矩阵和失真系数,因此决定以灰度级执行本地化.chessCoordinates是一个棋盘点位置列表,以mm为单位,相对于原点(角点之一).camMatrixdistCoefficients来自校准(使用相同的棋盘和执行objectPoints).

camCapture=cv2.VideoCapture(0) # Take a picture of the target to get the imagePoints 
tempImg=camCapture.read()
imgPts=[]
tgtPts=[]

tempImg=cv2.cvtColor(tempImg[1], cv2.COLOR_BGR2GRAY)
found_all, corners = cv2.findChessboardCorners(tempImg, chessboardDim )

imgPts.append(corners.reshape(-1, 2))
tgtPts.append(np.array(chessCoordinates, dtype=np.float32))

retval,myRvec,myTvec=cv2.solvePnP(objectPoints=np.array(tgtPts), imagePoints=np.array(imgPts), cameraMatrix=camMatrix, distCoeffs=distCoefficients)
Run Code Online (Sandbox Code Playgroud)

python opencv coordinate-systems camera-calibration

5
推荐指数
1
解决办法
9288
查看次数