@ -16,11 +16,11 @@ using namespace std;
const char * usage =
" \n example command line for calibration from a live feed. \n "
" calibration -w 4 -h 5 -s 0.025 -o camera.yml -op -oe \n "
" calibration -w=4 -h=5 -s=0.025 -o= camera.yml -op -oe \n "
" \n "
" example command line for calibration from a list of stored images: \n "
" imagelist_creator image_list.xml *.png \n "
" calibration -w 4 -h 5 -s 0.025 -o camera.yml -op -oe image_list.xml \n "
" calibration -w=4 -h=5 -s=0.025 -o= camera.yml -op -oe image_list.xml \n "
" where image_list.xml is the standard OpenCV XML/YAML \n "
" use imagelist_creator to create the xml or yaml list \n "
" file consisting of the list of strings, e.g.: \n "
@ -50,20 +50,20 @@ static void help()
{
printf ( " This is a camera calibration sample. \n "
" Usage: calibration \n "
" -w <board_width> # the number of inner corners per one of board dimension \n "
" -h <board_height> # the number of inner corners per another board dimension \n "
" [-pt <pattern>] # the type of pattern: chessboard or circles' grid \n "
" [-n <number_of_frames>] # the number of frames to use for calibration \n "
" -w= <board_width> # the number of inner corners per one of board dimension \n "
" -h= <board_height> # the number of inner corners per another board dimension \n "
" [-pt= <pattern>] # the type of pattern: chessboard or circles' grid \n "
" [-n= <number_of_frames>] # the number of frames to use for calibration \n "
" # (if not specified, it will be set to the number \n "
" # of board views actually available) \n "
" [-d <delay>] # a minimum delay in ms between subsequent attempts to capture a next view \n "
" [-d= <delay>] # a minimum delay in ms between subsequent attempts to capture a next view \n "
" # (used only for video capturing) \n "
" [-s <squareSize>] # square size in some user-defined units (1 by default) \n "
" [-o <out_camera_params>] # the output filename for intrinsic [and extrinsic] parameters \n "
" [-s= <squareSize>] # square size in some user-defined units (1 by default) \n "
" [-o= <out_camera_params>] # the output filename for intrinsic [and extrinsic] parameters \n "
" [-op] # write detected feature points \n "
" [-oe] # write extrinsic parameters \n "
" [-zt] # assume zero tangential distortion \n "
" [-a <aspectRatio>] # fix aspect ratio (fx/fy) \n "
" [-a= <aspectRatio>] # fix aspect ratio (fx/fy) \n "
" [-p] # fix the principal point at the center \n "
" [-v] # flip the captured images around the horizontal axis \n "
" [-V] # use a video file, and not an image list, uses \n "
@ -297,20 +297,20 @@ static bool runAndSave(const string& outputFilename,
int main ( int argc , char * * argv )
{
Size boardSize , imageSize ;
float squareSize = 1.f , aspectRatio = 1.f ;
float squareSize , aspectRatio ;
Mat cameraMatrix , distCoeffs ;
const char * outputFilename = " out_camera_data.yml " ;
const char * inputFilename = 0 ;
string outputFilename ;
string inputFilename = " " ;
int i , nframes = 10 ;
bool writeExtrinsics = false , writePoints = false ;
int i , nframes ;
bool writeExtrinsics , writePoints ;
bool undistortImage = false ;
int flags = 0 ;
VideoCapture capture ;
bool flipVertical = false ;
bool showUndistorted = false ;
bool videofile = false ;
int delay = 1000 ;
bool flipVertical ;
bool showUndistorted ;
bool videofile ;
int delay ;
clock_t prevTimestamp = 0 ;
int mode = DETECTION ;
int cameraId = 0 ;
@ -318,102 +318,70 @@ int main( int argc, char** argv )
vector < string > imageList ;
Pattern pattern = CHESSBOARD ;
if ( argc < 2 )
cv : : CommandLineParser parser ( argc , argv ,
" {help ||}{w||}{h||}{pt|chessboard|}{n|10|}{d|1000|}{s|1|}{o|out_camera_data.yml|} "
" {op||}{oe||}{zt||}{a|1|}{p||}{v||}{V||}{su||} "
" {@input_data|0|} " ) ;
if ( parser . has ( " help " ) )
{
help ( ) ;
return 0 ;
}
for ( i = 1 ; i < argc ; i + + )
boardSize . width = parser . get < int > ( " w " ) ;
boardSize . height = parser . get < int > ( " h " ) ;
if ( parser . has ( " pt " ) )
{
const char * s = argv [ i ] ;
if ( strcmp ( s , " -w " ) = = 0 )
{
if ( sscanf ( argv [ + + i ] , " %u " , & boardSize . width ) ! = 1 | | boardSize . width < = 0 )
return fprintf ( stderr , " Invalid board width \n " ) , - 1 ;
}
else if ( strcmp ( s , " -h " ) = = 0 )
{
if ( sscanf ( argv [ + + i ] , " %u " , & boardSize . height ) ! = 1 | | boardSize . height < = 0 )
return fprintf ( stderr , " Invalid board height \n " ) , - 1 ;
}
else if ( strcmp ( s , " -pt " ) = = 0 )
{
i + + ;
if ( ! strcmp ( argv [ i ] , " circles " ) )
pattern = CIRCLES_GRID ;
else if ( ! strcmp ( argv [ i ] , " acircles " ) )
pattern = ASYMMETRIC_CIRCLES_GRID ;
else if ( ! strcmp ( argv [ i ] , " chessboard " ) )
pattern = CHESSBOARD ;
else
return fprintf ( stderr , " Invalid pattern type: must be chessboard or circles \n " ) , - 1 ;
}
else if ( strcmp ( s , " -s " ) = = 0 )
{
if ( sscanf ( argv [ + + i ] , " %f " , & squareSize ) ! = 1 | | squareSize < = 0 )
return fprintf ( stderr , " Invalid board square width \n " ) , - 1 ;
}
else if ( strcmp ( s , " -n " ) = = 0 )
{
if ( sscanf ( argv [ + + i ] , " %u " , & nframes ) ! = 1 | | nframes < = 3 )
return printf ( " Invalid number of images \n " ) , - 1 ;
}
else if ( strcmp ( s , " -a " ) = = 0 )
{
if ( sscanf ( argv [ + + i ] , " %f " , & aspectRatio ) ! = 1 | | aspectRatio < = 0 )
return printf ( " Invalid aspect ratio \n " ) , - 1 ;
flags | = CALIB_FIX_ASPECT_RATIO ;
}
else if ( strcmp ( s , " -d " ) = = 0 )
{
if ( sscanf ( argv [ + + i ] , " %u " , & delay ) ! = 1 | | delay < = 0 )
return printf ( " Invalid delay \n " ) , - 1 ;
}
else if ( strcmp ( s , " -op " ) = = 0 )
{
writePoints = true ;
}
else if ( strcmp ( s , " -oe " ) = = 0 )
{
writeExtrinsics = true ;
}
else if ( strcmp ( s , " -zt " ) = = 0 )
{
flags | = CALIB_ZERO_TANGENT_DIST ;
}
else if ( strcmp ( s , " -p " ) = = 0 )
{
flags | = CALIB_FIX_PRINCIPAL_POINT ;
}
else if ( strcmp ( s , " -v " ) = = 0 )
{
flipVertical = true ;
}
else if ( strcmp ( s , " -V " ) = = 0 )
{
videofile = true ;
}
else if ( strcmp ( s , " -o " ) = = 0 )
{
outputFilename = argv [ + + i ] ;
}
else if ( strcmp ( s , " -su " ) = = 0 )
{
showUndistorted = true ;
}
else if ( s [ 0 ] ! = ' - ' )
{
if ( isdigit ( s [ 0 ] ) )
sscanf ( s , " %d " , & cameraId ) ;
else
inputFilename = s ;
}
string val = parser . get < string > ( " pt " ) ;
if ( val = = " circles " )
pattern = CIRCLES_GRID ;
else if ( val = = " acircles " )
pattern = ASYMMETRIC_CIRCLES_GRID ;
else if ( val = = " chessboard " )
pattern = CHESSBOARD ;
else
return fprintf ( stderr , " Unknown option %s " , s ) , - 1 ;
return fprintf ( stderr , " Invalid pattern type: must be chessboard or circles \n " ) , - 1 ;
}
if ( inputFilename )
squareSize = parser . get < float > ( " s " ) ;
nframes = parser . get < int > ( " n " ) ;
aspectRatio = parser . get < float > ( " a " ) ;
delay = parser . get < int > ( " d " ) ;
writePoints = parser . has ( " op " ) ;
writeExtrinsics = parser . has ( " oe " ) ;
if ( parser . has ( " a " ) )
flags | = CALIB_FIX_ASPECT_RATIO ;
if ( parser . has ( " zt " ) )
flags | = CALIB_ZERO_TANGENT_DIST ;
if ( parser . has ( " p " ) )
flags | = CALIB_FIX_PRINCIPAL_POINT ;
flipVertical = parser . has ( " v " ) ;
videofile = parser . has ( " V " ) ;
if ( parser . has ( " o " ) )
outputFilename = parser . get < string > ( " o " ) ;
showUndistorted = parser . has ( " su " ) ;
if ( isdigit ( parser . get < string > ( " @input_data " ) [ 0 ] ) )
cameraId = parser . get < int > ( " @input_data " ) ;
else
inputFilename = parser . get < string > ( " @input_data " ) ;
if ( ! parser . check ( ) )
{
help ( ) ;
parser . printErrors ( ) ;
return - 1 ;
}
if ( squareSize < = 0 )
return fprintf ( stderr , " Invalid board square width \n " ) , - 1 ;
if ( nframes < = 3 )
return printf ( " Invalid number of images \n " ) , - 1 ;
if ( aspectRatio < = 0 )
return printf ( " Invalid aspect ratio \n " ) , - 1 ;
if ( delay < = 0 )
return printf ( " Invalid delay \n " ) , - 1 ;
if ( boardSize . width < = 0 )
return fprintf ( stderr , " Invalid board width \n " ) , - 1 ;
if ( boardSize . height < = 0 )
return fprintf ( stderr , " Invalid board height \n " ) , - 1 ;
if ( ! inputFilename . empty ( ) )
{
if ( ! videofile & & readStringList ( inputFilename , imageList ) )
mode = CAPTURING ;