Hello. I am trying to compute point cloud from two cameras.
1. Find chessboard corners using **findChessboardCorners**
2. Calibrate cameras using **stereoCalibrate**
3. Calculate rectify matrix using **stereoRectify**
4. Calculate remap maps using **initUndistortRectifyMap**
5. Remap images
And I got a very bad results:

It's not so bad like this:

Is the any way to fix it?
This is my code (also available on [GitHub](https://github.com/Garrus007/Vision3D)):
// left - vector of grayscale images from left camera
// right - vector of grayscale images from right camera
// patternSize - number of chessboard corners
StereoCalibData StereoVision::Calibrate(const std::vector& left, const std::vector& right, cv::Size patternSize)
{
cv::Size imSize;
// Images points
std::vector imagePointsLeftSingle, imagePointsRightSingle;
std::vector> imagePointsLeft, imagePointsRight;
// Object points
std::vector objectPointsSingle;
std::vector> objectPoints;
//stereoCalibrate output
cv::Mat CM1(3, 3, CV_64FC1), CM2(3, 3, CV_64FC1); //Camera matrix
cv::Mat D1, D2; //Distortion
cv::Mat R, //Rotation matrix
T, //Translation matrix
E, //Существенная матрица
F; //Фундаментальная матрица
//stereoRectify output
cv::Mat R1, R2, P1, P2;
cv::Mat Q;
//1. --------------------------- Find chessboard corners ---------------------------------------------------------------
for (int i = 0; i < left.size(); i++)
{
//Finding chessboard corners
bool isFoundLeft = cv::findChessboardCorners(left[i], patternSize, imagePointsLeftSingle, CV_CALIB_CB_ADAPTIVE_THRESH | CV_CALIB_CB_FILTER_QUADS);
bool isFoundRight = cv::findChessboardCorners(right[i], patternSize, imagePointsRightSingle, CV_CALIB_CB_ADAPTIVE_THRESH | CV_CALIB_CB_FILTER_QUADS);
imSize = left[i].size();
cornerSubPix(left[i], imagePointsLeftSingle, cv::Size(11, 11), cv::Size(-1, -1), cv::TermCriteria(CV_TERMCRIT_EPS + CV_TERMCRIT_ITER, 30, 0.1));
cornerSubPix(right[i], imagePointsRightSingle, cv::Size(11, 11), cv::Size(-1, -1), cv::TermCriteria(CV_TERMCRIT_EPS + CV_TERMCRIT_ITER, 30, 0.1));
//Sometimes chessboard corners are found in bad direction (vertically lines), so I "rotate" them
_fixChessboardCorners(imagePointsLeftSingle, patternSize);
_fixChessboardCorners(imagePointsRightSingle, patternSize);
//Add to the corners vectors
imagePointsLeft.push_back(imagePointsLeftSingle);
imagePointsRight.push_back(imagePointsRightSingle);
}
//2. --------------------------- Compute object points ------------------------------------------------------------------
for (int j = 0; j
↧