Feature #3957
This commit is contained in:
committed by
Maksim Shabunin
parent
5cdf0e3e89
commit
297808e6b9
@@ -16,11 +16,11 @@ using namespace std;
|
||||
|
||||
const char * usage =
|
||||
" \nexample 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;
|
||||
}
|
||||
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 )
|
||||
if( !inputFilename.empty() )
|
||||
{
|
||||
if( !videofile && readStringList(inputFilename, imageList) )
|
||||
mode = CAPTURING;
|
||||
|
||||
Reference in New Issue
Block a user