python – 使用openCV进行相机校准 – cv2.getOptimalNewCameraMatrix导致零roi

python – 使用openCV进行相机校准 – cv2.getOptimalNewCameraMatrix导致零roi,第1张

概述这是我在stackoverflow上的第一篇文章.如果他们有点令人不安,请抱歉我的英语和编程知识. 好吧,我试图在Windows 8.1 *** 作系统中使用opencv 2.4.9进行摄像头校准(ubuntu *** 作系统无法解决问题.) 问题:我使用下面的代码来校准我的相机,但似乎如果我的样本图像(带有检查板图案)的数量超过2,那么newcameramtx的roi,roi = cv2.getOptimalN 这是我在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 npimport cv2#import os#import timefrom matplotlib import pyplot as pltleftorRight = 'L'numer = 12chx = 6chy = 9chd = 25# termination criteriacriteria = (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 = 1while(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))

它对我有用.

总结

以上是内存溢出为你收集整理的python – 使用openCV进行相机校准 – cv2.getOptimalNewCameraMatrix导致零roi全部内容,希望文章能够帮你解决python – 使用openCV进行相机校准 – cv2.getOptimalNewCameraMatrix导致零roi所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址:https://www.54852.com/langs/1197268.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2022-06-03
下一篇2022-06-03

发表评论

登录后才能评论

评论列表(0条)

    保存