python – 使用openCV进行相机校准 – cv2.getOptimalNewCameraM
这是我在stackoverflow上的第一篇文章.如果他们有点令人不安,请抱歉我的英语和编程知识.
好吧,我试图在Windows 8.1操作系统中使用opencv 2.4.9进行摄像头校准(ubuntu操作系统无法解决问题.) 问题:我使用下面的代码来校准我的相机,但似乎如果我的样本图像(带有检查板图案)的数量超过2,那么newcameramtx的roi,roi = cv2.getOptimalNewCameraMatrix(mtx,dist,(w,h),1,h))得到[0,0].连接到该结果的样本数量如何? (早些时候,在此代码中进行一些更改之前,最大样本数为12). 通过说最大样本数量,我指的是从具有棋盘图案的相机中获取的图像,如果数量超过最大数量,则roi不会给出好的结果. 角点检测非常有效.你可以找到我的样本图像here. # -*- coding: utf-8 -*- """ Created on Fri May 16 15:23:00 2014 @author: kakarot """ import numpy as np import cv2 #import os #import time from matplotlib import pyplot as plt LeftorRight = 'L' numer = 12 chx = 6 chy = 9 chd = 25 # termination criteria criteria = (cv2.TERM_CRITERIA_EPS + cv2.TERM_CRITERIA_MAX_ITER,numer,0.001) # prepare object points,like (0,0),(1,(2,0) ....,(6,5,0) objp = np.zeros((chy*chx,3),np.float32) objp[:,:2] = np.mgrid[0:chy,0:chx].T.reshape(-1,2) # Arrays to store object points and image points from all the images. objpoints = [] # 3d point in real world space,(x25mm) imgpoints = [] # 2d points in image plane. enum = 1 while(enum<=numer): img=cv2.imread('1280x720p/BestAsPerMatlab/calib_'+str(LeftorRight)+str(enum)+'.jpg') gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY) # Find the chess board corners ret,corners = cv2.findChessboardCorners(gray,(chy,chx),None) #cv2.imshow('Calibration',img) # If found,add object points,image points (after refining them) if ret == True and enum <= numer: objpoints.append(objp*chd) cv2.cornerSubPix(gray,corners,(11,11),(-1,-1),criteria) imgpoints.append(corners) # Draw and display the corners cv2.drawChessboardCorners(img,ret) cv2.imshow('Calibration',img) cv2.imwrite('1280x720p/Chessboard/calibrated_L{0}.jpg'.format(enum),img) print enum #time.sleep(2) if enum == numer: ret,mtx,rvecs,tvecs = cv2.calibrateCamera(objpoints,imgpoints,gray.shape[::-1],None,None) img = cv2.imread('1280x720p/BestAsPerMatlab/calib_'+str(LeftorRight)+'7.jpg') gray = cv2.cvtColor(img,cv2.COLOR_RGB2GRAY) h,w = img.shape[:2] #a (1 to see the whole picture) newcameramtx,roi=cv2.getOptimalNewCameraMatrix(mtx,h)) if (np.size(roi) == 4 and np.mean(roi) != 0): # undistort mapx,mapy = cv2.initUndistortRectifyMap(mtx,newcameramtx,5) dst = cv2.remap(img,mapx,mapy,cv2.INTER_LINEAR) # crop the image x,y,w,h = roi dst = dst[y:y+h,x:x+w] dst = cv2.cvtColor(dst,cv2.COLOR_RGB2BGR) plt.imshow(dst) #cv2.imwrite('result.jpg',dst) #np.savetxt('mtxL.txt',mtx) #np.savetxt('distL.txt',dist) else: np.disp('Something Went Wrong') enum += 1 ''' k = cv2.waitKey(1) & 0xFF if k == 27: break ''' cv2.destroyAllWindows() 编辑:我正在使用两个廉价的USB摄像头.我发现其中一个摄像头的样本集是可以的,我可以使用超过19个样本而没有问题.但是当使用另一台相机的校准样本时,样本图像的最大数量为2.(如果我制作另一组样本,则数字会有所不同).总之,似乎生成的校准矩阵正在发生变化.但它很奇怪. 最后我使用鱼眼相机,相信在每次捕捉结束时切割足够的像素我会模拟普通相机…也许这就是造成我麻烦的原因! 解决方法
你应该改变dist
dist = np.array([-0.13615181,0.53005398,0]) # no translation 然后拨打电话 newcameramtx,h)) 它对我有用. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |