$search
00001 #!/usr/bin/env python 00002 ################################################################# 00003 ##\file 00004 # 00005 # \note 00006 # Copyright (c) 2011-2012 \n 00007 # Fraunhofer Institute for Manufacturing Engineering 00008 # and Automation (IPA) \n\n 00009 # 00010 ################################################################# 00011 # 00012 # \note 00013 # Project name: care-o-bot 00014 # \note 00015 # ROS stack name: cob_calibration 00016 # \note 00017 # ROS package name: cob_camera_calibration 00018 # 00019 # \author 00020 # Author: Sebastian Haug, email:sebhaug@gmail.com 00021 # \author 00022 # Supervised by: Florian Weisshardt, email:florian.weisshardt@ipa.fhg.de 00023 # 00024 # \date Date of creation: November 2011 00025 # 00026 ################################################################# 00027 # 00028 # Redistribution and use in source and binary forms, with or without 00029 # modification, are permitted provided that the following conditions are met: 00030 # 00031 # - Redistributions of source code must retain the above copyright 00032 # notice, this list of conditions and the following disclaimer. \n 00033 # - Redistributions in binary form must reproduce the above copyright 00034 # notice, this list of conditions and the following disclaimer in the 00035 # documentation and/or other materials provided with the distribution. \n 00036 # - Neither the name of the Fraunhofer Institute for Manufacturing 00037 # Engineering and Automation (IPA) nor the names of its 00038 # contributors may be used to endorse or promote products derived from 00039 # this software without specific prior written permission. \n 00040 # 00041 # This program is free software: you can redistribute it and/or modify 00042 # it under the terms of the GNU Lesser General Public License LGPL as 00043 # published by the Free Software Foundation, either version 3 of the 00044 # License, or (at your option) any later version. 00045 # 00046 # This program is distributed in the hope that it will be useful, 00047 # but WITHOUT ANY WARRANTY; without even the implied warranty of 00048 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 00049 # GNU Lesser General Public License LGPL for more details. 00050 # 00051 # You should have received a copy of the GNU Lesser General Public 00052 # License LGPL along with this program. 00053 # If not, see <http://www.gnu.org/licenses/>. 00054 # 00055 ################################################################# 00056 00057 import numpy as np 00058 00059 class CalibrationObject: 00060 ''' 00061 Base Class for calibration objects 00062 00063 A calibration object is defined by its pattern_size and square_size. 00064 ''' 00065 00066 def __init__(self, (rows, cols), square_size): 00067 self.pattern_size = (rows, cols) 00068 self.square_size = square_size 00069 00070 def get_pattern_points(self): 00071 raise NotImplementedError() 00072 00073 class Checkerboard(CalibrationObject): 00074 ''' 00075 Checkerboard calibration object 00076 00077 Pattern size is number of inner checkerboard corners in horizontal and 00078 vertical direction. Square size is the size of a square (im m) 00079 ''' 00080 def get_pattern_points(self): 00081 ''' 00082 Returns the location of checkerboard corners in object centered 00083 coordinate system. z coordinate is always 0. 00084 ''' 00085 # implementation adapted from opencv examples 00086 pattern_points = np.zeros((np.prod(self.pattern_size), 3), np.float32) 00087 pattern_points[:,:2] = np.indices(self.pattern_size).T.reshape(-1, 2) 00088 pattern_points *= self.square_size 00089 return pattern_points 00090 00091 class SymmerticCirclegrid(CalibrationObject): 00092 ''' 00093 Symmetric Circlegrid calibration object (as defined by opencv) 00094 ''' 00095 def get_pattern_points(self): 00096 ''' 00097 Returns the location of circle centers in object centered 00098 coordinate system. z coordinate is always 0. 00099 ''' 00100 # implementation adapted from opencv examples 00101 pattern_points = np.zeros((np.prod(self.pattern_size), 3), np.float32) 00102 pattern_points[:,:2] = np.indices(self.pattern_size).T.reshape(-1, 2) 00103 pattern_points *= self.square_size 00104 return pattern_points