Subversion Repositories OpenCV2-Cookbook

Compare Revisions

Last modification

Regard whitespace Rev 5 → Rev 4

/trunk/Chapter 09/CameraCalibrator.h
26,8 → 26,7
#include "opencv2/calib3d/calib3d.hpp"
#include <opencv2/highgui/highgui.hpp>
 
class CameraCalibrator
{
class CameraCalibrator {
 
// input points
std::vector<std::vector<cv::Point3f> > objectPoints;
42,42 → 41,22
bool mustInitUndistort;
 
public:
CameraCalibrator() :
flag(0), mustInitUndistort(true)
{
}
;
CameraCalibrator() : flag(0), mustInitUndistort(true) {};
 
// Open the chessboard images and extract corner points
int
addChessboardPoints(const std::vector<std::string>& filelist,
cv::Size & boardSize);
int addChessboardPoints(const std::vector<std::string>& filelist, cv::Size & boardSize);
// Add scene points and corresponding image points
void
addPoints(const std::vector<cv::Point2f>& imageCorners,
const std::vector<cv::Point3f>& objectCorners);
void addPoints(const std::vector<cv::Point2f>& imageCorners, const std::vector<cv::Point3f>& objectCorners);
// Calibrate the camera
double
calibrate(cv::Size imageSize);
double calibrate(cv::Size &imageSize);
// Set the calibration flag
void
setCalibrationFlag(bool radial8CoeffEnabled = false,
bool tangentialParamEnabled = false);
void setCalibrationFlag(bool radial8CoeffEnabled=false, bool tangentialParamEnabled=false);
// Remove distortion in an image (after calibration)
cv::Mat
remap(const cv::Mat &image);
cv::Mat CameraCalibrator::remap(const cv::Mat &image);
 
// Getters
cv::Mat
getCameraMatrix()
{
return cameraMatrix;
}
cv::Mat
getDistCoeffs()
{
return distCoeffs;
}
cv::Mat getCameraMatrix() { return cameraMatrix; }
cv::Mat getDistCoeffs() { return distCoeffs; }
};
 
#endif // CAMERACALIBRATOR_H
/trunk/Chapter 09/calibrate.cpp
25,8 → 25,7
 
#include "CameraCalibrator.h"
 
int
main()
int main()
{
 
cv::namedWindow("Image");
34,12 → 33,10
std::vector<std::string> filelist;
 
// generate list of chessboard image filename
for (int i = 1; i <= 20; i++)
{
for (int i=1; i<=20; i++) {
 
std::stringstream str;
str << "../chessboards/chessboard" << std::setw(2) << std::setfill('0')
<< i << ".jpg";
str << "../chessboards/chessboard" << std::setw(2) << std::setfill('0') << i << ".jpg";
std::cout << str.str() << std::endl;
 
filelist.push_back(str.str());
53,7 → 50,8
CameraCalibrator cameraCalibrator;
// add the corners from the chessboard
cv::Size boardSize(6, 4);
cameraCalibrator.addChessboardPoints(filelist, // filenames of chessboard image
cameraCalibrator.addChessboardPoints(
filelist, // filenames of chessboard image
boardSize); // size of chessboard
// calibrate the camera
// cameraCalibrator.setCalibrationFlag(true,true);
65,17 → 63,10
 
// display camera matrix
cv::Mat cameraMatrix = cameraCalibrator.getCameraMatrix();
std::cout << " Camera intrinsic: " << cameraMatrix.rows << "x"
<< cameraMatrix.cols << std::endl;
std::cout << cameraMatrix.at<double>(0, 0) << " "
<< cameraMatrix.at<double>(0, 1) << " " << cameraMatrix.at<double>(0, 2)
<< std::endl;
std::cout << cameraMatrix.at<double>(1, 0) << " "
<< cameraMatrix.at<double>(1, 1) << " " << cameraMatrix.at<double>(1, 2)
<< std::endl;
std::cout << cameraMatrix.at<double>(2, 0) << " "
<< cameraMatrix.at<double>(2, 1) << " " << cameraMatrix.at<double>(2, 2)
<< std::endl;
std::cout << " Camera intrinsic: " << cameraMatrix.rows << "x" << cameraMatrix.cols << std::endl;
std::cout << cameraMatrix.at<double>(0,0) << " " << cameraMatrix.at<double>(0,1) << " " << cameraMatrix.at<double>(0,2) << std::endl;
std::cout << cameraMatrix.at<double>(1,0) << " " << cameraMatrix.at<double>(1,1) << " " << cameraMatrix.at<double>(1,2) << std::endl;
std::cout << cameraMatrix.at<double>(2,0) << " " << cameraMatrix.at<double>(2,1) << " " << cameraMatrix.at<double>(2,2) << std::endl;
 
imshow("Original Image", image);
imshow("Undistorted Image", uImage);
/trunk/Chapter 09/CameraCalibrator.cpp
18,10 → 18,9
#include "CameraCalibrator.h"
 
// Open chessboard images and extract corner points
int
CameraCalibrator::addChessboardPoints(const std::vector<std::string>& filelist,
cv::Size & boardSize)
{
int CameraCalibrator::addChessboardPoints(
const std::vector<std::string>& filelist,
cv::Size & boardSize) {
 
// the points on the chessboard
std::vector<cv::Point2f> imageCorners;
31,10 → 30,8
// Initialize the chessboard corners
// in the chessboard reference frame
// The corners are at 3D location (X,Y,Z)= (i,j,0)
for (int i = 0; i < boardSize.height; i++)
{
for (int j = 0; j < boardSize.width; j++)
{
for (int i=0; i<boardSize.height; i++) {
for (int j=0; j<boardSize.width; j++) {
 
objectCorners.push_back(cv::Point3f(i, j, 0.0f));
}
44,24 → 41,26
cv::Mat image; // to contain chessboard image
int successes = 0;
// for all viewpoints
for (unsigned int i = 0; i < filelist.size(); i++)
{
for (int i=0; i<filelist.size(); i++) {
 
// Open the image
image = cv::imread(filelist[i], 0);
 
// Get the chessboard corners
bool found = cv::findChessboardCorners(image, boardSize, imageCorners);
bool found = cv::findChessboardCorners(
image, boardSize, imageCorners);
 
// Get subpixel accuracy on the corners
cv::cornerSubPix(image, imageCorners, cv::Size(5, 5), cv::Size(-1, -1),
cv::TermCriteria(cv::TermCriteria::MAX_ITER + cv::TermCriteria::EPS,
cv::cornerSubPix(image, imageCorners,
cv::Size(5,5),
cv::Size(-1,-1),
cv::TermCriteria(cv::TermCriteria::MAX_ITER +
cv::TermCriteria::EPS,
30, // max number of iterations
0.1)); // min accuracy
 
// If we have a good board, add it to our data
if (imageCorners.size() == (unsigned int) boardSize.area())
{
if (imageCorners.size() == boardSize.area()) {
 
// Add image and scene points from one view
addPoints(imageCorners, objectCorners);
78,10 → 77,7
}
 
// Add scene points and corresponding image points
void
CameraCalibrator::addPoints(const std::vector<cv::Point2f>& imageCorners,
const std::vector<cv::Point3f>& objectCorners)
{
void CameraCalibrator::addPoints(const std::vector<cv::Point2f>& imageCorners, const std::vector<cv::Point3f>& objectCorners) {
 
// 2D image points from one view
imagePoints.push_back(imageCorners);
91,8 → 87,7
 
// Calibrate the camera
// returns the re-projection error
double
CameraCalibrator::calibrate(cv::Size imageSize)
double CameraCalibrator::calibrate(cv::Size &imageSize)
{
// undistorter must be reinitialized
mustInitUndistort = true;
101,7 → 96,8
std::vector<cv::Mat> rvecs, tvecs;
 
// start calibration
return calibrateCamera(objectPoints, // the 3D points
return
calibrateCamera(objectPoints, // the 3D points
imagePoints, // the image points
imageSize, // image size
cameraMatrix, // output camera matrix
113,16 → 109,14
}
 
// remove distortion in an image (after calibration)
cv::Mat
CameraCalibrator::remap(const cv::Mat &image)
{
cv::Mat CameraCalibrator::remap(const cv::Mat &image) {
 
cv::Mat undistorted;
 
if (mustInitUndistort)
{ // called once per calibration
if (mustInitUndistort) { // called once per calibration
 
cv::initUndistortRectifyMap(cameraMatrix, // computed camera matrix
cv::initUndistortRectifyMap(
cameraMatrix, // computed camera matrix
distCoeffs, // computed distortion matrix
cv::Mat(), // optional rectification (none)
cv::Mat(), // camera matrix to generate undistorted
135,24 → 129,21
}
 
// Apply mapping functions
cv::remap(image, undistorted, map1, map2, cv::INTER_LINEAR); // interpolation type
cv::remap(image, undistorted, map1, map2,
cv::INTER_LINEAR); // interpolation type
 
return undistorted;
}
 
 
// Set the calibration options
// 8radialCoeffEnabled should be true if 8 radial coefficients are required (5 is default)
// tangentialParamEnabled should be true if tangeantial distortion is present
void
CameraCalibrator::setCalibrationFlag(bool radial8CoeffEnabled,
bool tangentialParamEnabled)
{
void CameraCalibrator::setCalibrationFlag(bool radial8CoeffEnabled, bool tangentialParamEnabled) {
 
// Set the flag used in cv::calibrateCamera()
flag = 0;
if (!tangentialParamEnabled)
flag += CV_CALIB_ZERO_TANGENT_DIST;
if (radial8CoeffEnabled)
flag += CV_CALIB_RATIONAL_MODEL;
if (!tangentialParamEnabled) flag += CV_CALIB_ZERO_TANGENT_DIST;
if (radial8CoeffEnabled) flag += CV_CALIB_RATIONAL_MODEL;
}