Added the "Camera calibration With OpenCV" tutorial. Extended with a few global links the conf.py file. Corrected an error in the linux_install.rst and one in the cascade_classifier.rst file.
This commit is contained in:
@@ -0,0 +1,13 @@
|
||||
<?xml version="1.0"?>
|
||||
<opencv_storage>
|
||||
<images>
|
||||
images/CameraCalibraation/VID5/xx1.jpg
|
||||
images/CameraCalibraation/VID5/xx2.jpg
|
||||
images/CameraCalibraation/VID5/xx3.jpg
|
||||
images/CameraCalibraation/VID5/xx4.jpg
|
||||
images/CameraCalibraation/VID5/xx5.jpg
|
||||
images/CameraCalibraation/VID5/xx6.jpg
|
||||
images/CameraCalibraation/VID5/xx7.jpg
|
||||
images/CameraCalibraation/VID5/xx8.jpg
|
||||
</images>
|
||||
</opencv_storage>
|
@@ -0,0 +1,551 @@
|
||||
#include <iostream>
|
||||
#include <sstream>
|
||||
#include <time.h>
|
||||
|
||||
#include <opencv2/core/core.hpp>
|
||||
#include <opencv2/imgproc/imgproc.hpp>
|
||||
#include <opencv2/calib3d/calib3d.hpp>
|
||||
#include <opencv2/highgui/highgui.hpp>
|
||||
|
||||
using namespace cv;
|
||||
using namespace std;
|
||||
|
||||
void help()
|
||||
{
|
||||
cout << "This is a camera calibration sample." << endl
|
||||
<< "Usage: calibration configurationFile" << endl
|
||||
<< "Near the sample file you'll find the configuration file, which has detailed help of "
|
||||
"how to edit it. It may be any OpenCV supported file format XML/YAML." << endl;
|
||||
}
|
||||
class Settings
|
||||
{
|
||||
public:
|
||||
Settings() : goodInput(false) {}
|
||||
enum Pattern { NOT_EXISTING, CHESSBOARD, CIRCLES_GRID, ASYMMETRIC_CIRCLES_GRID };
|
||||
enum InputType {INVALID, CAMERA, VIDEO_FILE, IMAGE_LIST};
|
||||
|
||||
void write(FileStorage& fs) const //Write serialization for this class
|
||||
{
|
||||
fs << "{" << "BoardSize_Width" << boardSize.width
|
||||
<< "BoardSize_Height" << boardSize.height
|
||||
<< "Square_Size" << squareSize
|
||||
<< "Calibrate_Pattern" << patternToUse
|
||||
<< "Calibrate_NrOfFrameToUse" << nrFrames
|
||||
<< "Calibrate_FixAspectRatio" << aspectRatio
|
||||
<< "Calibrate_AssumeZeroTangentialDistortion" << calibZeroTangentDist
|
||||
<< "Calibrate_FixPrincipalPointAtTheCenter" << calibFixPrincipalPoint
|
||||
|
||||
<< "Write_DetectedFeaturePoints" << bwritePoints
|
||||
<< "Write_extrinsicParameters" << bwriteExtrinsics
|
||||
<< "Write_outputFileName" << outputFileName
|
||||
|
||||
<< "Show_UndistortedImage" << showUndistorsed
|
||||
|
||||
<< "Input_FlipAroundHorizontalAxis" << flipVertical
|
||||
<< "Input_Delay" << delay
|
||||
<< "Input" << input
|
||||
<< "}";
|
||||
}
|
||||
void read(const FileNode& node) //Read serialization for this class
|
||||
{
|
||||
node["BoardSize_Width" ] >> boardSize.width;
|
||||
node["BoardSize_Height"] >> boardSize.height;
|
||||
node["Calibrate_Pattern"] >> patternToUse;
|
||||
node["Square_Size"] >> squareSize;
|
||||
node["Calibrate_NrOfFrameToUse"] >> nrFrames;
|
||||
node["Calibrate_FixAspectRatio"] >> aspectRatio;
|
||||
node["Write_DetectedFeaturePoints"] >> bwritePoints;
|
||||
node["Write_extrinsicParameters"] >> bwriteExtrinsics;
|
||||
node["Write_outputFileName"] >> outputFileName;
|
||||
node["Calibrate_AssumeZeroTangentialDistortion"] >> calibZeroTangentDist;
|
||||
node["Calibrate_FixPrincipalPointAtTheCenter"] >> calibFixPrincipalPoint;
|
||||
node["Input_FlipAroundHorizontalAxis"] >> flipVertical;
|
||||
node["Show_UndistortedImage"] >> showUndistorsed;
|
||||
node["Input"] >> input;
|
||||
node["Input_Delay"] >> delay;
|
||||
interprate();
|
||||
}
|
||||
void interprate()
|
||||
{
|
||||
goodInput = true;
|
||||
if (boardSize.width <= 0 || boardSize.height <= 0)
|
||||
{
|
||||
cerr << "Invalid Board size: " << boardSize.width << " " << boardSize.height << endl;
|
||||
goodInput = false;
|
||||
}
|
||||
if (squareSize <= 10e-6)
|
||||
{
|
||||
cerr << "Invalid square size " << squareSize << endl;
|
||||
goodInput = false;
|
||||
}
|
||||
if (nrFrames <= 0)
|
||||
{
|
||||
cerr << "Invalid number of frames " << nrFrames << endl;
|
||||
goodInput = false;
|
||||
}
|
||||
|
||||
if (input.empty()) // Check for valid input
|
||||
inputType = INVALID;
|
||||
else
|
||||
{
|
||||
if (input[0] >= '0' && input[0] <= '9')
|
||||
{
|
||||
stringstream ss(input);
|
||||
ss >> cameraID;
|
||||
inputType = CAMERA;
|
||||
}
|
||||
else
|
||||
{
|
||||
if (readStringList(input, imageList))
|
||||
{
|
||||
inputType = IMAGE_LIST;
|
||||
nrFrames = (nrFrames < imageList.size()) ? nrFrames : imageList.size();
|
||||
}
|
||||
else
|
||||
inputType = VIDEO_FILE;
|
||||
}
|
||||
if (inputType == CAMERA)
|
||||
inputCapture.open(cameraID);
|
||||
if (inputType == VIDEO_FILE)
|
||||
inputCapture.open(input);
|
||||
if (inputType != IMAGE_LIST && !inputCapture.isOpened())
|
||||
inputType = INVALID;
|
||||
}
|
||||
if (inputType == INVALID)
|
||||
{
|
||||
cerr << " Inexistent input: " << input;
|
||||
goodInput = false;
|
||||
}
|
||||
|
||||
flag = 0;
|
||||
if(calibFixPrincipalPoint) flag |= CV_CALIB_FIX_PRINCIPAL_POINT;
|
||||
if(calibZeroTangentDist) flag |= CV_CALIB_ZERO_TANGENT_DIST;
|
||||
if(aspectRatio) flag |= CV_CALIB_FIX_ASPECT_RATIO;
|
||||
|
||||
|
||||
calibrationPattern = NOT_EXISTING;
|
||||
if (!patternToUse.compare("CHESSBOARD")) calibrationPattern = CHESSBOARD;
|
||||
if (!patternToUse.compare("CIRCLES_GRID")) calibrationPattern = CIRCLES_GRID;
|
||||
if (!patternToUse.compare("ASYMMETRIC_CIRCLES_GRID")) calibrationPattern = ASYMMETRIC_CIRCLES_GRID;
|
||||
if (calibrationPattern == NOT_EXISTING)
|
||||
{
|
||||
cerr << " Inexistent camera calibration mode: " << patternToUse << endl;
|
||||
goodInput = false;
|
||||
}
|
||||
atImageList = 0;
|
||||
|
||||
}
|
||||
Mat nextImage()
|
||||
{
|
||||
Mat result;
|
||||
if( inputCapture.isOpened() )
|
||||
{
|
||||
Mat view0;
|
||||
inputCapture >> view0;
|
||||
view0.copyTo(result);
|
||||
}
|
||||
else if( atImageList < (int)imageList.size() )
|
||||
result = imread(imageList[atImageList++], CV_LOAD_IMAGE_COLOR);
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
static bool readStringList( const string& filename, vector<string>& l )
|
||||
{
|
||||
l.clear();
|
||||
FileStorage fs(filename, FileStorage::READ);
|
||||
if( !fs.isOpened() )
|
||||
return false;
|
||||
FileNode n = fs.getFirstTopLevelNode();
|
||||
if( n.type() != FileNode::SEQ )
|
||||
return false;
|
||||
FileNodeIterator it = n.begin(), it_end = n.end();
|
||||
for( ; it != it_end; ++it )
|
||||
l.push_back((string)*it);
|
||||
return true;
|
||||
}
|
||||
public:
|
||||
Size boardSize; // The size of the board -> Number of items by width and height
|
||||
Pattern calibrationPattern;// One of the Chessboard, circles, or asymmetric circle pattern
|
||||
float squareSize; // The size of a square in your defined unit (point, millimeter,etc).
|
||||
int nrFrames; // The number of frames to use from the input for calibration
|
||||
float aspectRatio; // The aspect ratio
|
||||
int delay; // In case of a video input
|
||||
bool bwritePoints; // Write detected feature points
|
||||
bool bwriteExtrinsics; // Write extrinsic parameters
|
||||
bool calibZeroTangentDist; // Assume zero tangential distortion
|
||||
bool calibFixPrincipalPoint;// Fix the principal point at the center
|
||||
bool flipVertical; // Flip the captured images around the horizontal axis
|
||||
string outputFileName; // The name of the file where to write
|
||||
bool showUndistorsed; // Show undistorted images after calibration
|
||||
string input; // The input ->
|
||||
|
||||
|
||||
|
||||
int cameraID;
|
||||
vector<string> imageList;
|
||||
int atImageList;
|
||||
VideoCapture inputCapture;
|
||||
InputType inputType;
|
||||
bool goodInput;
|
||||
int flag;
|
||||
|
||||
private:
|
||||
string patternToUse;
|
||||
|
||||
|
||||
};
|
||||
|
||||
void write(FileStorage& fs, const std::string&, const Settings& x)
|
||||
{
|
||||
x.write(fs);
|
||||
}
|
||||
void read(const FileNode& node, Settings& x, const Settings& default_value = Settings())
|
||||
{
|
||||
if(node.empty())
|
||||
x = default_value;
|
||||
else
|
||||
x.read(node);
|
||||
}
|
||||
|
||||
enum { DETECTION = 0, CAPTURING = 1, CALIBRATED = 2 };
|
||||
|
||||
bool runCalibrationAndSave(Settings& s, Size imageSize, Mat& cameraMatrix, Mat& distCoeffs,
|
||||
vector<vector<Point2f> > imagePoints );
|
||||
|
||||
int main(int argc, char* argv[])
|
||||
{
|
||||
help();
|
||||
Settings s;
|
||||
const string inputSettingsFile = argc > 1 ? argv[1] : "default.xml";
|
||||
FileStorage fs(inputSettingsFile, FileStorage::READ); // Read the settings
|
||||
if (!fs.isOpened())
|
||||
{
|
||||
cout << "Could not open the configuration file: \"" << inputSettingsFile << "\"" << endl;
|
||||
return -1;
|
||||
}
|
||||
fs["Settings"] >> s;
|
||||
fs.release(); // close Settings file
|
||||
|
||||
if (!s.goodInput)
|
||||
{
|
||||
cout << "Invalid input detected. Application stopping. " << endl;
|
||||
return -1;
|
||||
}
|
||||
|
||||
vector<vector<Point2f> > imagePoints;
|
||||
Mat cameraMatrix, distCoeffs;
|
||||
Size imageSize;
|
||||
int mode = s.inputType == Settings::IMAGE_LIST ? CAPTURING : DETECTION;
|
||||
clock_t prevTimestamp = 0;
|
||||
const Scalar RED(0,0,255), GREEN(0,255,0);
|
||||
const char ESC_KEY = 27;
|
||||
|
||||
for(int i = 0;;++i)
|
||||
{
|
||||
Mat view;
|
||||
bool blinkOutput = false;
|
||||
|
||||
view = s.nextImage();
|
||||
|
||||
//----- If no more image, or got enough, then stop calibration and show result -------------
|
||||
if( mode == CAPTURING && imagePoints.size() >= (unsigned)s.nrFrames )
|
||||
{
|
||||
if( runCalibrationAndSave(s, imageSize, cameraMatrix, distCoeffs, imagePoints))
|
||||
mode = CALIBRATED;
|
||||
else
|
||||
mode = DETECTION;
|
||||
}
|
||||
if(view.empty()) // If no more images then run calibration, save and stop loop.
|
||||
{
|
||||
if( imagePoints.size() > 0 )
|
||||
runCalibrationAndSave(s, imageSize, cameraMatrix, distCoeffs, imagePoints);
|
||||
break;
|
||||
}
|
||||
|
||||
|
||||
imageSize = view.size(); // Format input image.
|
||||
if( s.flipVertical ) flip( view, view, 0 );
|
||||
|
||||
vector<Point2f> pointBuf;
|
||||
|
||||
bool found;
|
||||
switch( s.calibrationPattern ) // Find feature points on the input format
|
||||
{
|
||||
case Settings::CHESSBOARD:
|
||||
found = findChessboardCorners( view, s.boardSize, pointBuf,
|
||||
CV_CALIB_CB_ADAPTIVE_THRESH | CV_CALIB_CB_FAST_CHECK | CV_CALIB_CB_NORMALIZE_IMAGE);
|
||||
break;
|
||||
case Settings::CIRCLES_GRID:
|
||||
found = findCirclesGrid( view, s.boardSize, pointBuf );
|
||||
break;
|
||||
case Settings::ASYMMETRIC_CIRCLES_GRID:
|
||||
found = findCirclesGrid( view, s.boardSize, pointBuf, CALIB_CB_ASYMMETRIC_GRID );
|
||||
break;
|
||||
}
|
||||
|
||||
if ( found) // If done with success,
|
||||
{
|
||||
// improve the found corners' coordinate accuracy for chessboard
|
||||
if( s.calibrationPattern == Settings::CHESSBOARD)
|
||||
{
|
||||
Mat viewGray;
|
||||
cvtColor(view, viewGray, CV_BGR2GRAY);
|
||||
cornerSubPix( viewGray, pointBuf, Size(11,11),
|
||||
Size(-1,-1), TermCriteria( CV_TERMCRIT_EPS+CV_TERMCRIT_ITER, 30, 0.1 ));
|
||||
}
|
||||
|
||||
if( mode == CAPTURING && // For camera only take new samples after delay time
|
||||
(!s.inputCapture.isOpened() || clock() - prevTimestamp > s.delay*1e-3*CLOCKS_PER_SEC) )
|
||||
{
|
||||
imagePoints.push_back(pointBuf);
|
||||
prevTimestamp = clock();
|
||||
blinkOutput = s.inputCapture.isOpened();
|
||||
}
|
||||
|
||||
// Draw the corners.
|
||||
drawChessboardCorners( view, s.boardSize, Mat(pointBuf), found );
|
||||
}
|
||||
|
||||
//----------------------------- Output Text ------------------------------------------------
|
||||
string msg = (mode == CAPTURING) ? "100/100" :
|
||||
mode == CALIBRATED ? "Calibrated" : "Press 'g' to start";
|
||||
int baseLine = 0;
|
||||
Size textSize = getTextSize(msg, 1, 1, 1, &baseLine);
|
||||
Point textOrigin(view.cols - 2*textSize.width - 10, view.rows - 2*baseLine - 10);
|
||||
|
||||
if( mode == CAPTURING )
|
||||
{
|
||||
if(s.showUndistorsed)
|
||||
msg = format( "%d/%d Undist", (int)imagePoints.size(), s.nrFrames );
|
||||
else
|
||||
msg = format( "%d/%d", (int)imagePoints.size(), s.nrFrames );
|
||||
}
|
||||
|
||||
putText( view, msg, textOrigin, 1, 1, mode == CALIBRATED ? GREEN : RED);
|
||||
|
||||
if( blinkOutput )
|
||||
bitwise_not(view, view);
|
||||
|
||||
//------------------------- Video capture output undistorted ------------------------------
|
||||
if( mode == CALIBRATED && s.showUndistorsed )
|
||||
{
|
||||
Mat temp = view.clone();
|
||||
undistort(temp, view, cameraMatrix, distCoeffs);
|
||||
}
|
||||
|
||||
//------------------------------ Show image and check for input commands -------------------
|
||||
imshow("Image View", view);
|
||||
char key = waitKey(s.inputCapture.isOpened() ? 50 : s.delay);
|
||||
|
||||
if( key == ESC_KEY )
|
||||
break;
|
||||
|
||||
if( key == 'u' && mode == CALIBRATED )
|
||||
s.showUndistorsed = !s.showUndistorsed;
|
||||
|
||||
if( s.inputCapture.isOpened() && key == 'g' )
|
||||
{
|
||||
mode = CAPTURING;
|
||||
imagePoints.clear();
|
||||
}
|
||||
}
|
||||
|
||||
// -----------------------Show the undistorted image for the image list ------------------------
|
||||
if( s.inputType == Settings::IMAGE_LIST && s.showUndistorsed )
|
||||
{
|
||||
Mat view, rview, map1, map2;
|
||||
initUndistortRectifyMap(cameraMatrix, distCoeffs, Mat(),
|
||||
getOptimalNewCameraMatrix(cameraMatrix, distCoeffs, imageSize, 1, imageSize, 0),
|
||||
imageSize, CV_16SC2, map1, map2);
|
||||
|
||||
for(int i = 0; i < (int)s.imageList.size(); i++ )
|
||||
{
|
||||
view = imread(s.imageList[i], 1);
|
||||
if(view.empty())
|
||||
continue;
|
||||
remap(view, rview, map1, map2, INTER_LINEAR);
|
||||
imshow("Image View", rview);
|
||||
char c = waitKey();
|
||||
if( c == ESC_KEY || c == 'q' || c == 'Q' )
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
double computeReprojectionErrors( const vector<vector<Point3f> >& objectPoints,
|
||||
const vector<vector<Point2f> >& imagePoints,
|
||||
const vector<Mat>& rvecs, const vector<Mat>& tvecs,
|
||||
const Mat& cameraMatrix , const Mat& distCoeffs,
|
||||
vector<float>& perViewErrors)
|
||||
{
|
||||
vector<Point2f> imagePoints2;
|
||||
int i, totalPoints = 0;
|
||||
double totalErr = 0, err;
|
||||
perViewErrors.resize(objectPoints.size());
|
||||
|
||||
for( i = 0; i < (int)objectPoints.size(); ++i )
|
||||
{
|
||||
projectPoints( Mat(objectPoints[i]), rvecs[i], tvecs[i], cameraMatrix,
|
||||
distCoeffs, imagePoints2);
|
||||
err = norm(Mat(imagePoints[i]), Mat(imagePoints2), CV_L2);
|
||||
|
||||
int n = (int)objectPoints[i].size();
|
||||
perViewErrors[i] = (float) std::sqrt(err*err/n);
|
||||
totalErr += err*err;
|
||||
totalPoints += n;
|
||||
}
|
||||
|
||||
return std::sqrt(totalErr/totalPoints);
|
||||
}
|
||||
|
||||
void calcBoardCornerPositions(Size boardSize, float squareSize, vector<Point3f>& corners,
|
||||
Settings::Pattern patternType /*= Settings::CHESSBOARD*/)
|
||||
{
|
||||
corners.clear();
|
||||
|
||||
switch(patternType)
|
||||
{
|
||||
case Settings::CHESSBOARD:
|
||||
case Settings::CIRCLES_GRID:
|
||||
for( int i = 0; i < boardSize.height; ++i )
|
||||
for( int j = 0; j < boardSize.width; ++j )
|
||||
corners.push_back(Point3f(float( j*squareSize ), float( i*squareSize ), 0));
|
||||
break;
|
||||
|
||||
case Settings::ASYMMETRIC_CIRCLES_GRID:
|
||||
for( int i = 0; i < boardSize.height; i++ )
|
||||
for( int j = 0; j < boardSize.width; j++ )
|
||||
corners.push_back(Point3f(float((2*j + i % 2)*squareSize), float(i*squareSize), 0));
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
bool runCalibration( Settings& s, Size& imageSize, Mat& cameraMatrix, Mat& distCoeffs,
|
||||
vector<vector<Point2f> > imagePoints, vector<Mat>& rvecs, vector<Mat>& tvecs,
|
||||
vector<float>& reprojErrs, double& totalAvgErr)
|
||||
{
|
||||
|
||||
cameraMatrix = Mat::eye(3, 3, CV_64F);
|
||||
if( s.flag & CV_CALIB_FIX_ASPECT_RATIO )
|
||||
cameraMatrix.at<double>(0,0) = 1.0;
|
||||
|
||||
distCoeffs = Mat::zeros(8, 1, CV_64F);
|
||||
|
||||
vector<vector<Point3f> > objectPoints(1);
|
||||
calcBoardCornerPositions(s.boardSize, s.squareSize, objectPoints[0], s.calibrationPattern);
|
||||
|
||||
objectPoints.resize(imagePoints.size(),objectPoints[0]);
|
||||
|
||||
//Find intrinsic and extrinsic camera parameters
|
||||
double rms = calibrateCamera(objectPoints, imagePoints, imageSize, cameraMatrix,
|
||||
distCoeffs, rvecs, tvecs, s.flag|CV_CALIB_FIX_K4|CV_CALIB_FIX_K5);
|
||||
|
||||
cout << "Re-projection error reported by calibrateCamera: "<< rms << endl;
|
||||
|
||||
bool ok = checkRange(cameraMatrix) && checkRange(distCoeffs);
|
||||
|
||||
totalAvgErr = computeReprojectionErrors(objectPoints, imagePoints,
|
||||
rvecs, tvecs, cameraMatrix, distCoeffs, reprojErrs);
|
||||
|
||||
return ok;
|
||||
}
|
||||
|
||||
// Print camera parameters to the output file
|
||||
void saveCameraParams( Settings& s, Size& imageSize, Mat& cameraMatrix, Mat& distCoeffs,
|
||||
const vector<Mat>& rvecs, const vector<Mat>& tvecs,
|
||||
const vector<float>& reprojErrs, const vector<vector<Point2f> >& imagePoints,
|
||||
double totalAvgErr )
|
||||
{
|
||||
FileStorage fs( s.outputFileName, FileStorage::WRITE );
|
||||
|
||||
time_t t;
|
||||
time( &t );
|
||||
struct tm *t2 = localtime( &t );
|
||||
char buf[1024];
|
||||
strftime( buf, sizeof(buf)-1, "%c", t2 );
|
||||
|
||||
fs << "calibration_Time" << buf;
|
||||
|
||||
if( !rvecs.empty() || !reprojErrs.empty() )
|
||||
fs << "nrOfFrames" << (int)std::max(rvecs.size(), reprojErrs.size());
|
||||
fs << "image_Width" << imageSize.width;
|
||||
fs << "image_Height" << imageSize.height;
|
||||
fs << "board_Width" << s.boardSize.width;
|
||||
fs << "board_Height" << s.boardSize.height;
|
||||
fs << "square_Size" << s.squareSize;
|
||||
|
||||
if( s.flag & CV_CALIB_FIX_ASPECT_RATIO )
|
||||
fs << "FixAspectRatio" << s.aspectRatio;
|
||||
|
||||
if( s.flag )
|
||||
{
|
||||
sprintf( buf, "flags: %s%s%s%s",
|
||||
s.flag & CV_CALIB_USE_INTRINSIC_GUESS ? " +use_intrinsic_guess" : "",
|
||||
s.flag & CV_CALIB_FIX_ASPECT_RATIO ? " +fix_aspectRatio" : "",
|
||||
s.flag & CV_CALIB_FIX_PRINCIPAL_POINT ? " +fix_principal_point" : "",
|
||||
s.flag & CV_CALIB_ZERO_TANGENT_DIST ? " +zero_tangent_dist" : "" );
|
||||
cvWriteComment( *fs, buf, 0 );
|
||||
|
||||
}
|
||||
|
||||
fs << "flagValue" << s.flag;
|
||||
|
||||
fs << "Camera_Matrix" << cameraMatrix;
|
||||
fs << "Distortion_Coefficients" << distCoeffs;
|
||||
|
||||
fs << "Avg_Reprojection_Error" << totalAvgErr;
|
||||
if( !reprojErrs.empty() )
|
||||
fs << "Per_View_Reprojection_Errors" << Mat(reprojErrs);
|
||||
|
||||
if( !rvecs.empty() && !tvecs.empty() )
|
||||
{
|
||||
CV_Assert(rvecs[0].type() == tvecs[0].type());
|
||||
Mat bigmat((int)rvecs.size(), 6, rvecs[0].type());
|
||||
for( int i = 0; i < (int)rvecs.size(); i++ )
|
||||
{
|
||||
Mat r = bigmat(Range(i, i+1), Range(0,3));
|
||||
Mat t = bigmat(Range(i, i+1), Range(3,6));
|
||||
|
||||
CV_Assert(rvecs[i].rows == 3 && rvecs[i].cols == 1);
|
||||
CV_Assert(tvecs[i].rows == 3 && tvecs[i].cols == 1);
|
||||
//*.t() is MatExpr (not Mat) so we can use assignment operator
|
||||
r = rvecs[i].t();
|
||||
t = tvecs[i].t();
|
||||
}
|
||||
cvWriteComment( *fs, "a set of 6-tuples (rotation vector + translation vector) for each view", 0 );
|
||||
fs << "Extrinsic_Parameters" << bigmat;
|
||||
}
|
||||
|
||||
if( !imagePoints.empty() )
|
||||
{
|
||||
Mat imagePtMat((int)imagePoints.size(), imagePoints[0].size(), CV_32FC2);
|
||||
for( int i = 0; i < (int)imagePoints.size(); i++ )
|
||||
{
|
||||
Mat r = imagePtMat.row(i).reshape(2, imagePtMat.cols);
|
||||
Mat imgpti(imagePoints[i]);
|
||||
imgpti.copyTo(r);
|
||||
}
|
||||
fs << "Image_points" << imagePtMat;
|
||||
}
|
||||
}
|
||||
|
||||
bool runCalibrationAndSave(Settings& s, Size imageSize, Mat& cameraMatrix, Mat& distCoeffs,vector<vector<Point2f> > imagePoints )
|
||||
{
|
||||
vector<Mat> rvecs, tvecs;
|
||||
vector<float> reprojErrs;
|
||||
double totalAvgErr = 0;
|
||||
|
||||
bool ok = runCalibration(s,imageSize, cameraMatrix, distCoeffs, imagePoints, rvecs, tvecs,
|
||||
reprojErrs, totalAvgErr);
|
||||
cout << (ok ? "Calibration succeeded" : "Calibration failed")
|
||||
<< ". avg re projection error = " << totalAvgErr ;
|
||||
|
||||
if( ok )
|
||||
saveCameraParams( s, imageSize, cameraMatrix, distCoeffs, rvecs ,tvecs, reprojErrs,
|
||||
imagePoints, totalAvgErr);
|
||||
return ok;
|
||||
}
|
@@ -0,0 +1,46 @@
|
||||
<?xml version="1.0"?>
|
||||
<opencv_storage>
|
||||
<Settings>
|
||||
<!-- Number of inner corners per a item row and column. (square, circle) -->
|
||||
<BoardSize_Width> 9</BoardSize_Width>
|
||||
<BoardSize_Height>6</BoardSize_Height>
|
||||
|
||||
<!-- The size of a square in some user defined metric system (pixel, millimeter)-->
|
||||
<Square_Size>50</Square_Size>
|
||||
|
||||
<!-- The type of input used for camera calibration. One of: CHESSBOARD CIRCLES_GRID ASYMMETRIC_CIRCLES_GRID -->
|
||||
<Calibrate_Pattern>"CHESSBOARD"</Calibrate_Pattern>
|
||||
|
||||
<!-- The input to use for calibration.
|
||||
To use an input camera -> give the ID of the camera, like "1"
|
||||
To use an input video -> give the path of the input video, like "/tmp/x.avi"
|
||||
To use an image list -> give the path to the XML or YAML file containing the list of the images, like "/tmp/circles_list.xml"
|
||||
-->
|
||||
<Input>"images/CameraCalibraation/VID5/VID5.xml"</Input>
|
||||
<!-- If true (non-zero) we flip the input images around the horizontal axis.-->
|
||||
<Input_FlipAroundHorizontalAxis>0</Input_FlipAroundHorizontalAxis>
|
||||
|
||||
<!-- Time delay between frames in case of camera. -->
|
||||
<Input_Delay>100</Input_Delay>
|
||||
|
||||
<!-- How many frames to use, for calibration. -->
|
||||
<Calibrate_NrOfFrameToUse>25</Calibrate_NrOfFrameToUse>
|
||||
<!-- Consider only fy as a free parameter, the ratio fx/fy stays the same as in the input cameraMatrix.
|
||||
Use or not setting. 0 - False Non-Zero - True-->
|
||||
<Calibrate_FixAspectRatio> 1 </Calibrate_FixAspectRatio>
|
||||
<!-- If true (non-zero) tangential distortion coefficients are set to zeros and stay zero.-->
|
||||
<Calibrate_AssumeZeroTangentialDistortion>1</Calibrate_AssumeZeroTangentialDistortion>
|
||||
<!-- If true (non-zero) the principal point is not changed during the global optimization.-->
|
||||
<Calibrate_FixPrincipalPointAtTheCenter> 1 </Calibrate_FixPrincipalPointAtTheCenter>
|
||||
|
||||
<!-- The name of the output log file. -->
|
||||
<Write_outputFileName>"out_camera_data.xml"</Write_outputFileName>
|
||||
<!-- If true (non-zero) we write to the output file the feature points.-->
|
||||
<Write_DetectedFeaturePoints>1</Write_DetectedFeaturePoints>
|
||||
<!-- If true (non-zero) we write to the output file the extrinsic camera parameters.-->
|
||||
<Write_extrinsicParameters>1</Write_extrinsicParameters>
|
||||
<!-- If true (non-zero) we show after calibration the undistorted images.-->
|
||||
<Show_UndistortedImage>1</Show_UndistortedImage>
|
||||
|
||||
</Settings>
|
||||
</opencv_storage>
|
@@ -0,0 +1,352 @@
|
||||
%YAML:1.0
|
||||
calibration_Time: "08/19/11 20:44:38"
|
||||
nrOfFrames: 8
|
||||
image_Width: 640
|
||||
image_Height: 480
|
||||
board_Width: 9
|
||||
board_Height: 6
|
||||
square_Size: 50.
|
||||
FixAspectRatio: 1.
|
||||
# flags: +fix_aspectRatio +fix_principal_point +zero_tangent_dist
|
||||
flagValue: 14
|
||||
Camera_Matrix: !!opencv-matrix
|
||||
rows: 3
|
||||
cols: 3
|
||||
dt: d
|
||||
data: [ 6.5746697810243404e+002, 0., 3.1950000000000000e+002, 0.,
|
||||
6.5746697810243404e+002, 2.3950000000000000e+002, 0., 0., 1. ]
|
||||
Distortion_Coefficients: !!opencv-matrix
|
||||
rows: 5
|
||||
cols: 1
|
||||
dt: d
|
||||
data: [ -4.1802327018241026e-001, 5.0715243805833121e-001, 0., 0.,
|
||||
-5.7843596847939704e-001 ]
|
||||
Avg_Reprojection_Error: 3.8441346462381665e-001
|
||||
Per_View_Reprojection_Errors: !!opencv-matrix
|
||||
rows: 8
|
||||
cols: 1
|
||||
dt: f
|
||||
data: [ 5.04357755e-001, 4.85754758e-001, 3.99563968e-001,
|
||||
4.13829178e-001, 3.53570908e-001, 3.21116358e-001,
|
||||
2.74473161e-001, 2.39761785e-001 ]
|
||||
# a set of 6-tuples (rotation vector + translation vector) for each view
|
||||
Extrinsic_Parameters: !!opencv-matrix
|
||||
rows: 8
|
||||
cols: 6
|
||||
dt: d
|
||||
data: [ -7.8704123655486097e-002, -1.5922384772614945e-001,
|
||||
3.1166227207451498e+000, 2.4224388101960471e+002,
|
||||
1.1795590397660339e+002, 6.2576484126093249e+002,
|
||||
-1.4117480285164308e-001, -1.7917415443804836e-002,
|
||||
3.1333182268743949e+000, 2.5943034781849354e+002,
|
||||
1.4039780562976958e+002, 6.3848706527260981e+002,
|
||||
7.2230525186138789e-002, -7.5445981266787754e-002,
|
||||
1.5712860749221762e+000, 1.7426560451795339e+002,
|
||||
-1.9309240362258871e+002, 7.0891416556762647e+002,
|
||||
2.0367310600105853e-002, 6.8565520026996951e-002,
|
||||
-5.4313033031644169e-004, -2.0146314940404827e+002,
|
||||
-1.3305643514116997e+002, 7.4933554744027231e+002,
|
||||
-3.4468530027734055e-002, 2.1921265175331925e-002,
|
||||
-1.5731053528054522e+000, -1.1155718744299284e+002,
|
||||
2.0307615364261443e+002, 8.4915903914333899e+002,
|
||||
3.7425562109513817e-002, 7.4883169379022230e-002,
|
||||
-3.6031632305130512e-002, -2.0094505419395196e+002,
|
||||
-1.1627359108310560e+002, 9.2021583518760133e+002,
|
||||
6.8105689976949157e-002, 6.4426739692440949e-002,
|
||||
-7.0967130057087435e-002, -1.9233852871740035e+002,
|
||||
-1.0334652096641923e+002, 1.0755293563503658e+003,
|
||||
-5.8017546499862287e-002, -1.6909812666033443e-003,
|
||||
-1.5876137659782963e+000, -1.0242234847115104e+002,
|
||||
2.2583088401423066e+002, 1.1125972190244058e+003 ]
|
||||
Image_points: !!opencv-matrix
|
||||
rows: 8
|
||||
cols: 54
|
||||
dt: "2f"
|
||||
data: [ 5.58494690e+002, 3.55650085e+002, 5.13314697e+002,
|
||||
3.59107666e+002, 4.65728333e+002, 3.62133911e+002,
|
||||
4.15701111e+002, 3.65026459e+002, 3.64399353e+002,
|
||||
3.67339203e+002, 3.12101196e+002, 3.69211914e+002,
|
||||
2.59208405e+002, 3.70413513e+002, 2.07456192e+002,
|
||||
3.71175995e+002, 1.56619507e+002, 3.72176544e+002,
|
||||
5.60868713e+002, 3.08104828e+002, 5.15191772e+002,
|
||||
3.10485626e+002, 4.67032959e+002, 3.12660004e+002,
|
||||
4.16112152e+002, 3.14887177e+002, 3.64010712e+002,
|
||||
3.16825775e+002, 3.10712372e+002, 3.18640808e+002,
|
||||
2.56853943e+002, 3.20017365e+002, 2.04168182e+002,
|
||||
3.20908417e+002, 1.52469528e+002, 3.22105377e+002,
|
||||
5.62328369e+002, 2.58646881e+002, 5.16396301e+002,
|
||||
2.59919281e+002, 4.67907654e+002, 2.61257874e+002,
|
||||
4.16463440e+002, 2.62675537e+002, 3.63546570e+002,
|
||||
2.64064117e+002, 3.09528137e+002, 2.65489990e+002,
|
||||
2.54765533e+002, 2.66862030e+002, 2.01299225e+002,
|
||||
2.67997345e+002, 1.48913437e+002, 2.69627167e+002,
|
||||
5.63098022e+002, 2.08423523e+002, 5.16782654e+002,
|
||||
2.08424667e+002, 4.68059296e+002, 2.08661697e+002,
|
||||
4.16216431e+002, 2.09268982e+002, 3.62888763e+002,
|
||||
2.10013397e+002, 3.08458557e+002, 2.11074738e+002,
|
||||
2.53267990e+002, 2.12496582e+002, 1.99121384e+002,
|
||||
2.14005814e+002, 1.46551376e+002, 2.15851318e+002,
|
||||
5.62997437e+002, 1.57966492e+002, 5.16406494e+002,
|
||||
1.56580688e+002, 4.67334900e+002, 1.55756500e+002,
|
||||
4.15378235e+002, 1.55492874e+002, 3.62096710e+002,
|
||||
1.55498734e+002, 3.07522827e+002, 1.56133240e+002,
|
||||
2.52235214e+002, 1.57516571e+002, 1.97876328e+002,
|
||||
1.59318787e+002, 1.45078247e+002, 1.61638428e+002,
|
||||
5.62097168e+002, 1.07469536e+002, 5.15766846e+002,
|
||||
1.04902527e+002, 4.66562866e+002, 1.03045807e+002,
|
||||
4.14651459e+002, 1.01924713e+002, 3.61240662e+002,
|
||||
1.01357826e+002, 3.06746613e+002, 1.01582802e+002,
|
||||
2.51568024e+002, 1.02920105e+002, 1.97343307e+002,
|
||||
1.04941299e+002, 1.44756821e+002, 1.07737488e+002,
|
||||
5.68062500e+002, 3.73591125e+002, 5.25272644e+002,
|
||||
3.77019318e+002, 4.79870941e+002, 3.80086578e+002,
|
||||
4.31823730e+002, 3.83036652e+002, 3.81995758e+002,
|
||||
3.85271759e+002, 3.30728729e+002, 3.86998779e+002,
|
||||
2.78071167e+002, 3.88151031e+002, 2.26231567e+002,
|
||||
3.88669586e+002, 1.74855331e+002, 3.89197998e+002,
|
||||
5.69792542e+002, 3.27097382e+002, 5.26866028e+002,
|
||||
3.29362366e+002, 4.81278229e+002, 3.31532928e+002,
|
||||
4.32783203e+002, 3.33552185e+002, 3.82408234e+002,
|
||||
3.35186554e+002, 3.30427399e+002, 3.36404053e+002,
|
||||
2.77138519e+002, 3.37450958e+002, 2.24525131e+002,
|
||||
3.37957092e+002, 1.72285507e+002, 3.38503540e+002,
|
||||
5.70942749e+002, 2.79243713e+002, 5.27789307e+002,
|
||||
2.80073486e+002, 4.82146576e+002, 2.81226410e+002,
|
||||
4.33247375e+002, 2.82237427e+002, 3.82503662e+002,
|
||||
2.83062286e+002, 3.30138885e+002, 2.83794434e+002,
|
||||
2.76433228e+002, 2.84549286e+002, 2.23158783e+002,
|
||||
2.84981049e+002, 1.70520218e+002, 2.85720886e+002,
|
||||
5.71001953e+002, 2.30928329e+002, 5.27846863e+002,
|
||||
2.30519928e+002, 4.82114563e+002, 2.30268906e+002,
|
||||
4.33114563e+002, 2.30243515e+002, 3.82384857e+002,
|
||||
2.30311340e+002, 3.29870392e+002, 2.30454620e+002,
|
||||
2.76012634e+002, 2.30882156e+002, 2.22529434e+002,
|
||||
2.31355362e+002, 1.69742065e+002, 2.32063004e+002,
|
||||
5.70199036e+002, 1.82609772e+002, 5.27030884e+002,
|
||||
1.80973267e+002, 4.81193573e+002, 1.79573792e+002,
|
||||
4.32409821e+002, 1.78475616e+002, 3.81855530e+002,
|
||||
1.77680283e+002, 3.29641937e+002, 1.77092087e+002,
|
||||
2.75895782e+002, 1.77155502e+002, 2.22438889e+002,
|
||||
1.77605667e+002, 1.69884583e+002, 1.78365585e+002,
|
||||
5.69026245e+002, 1.34654831e+002, 5.26171570e+002,
|
||||
1.31798691e+002, 4.80653503e+002, 1.29171509e+002,
|
||||
4.31869904e+002, 1.27280067e+002, 3.81419739e+002,
|
||||
1.25591202e+002, 3.29466644e+002, 1.24407089e+002,
|
||||
2.76225342e+002, 1.24174736e+002, 2.23024109e+002,
|
||||
1.24463333e+002, 1.70838898e+002, 1.25398903e+002,
|
||||
4.73812897e+002, 6.94673386e+001, 4.74245453e+002,
|
||||
1.12387466e+002, 4.74243347e+002, 1.56034164e+002,
|
||||
4.73834778e+002, 2.00523651e+002, 4.72891602e+002,
|
||||
2.44457306e+002, 4.71412811e+002, 2.87981171e+002,
|
||||
4.69708252e+002, 3.30783173e+002, 4.67558228e+002,
|
||||
3.71818420e+002, 4.65495667e+002, 4.11996979e+002,
|
||||
4.31027649e+002, 6.75546722e+001, 4.31269440e+002,
|
||||
1.10960022e+002, 4.31185486e+002, 1.55113556e+002,
|
||||
4.30830139e+002, 2.00061066e+002, 4.30168427e+002,
|
||||
2.44456863e+002, 4.29107544e+002, 2.88479645e+002,
|
||||
4.27829071e+002, 3.31813507e+002, 4.26131653e+002,
|
||||
3.73071228e+002, 4.24718811e+002, 4.13476563e+002,
|
||||
3.86868805e+002, 6.61982269e+001, 3.86895416e+002,
|
||||
1.09904411e+002, 3.86690216e+002, 1.54396423e+002,
|
||||
3.86368591e+002, 1.99800369e+002, 3.85792206e+002,
|
||||
2.44538574e+002, 3.85117279e+002, 2.88826447e+002,
|
||||
3.84405273e+002, 3.32408020e+002, 3.83303772e+002,
|
||||
3.74074097e+002, 3.82477448e+002, 4.14638977e+002,
|
||||
3.41941437e+002, 6.54462357e+001, 3.41628204e+002,
|
||||
1.09383698e+002, 3.41402344e+002, 1.54105545e+002,
|
||||
3.41168854e+002, 1.99655045e+002, 3.40816681e+002,
|
||||
2.44469910e+002, 3.40516937e+002, 2.88975800e+002,
|
||||
3.40365662e+002, 3.32670990e+002, 3.39935211e+002,
|
||||
3.74465759e+002, 3.39847626e+002, 4.14742279e+002,
|
||||
2.96694000e+002, 6.56859589e+001, 2.96075226e+002,
|
||||
1.09505333e+002, 2.95704895e+002, 1.54202652e+002,
|
||||
2.95653107e+002, 1.99734131e+002, 2.95589661e+002,
|
||||
2.44549530e+002, 2.95629547e+002, 2.88889496e+002,
|
||||
2.96138733e+002, 3.32610931e+002, 2.96520905e+002,
|
||||
3.74608551e+002, 2.96987091e+002, 4.14774902e+002,
|
||||
2.51414978e+002, 6.65755463e+001, 2.50681854e+002,
|
||||
1.10189331e+002, 2.50183380e+002, 1.54658005e+002,
|
||||
2.50331161e+002, 2.00073761e+002, 2.50590790e+002,
|
||||
2.44719513e+002, 2.51083817e+002, 2.88868286e+002,
|
||||
2.52134262e+002, 3.32266937e+002, 2.53097809e+002,
|
||||
3.74022491e+002, 2.54404007e+002, 4.14018066e+002,
|
||||
1.49524078e+002, 1.27699501e+002, 1.89511658e+002,
|
||||
1.25816605e+002, 2.31050888e+002, 1.24260918e+002,
|
||||
2.74076721e+002, 1.23023209e+002, 3.17643005e+002,
|
||||
1.22288109e+002, 3.61785889e+002, 1.22105164e+002,
|
||||
4.06142670e+002, 1.22401566e+002, 4.49623962e+002,
|
||||
1.23246025e+002, 4.92677216e+002, 1.24087708e+002,
|
||||
1.48706085e+002, 1.69077423e+002, 1.88827805e+002,
|
||||
1.67750443e+002, 2.30439865e+002, 1.66769333e+002,
|
||||
2.73830933e+002, 1.65871170e+002, 3.17596741e+002,
|
||||
1.65410919e+002, 3.61983459e+002, 1.65327866e+002,
|
||||
4.06748322e+002, 1.65463974e+002, 4.50450226e+002,
|
||||
1.66126526e+002, 4.93614655e+002, 1.66970413e+002,
|
||||
1.48312607e+002, 2.11499451e+002, 1.88574097e+002,
|
||||
2.10860214e+002, 2.30130676e+002, 2.10261612e+002,
|
||||
2.73557709e+002, 2.09837143e+002, 3.17542572e+002,
|
||||
2.09633057e+002, 3.62091248e+002, 2.09732620e+002,
|
||||
4.06934570e+002, 2.09926758e+002, 4.50914612e+002,
|
||||
2.10320221e+002, 4.94044495e+002, 2.10900925e+002,
|
||||
1.48613831e+002, 2.53997177e+002, 1.88797791e+002,
|
||||
2.53912842e+002, 2.30240204e+002, 2.53975067e+002,
|
||||
2.73746704e+002, 2.54010208e+002, 3.17718262e+002,
|
||||
2.54106003e+002, 3.62188965e+002, 2.54205475e+002,
|
||||
4.06908783e+002, 2.54317505e+002, 4.50824951e+002,
|
||||
2.54539490e+002, 4.93825714e+002, 2.54753876e+002,
|
||||
1.49541687e+002, 2.96404175e+002, 1.89357727e+002,
|
||||
2.97117523e+002, 2.30807007e+002, 2.97805603e+002,
|
||||
2.74325470e+002, 2.97966522e+002, 3.18042206e+002,
|
||||
2.98304535e+002, 3.62105774e+002, 2.98552643e+002,
|
||||
4.06672272e+002, 2.98572418e+002, 4.50363068e+002,
|
||||
2.98569550e+002, 4.93109894e+002, 2.98516205e+002,
|
||||
1.50883698e+002, 3.38493195e+002, 1.90633621e+002,
|
||||
3.39862610e+002, 2.31920990e+002, 3.40869415e+002,
|
||||
2.74971252e+002, 3.41453766e+002, 3.18235229e+002,
|
||||
3.41952637e+002, 3.62063477e+002, 3.42314026e+002,
|
||||
4.06098938e+002, 3.42221802e+002, 4.49477386e+002,
|
||||
3.42063812e+002, 4.91864716e+002, 3.41727600e+002,
|
||||
2.36129852e+002, 3.92798004e+002, 2.34999939e+002,
|
||||
3.56118683e+002, 2.34376099e+002, 3.18607025e+002,
|
||||
2.33822159e+002, 2.80400696e+002, 2.33565445e+002,
|
||||
2.42213104e+002, 2.33583069e+002, 2.03937286e+002,
|
||||
2.34028824e+002, 1.65756607e+002, 2.34613373e+002,
|
||||
1.28586639e+002, 2.35190308e+002, 9.18279037e+001,
|
||||
2.73031616e+002, 3.93267242e+002, 2.72295166e+002,
|
||||
3.56342743e+002, 2.71799347e+002, 3.18847412e+002,
|
||||
2.71418854e+002, 2.80287872e+002, 2.71161469e+002,
|
||||
2.41881134e+002, 2.71248962e+002, 2.03348145e+002,
|
||||
2.71379303e+002, 1.64895874e+002, 2.71946045e+002,
|
||||
1.27450935e+002, 2.72322418e+002, 9.06900787e+001,
|
||||
3.10670715e+002, 3.93568848e+002, 3.10389160e+002,
|
||||
3.56545959e+002, 3.10084625e+002, 3.18814514e+002,
|
||||
3.09801544e+002, 2.80242737e+002, 3.09678711e+002,
|
||||
2.41574814e+002, 3.09779663e+002, 2.02989838e+002,
|
||||
3.09842712e+002, 1.64338043e+002, 3.10076782e+002,
|
||||
1.26870911e+002, 3.10243286e+002, 8.98413315e+001,
|
||||
3.48618134e+002, 3.93563202e+002, 3.48617065e+002,
|
||||
3.56472382e+002, 3.48608795e+002, 3.18855621e+002,
|
||||
3.48544556e+002, 2.80011017e+002, 3.48556396e+002,
|
||||
2.41388168e+002, 3.48585388e+002, 2.02692429e+002,
|
||||
3.48435089e+002, 1.64099731e+002, 3.48442902e+002,
|
||||
1.26549957e+002, 3.48338043e+002, 8.98002014e+001,
|
||||
3.86625610e+002, 3.93188599e+002, 3.87047729e+002,
|
||||
3.56377594e+002, 3.87306274e+002, 3.18714752e+002,
|
||||
3.87337799e+002, 2.79868896e+002, 3.87402740e+002,
|
||||
2.41228760e+002, 3.87295166e+002, 2.02695313e+002,
|
||||
3.87030273e+002, 1.64203415e+002, 3.86741211e+002,
|
||||
1.26606262e+002, 3.86337311e+002, 8.99655075e+001,
|
||||
4.24534088e+002, 3.92702545e+002, 4.25310822e+002,
|
||||
3.55900452e+002, 4.25869019e+002, 3.18160614e+002,
|
||||
4.25909790e+002, 2.79615753e+002, 4.25977295e+002,
|
||||
2.41165100e+002, 4.25826477e+002, 2.02876389e+002,
|
||||
4.25331665e+002, 1.64527618e+002, 4.24775787e+002,
|
||||
1.27097328e+002, 4.23985138e+002, 9.08176651e+001,
|
||||
1.79142670e+002, 1.58573654e+002, 2.12791580e+002,
|
||||
1.56291031e+002, 2.47140106e+002, 1.54265656e+002,
|
||||
2.82607300e+002, 1.52373688e+002, 3.18175507e+002,
|
||||
1.50692184e+002, 3.54185852e+002, 1.49404175e+002,
|
||||
3.90455200e+002, 1.48229370e+002, 4.26106689e+002,
|
||||
1.47507843e+002, 4.61576141e+002, 1.46712479e+002,
|
||||
1.80388336e+002, 1.93027603e+002, 2.14026459e+002,
|
||||
1.91128204e+002, 2.48376541e+002, 1.89414978e+002,
|
||||
2.83795807e+002, 1.87720856e+002, 3.19472473e+002,
|
||||
1.86192383e+002, 3.55483826e+002, 1.84929199e+002,
|
||||
3.91970764e+002, 1.83747040e+002, 4.27654572e+002,
|
||||
1.82931534e+002, 4.63295227e+002, 1.81977234e+002,
|
||||
1.81914261e+002, 2.27955460e+002, 2.15291260e+002,
|
||||
2.26512482e+002, 2.49628265e+002, 2.25067520e+002,
|
||||
2.85066406e+002, 2.23593185e+002, 3.20846680e+002,
|
||||
2.22337708e+002, 3.56862885e+002, 2.21191040e+002,
|
||||
3.93279907e+002, 2.19905640e+002, 4.29202271e+002,
|
||||
2.18870361e+002, 4.64728424e+002, 2.17972977e+002,
|
||||
1.83496948e+002, 2.62963226e+002, 2.16930527e+002,
|
||||
2.61755219e+002, 2.51115829e+002, 2.60777222e+002,
|
||||
2.86553406e+002, 2.59500336e+002, 3.22299896e+002,
|
||||
2.58380737e+002, 3.58307648e+002, 2.57236694e+002,
|
||||
3.94551819e+002, 2.56009125e+002, 4.30358948e+002,
|
||||
2.54925797e+002, 4.65684998e+002, 2.54021484e+002,
|
||||
1.85461685e+002, 2.97687378e+002, 2.18712234e+002,
|
||||
2.96999207e+002, 2.52770218e+002, 2.96270752e+002,
|
||||
2.88213776e+002, 2.95168213e+002, 3.23698334e+002,
|
||||
2.94233032e+002, 3.59477722e+002, 2.93170715e+002,
|
||||
3.95647766e+002, 2.91897400e+002, 4.31309845e+002,
|
||||
2.90856995e+002, 4.66494110e+002, 2.89726410e+002,
|
||||
1.87661331e+002, 3.32186188e+002, 2.20767746e+002,
|
||||
3.31906250e+002, 2.54839096e+002, 3.31398651e+002,
|
||||
2.89963745e+002, 3.30524139e+002, 3.25207642e+002,
|
||||
3.29771820e+002, 3.60686035e+002, 3.28762695e+002,
|
||||
3.96576447e+002, 3.27542206e+002, 4.31994415e+002,
|
||||
3.26294189e+002, 4.66894653e+002, 3.24949921e+002,
|
||||
2.03543015e+002, 1.77473557e+002, 2.32777847e+002,
|
||||
1.74712509e+002, 2.62628723e+002, 1.72331970e+002,
|
||||
2.93045898e+002, 1.69686768e+002, 3.23527618e+002,
|
||||
1.67496246e+002, 3.54206787e+002, 1.65446075e+002,
|
||||
3.85180176e+002, 1.63360580e+002, 4.15484253e+002,
|
||||
1.61536423e+002, 4.45720947e+002, 1.59896164e+002,
|
||||
2.05864395e+002, 2.07228104e+002, 2.35242096e+002,
|
||||
2.04699326e+002, 2.64853973e+002, 2.02407455e+002,
|
||||
2.95353882e+002, 1.99972321e+002, 3.25811890e+002,
|
||||
1.97671921e+002, 3.56471252e+002, 1.95763168e+002,
|
||||
3.87280548e+002, 1.93597977e+002, 4.17615814e+002,
|
||||
1.91867371e+002, 4.48018677e+002, 1.90067413e+002,
|
||||
2.08421249e+002, 2.37166977e+002, 2.37513824e+002,
|
||||
2.34982773e+002, 2.67261261e+002, 2.32802841e+002,
|
||||
2.97555817e+002, 2.30466080e+002, 3.28118103e+002,
|
||||
2.28462463e+002, 3.58699707e+002, 2.26417038e+002,
|
||||
3.89468842e+002, 2.24356827e+002, 4.19895996e+002,
|
||||
2.22421921e+002, 4.50077850e+002, 2.20683517e+002,
|
||||
2.11095444e+002, 2.66940186e+002, 2.40241348e+002,
|
||||
2.64970093e+002, 2.69563019e+002, 2.63153290e+002,
|
||||
2.99863464e+002, 2.60983551e+002, 3.30282440e+002,
|
||||
2.58911560e+002, 3.60724792e+002, 2.56935730e+002,
|
||||
3.91487915e+002, 2.54799423e+002, 4.21789093e+002,
|
||||
2.52929688e+002, 4.51818481e+002, 2.51059357e+002,
|
||||
2.13829117e+002, 2.96591217e+002, 2.42742859e+002,
|
||||
2.94884583e+002, 2.72209076e+002, 2.93215668e+002,
|
||||
3.02402985e+002, 2.91230591e+002, 3.32536072e+002,
|
||||
2.89165192e+002, 3.62860901e+002, 2.87413605e+002,
|
||||
3.93481842e+002, 2.85199615e+002, 4.23728851e+002,
|
||||
2.83277496e+002, 4.53453094e+002, 2.81229309e+002,
|
||||
2.16799316e+002, 3.25975220e+002, 2.45605515e+002,
|
||||
3.24619904e+002, 2.74777344e+002, 3.22958679e+002,
|
||||
3.04762817e+002, 3.21008057e+002, 3.34797150e+002,
|
||||
3.19291443e+002, 3.65005798e+002, 3.17295044e+002,
|
||||
3.95311981e+002, 3.15296021e+002, 4.25312592e+002,
|
||||
3.13086945e+002, 4.54931152e+002, 3.11027130e+002,
|
||||
2.60550232e+002, 3.70739563e+002, 2.59674011e+002,
|
||||
3.42115936e+002, 2.58910492e+002, 3.13278015e+002,
|
||||
2.58195618e+002, 2.84013580e+002, 2.57727173e+002,
|
||||
2.55017166e+002, 2.57326263e+002, 2.25760986e+002,
|
||||
2.57096619e+002, 1.96577972e+002, 2.57031860e+002,
|
||||
1.68026199e+002, 2.56873383e+002, 1.39550308e+002,
|
||||
2.89019318e+002, 3.70481354e+002, 2.88355560e+002,
|
||||
3.41833252e+002, 2.87601471e+002, 3.12872925e+002,
|
||||
2.87057190e+002, 2.83485535e+002, 2.86599762e+002,
|
||||
2.54255096e+002, 2.86174438e+002, 2.25023285e+002,
|
||||
2.85775940e+002, 1.95715347e+002, 2.85577087e+002,
|
||||
1.66989502e+002, 2.85395477e+002, 1.38597382e+002,
|
||||
3.18072754e+002, 3.70118317e+002, 3.17432709e+002,
|
||||
3.41398743e+002, 3.16917267e+002, 3.12476044e+002,
|
||||
3.16284363e+002, 2.83001587e+002, 3.15799072e+002,
|
||||
2.53725845e+002, 3.15411957e+002, 2.24337708e+002,
|
||||
3.15070374e+002, 1.95034119e+002, 3.14736847e+002,
|
||||
1.66195313e+002, 3.14439789e+002, 1.37797058e+002,
|
||||
3.47083588e+002, 3.69678101e+002, 3.46717987e+002,
|
||||
3.40949524e+002, 3.46185303e+002, 3.12009857e+002,
|
||||
3.45728088e+002, 2.82454071e+002, 3.45226624e+002,
|
||||
2.53109863e+002, 3.44883606e+002, 2.23839539e+002,
|
||||
3.44373535e+002, 1.94399933e+002, 3.43879852e+002,
|
||||
1.65690643e+002, 3.43438629e+002, 1.37252930e+002,
|
||||
3.76341522e+002, 3.68972321e+002, 3.76086884e+002,
|
||||
3.40412842e+002, 3.75708893e+002, 3.11398376e+002,
|
||||
3.75143494e+002, 2.81901520e+002, 3.74762970e+002,
|
||||
2.52577988e+002, 3.74223969e+002, 2.23348221e+002,
|
||||
3.73600891e+002, 1.93979538e+002, 3.72983917e+002,
|
||||
1.65201294e+002, 3.72517273e+002, 1.36871033e+002,
|
||||
4.05512115e+002, 3.68243225e+002, 4.05366333e+002,
|
||||
3.39678650e+002, 4.05090027e+002, 3.10679108e+002,
|
||||
4.04612366e+002, 2.81203522e+002, 4.04152649e+002,
|
||||
2.52051605e+002, 4.03539703e+002, 2.22930420e+002,
|
||||
4.02903351e+002, 1.93625381e+002, 4.02272827e+002,
|
||||
1.65004440e+002, 4.01353333e+002, 1.36796814e+002 ]
|
Reference in New Issue
Block a user