0

The cv.InitUndistortMap opencv function is not working. I get the intrinsic and distortion matrix, but I can not use this values to fix my image. I get this error:
cv.InitUndistortMap(camera_matrix,distortion_coefs,mapx,mapy) TypeError: Argument 'cameraMatrix' must be CvMat. Use fromarray() to convert numpy arrays to CvMat

import numpy as np
import cv2
import cv
import os
import sys, getopt
from glob import glob

def calibracion():

  args, img_mask = getopt.getopt(sys.argv[1:], '', ['save=', 'debug=', 'square_size='])
  args = dict(args)
  img_mask = 'left*.jpg'
  img_names = glob(img_mask)
  debug_dir = args.get('--debug')
  square_size = float(args.get('--square_size', 1.0))

  pattern_size = (9, 6)
  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, 0
  for fn in img_names:
      print 'processing %s...' % fn,
      img = cv2.imread(fn, 0)
      h, w = img.shape[:2]
      found, corners = cv2.findChessboardCorners(img, pattern_size)
      if found:
      term = ( cv2.TERM_CRITERIA_EPS + cv2.TERM_CRITERIA_COUNT, 30, 0.1 )
      cv2.cornerSubPix(img, corners, (5, 5), (-1, -1), term)
      if debug_dir:
      vis = cv2.cvtColor(img, cv2.COLOR_GRAY2BGR)
      cv2.drawChessboardCorners(vis, pattern_size, corners, found)
      path, name, ext = splitfn(fn)
      cv2.imwrite('%s/%s_chess.bmp' % (debug_dir, name), vis)
      if not found:
      print 'chessboard not found'
      continue
      img_points.append(corners.reshape(-1, 2))
      obj_points.append(pattern_points)

      print 'ok'

  rms, camera_matrix, dist_coefs, rvecs, tvecs = cv2.calibrateCamera(obj_points, img_points, (w, h))
  cv2.destroyAllWindows() 
  return camera_matrix, dist_coefs


if __name__ == '__main__':

  camera_matrix = cv.CreateMat(3, 3, cv.CV_32FC1)
  dist_coefs = cv.CreateMat(4, 1, cv.CV_32FC1)

  camera_matrix , dist_coefs = calibracion()
  print "camera matrix:\n", camera_matrix       # intrinsic
  print "distortion coefficients: ", dist_coefs     # distortion

  image=cv.LoadImage('dog.jpeg')
  mapx = cv.CreateImage( cv.GetSize(image), cv.IPL_DEPTH_8U, 1 )
  mapy = cv.CreateImage( cv.GetSize(image), cv.IPL_DEPTH_8U, 1 )

  cv.InitUndistortMap(camera_matrix,dist_coefs,mapx,mapy)
  t = cv.CloneImage(image)
  cv.Remap( t, image, mapx, mapy )

  cv.ShowImage('FOTO', t )
  cv.WaitKey(0)
Andrea Diaz
  • 1,168
  • 4
  • 13
  • 29

1 Answers1

0

I couldn't run the calibration function, but the error, i think, is that you're replacing the value of the variable camera_matrix here: camera_matrix , dist_coefs = calibracion(). camera_matrix needs to be a CvMat like here: camera_matrix = cv.CreateMat(3, 3, cv.CV_32FC1). If you comment this line of code: camera_matrix , dist_coefs = calibracion() you won't have that error message displayed again.

In a nut shell: fix the calibration function

scripts
  • 1,452
  • 1
  • 19
  • 24