Python 使用openCV-cv2.GetOptimizeNewCameraMatrix进行相机校准可获得零roi

Python 使用openCV-cv2.GetOptimizeNewCameraMatrix进行相机校准可获得零roi,python,python-2.7,opencv,camera-calibration,Python,Python 2.7,Opencv,Camera Calibration,这是我在stackoverflow上的第一篇文章。如果我的英语和编程知识令人不安,请原谅 嗯,我正试图在Windows8.1操作系统中用opencv 2.4.9进行摄像机校准(ubuntu操作系统无法解决这个问题) 问题:我正在使用下面的代码校准我的相机,但是如果我的样本图像(带有检查板图案)的数量超过2,那么newcameramtx的roi,roi=cv2。GetOptimizeNewCameraMatrix(mtx,dist,(w,h),1,(w,h))会导致[0,0,0,0]。与该结果相关

这是我在stackoverflow上的第一篇文章。如果我的英语和编程知识令人不安,请原谅

嗯,我正试图在Windows8.1操作系统中用opencv 2.4.9进行摄像机校准(ubuntu操作系统无法解决这个问题)

问题:我正在使用下面的代码校准我的相机,但是如果我的样本图像(带有检查板图案)的数量超过2,那么newcameramtx的roi,roi=cv2。GetOptimizeNewCameraMatrix(mtx,dist,(w,h),1,(w,h))会导致[0,0,0,0]。与该结果相关的样本数量如何?(之前,在对该代码进行一些更改之前,最大样本数为12)

我所说的最大样本数是指从我的相机中获得的棋盘图案的图像,如果数量超过最大数量,roi不会给出好的结果

角点检测工作得很好。你可以找到我的样本图像

#-*-编码:utf-8-*-
"""
创建于2014年5月16日星期五15:23:00
@作者:卡卡洛特
"""
将numpy作为np导入
进口cv2
#导入操作系统
#导入时间
从matplotlib导入pyplot作为plt
LeftorRight='L'
数字=12
chx=6
chy=9
冠心病=25
#终止标准
标准=(cv2.TERM\U标准\U EPS+cv2.TERM\U标准\U MAX\U ITER,数值,0.001)
#准备对象点,如(0,0,0)、(1,0,0)、(2,0,0)…(6,5,0)
objp=np.zero((chy*chx,3),np.float32)
objp[:,:2]=np.mgrid[0:chy,0:chx].T.reformate(-1,2)
#数组以存储所有图像中的对象点和图像点。
objpoints=[]#真实世界空间中的三维点(x25mm)
imgpoints=[]图像平面中的2d点。
枚举=1

而(enum您应该将dist更改为

dist = np.array([-0.13615181, 0.53005398, 0, 0, 0]) # no translation
然后打电话给

newcameramtx, roi=cv2.getOptimalNewCameraMatrix(mtx,dist,(w,h),1,(w,h))

<>这对我来说是有效的。< / P>你应该找到一个更好的标题,你的问题完全正确。我忘了,谢谢。狄你设法让它适合鱼眼相机了。在我看来,像C++内部代码中的ICVGETFILGLE函数,里面的GoOpDimalEndoCaseMaMatrx不能处理大的FOV相机。它找不到内部的和外部矩形。您使用的是哪个摄像头(FOV)?我使用的是一个简单的HPV网络摄像头。dist数组中的最后一个参数不需要为0,只有数组索引2和3控制平移,其他都是径向失真参数。@Sam,您是如何计算它们的?
newcameramtx, roi=cv2.getOptimalNewCameraMatrix(mtx,dist,(w,h),1,(w,h))