Camera calibration using openCV - cv2.getOptimalNewCameraMatrix null roi

This is my first post here on stackoverflow. Sorry for my English and my programming knowledge if it is somehow bothering.

Well, I'm trying to calibrate the camera using opencv 2.4.9 on the Windows 8.1 operating system (the ubuntu operating system does not solve the problem.)

Problem: I use the code below to calibrate my camera, but it seems that if the number of my sample images (with a control card template) is more than 2, then roi of newcameramtx, roi = cv2.getOptimalNewCameraMatrix (mtx, dist, (w, h) , 1, (w, h)) lead to [0,0,0,0]. How many samples are associated with this result? (previously, before making some changes to this code, the maximum number of samples was 12).

Speaking of the maximum number of samples, I mean the images obtained from my camera with a checkerboard pattern, whether roi does not give a good result if the number exceeds the maximum number.

Angular detection works very well. You can find my sample images 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,0), (1,0,0), (2,0,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, (chy,chx),corners,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, dist, 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,dist,(w,h),1,(w,h))
            if (np.size(roi) == 4 and np.mean(roi) != 0):
                # undistort
                mapx,mapy = cv2.initUndistortRectifyMap(mtx,dist,None,newcameramtx,(w,h),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()

EDIT: I use two cheap USB cameras. I realized that the sample set of one of the cameras is fine, and I can use more than 19 samples without problems. But when using calibration samples of another camera, the maximum number of images of samples is 2. (if I make a different set of samples, the number will change). In conclusion, it seems that something is happening with the calibration matrices that produce. But this is strange.

, fisheye, , ... , , !

+4
1

dist

dist = np.array([-0.13615181, 0.53005398, 0, 0, 0]) # no translation

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

.

+1

Source: https://habr.com/ru/post/1583837/


All Articles