OpenCV obtiene una vista de arriba hacia abajo del patrón plano usando intrínseco y extrínseco de cameraCalibrate

Originalmente tengo una imagen con una cuadrícula de círculo perfecta, denotada comoA Le agrego algo de distorsión de lente y transformación de perspectiva, y se convierte enB En la calibración de la cámara,A sería mi imagen de destino, yB Sería mi imagen de origen. Digamos que tengo todas las coordenadas del centro del círculo en ambas imágenes, almacenadas enstdPts ydisPts.

//25 center pts in A
vector<Point2f> stdPts;
for (int i = 0; i <= 4; ++i) {
    for (int j = 0; j <= 4; ++j) {
        stdPts[i * 5 + j].x = 250 + i * 500;
        stdPts[i * 5 + j].y = 200 + j * 400;
    }
}
//25 center pts in B
vector<Point2f> disPts = FindCircleCenter();

Quiero generar una imagenC eso es tan cerca comoA, de entrada:B, stdPts ydisPts. Traté de usar el intrínseco y extrínseco generado por cv :: calibrateCamera. Aquí está mi código:

//prepare object_points and image_points
vector<vector<Point3f>> object_points;
vector<vector<Point2f>> image_points;
object_points.push_back(stdPts);
image_points.push_back(disPts);


//prepare distCoeffs rvecs tvecs
Mat distCoeffs = Mat::zeros(5, 1, CV_64F);
vector<Mat> rvecs;
vector<Mat> tvecs;


//prepare camera matrix
Mat intrinsic = Mat::eye(3, 3, CV_64F);

//solve calibration
calibrateCamera(object_points, image_points, Size(2500,2000), intrinsic, distCoeffs, rvecs, tvecs);


//apply undistortion
string inputName = "../B.jpg";
Mat imgB = imread(imgName);
cvtColor(imgB, imgB, CV_BGR2GRAY)
Mat tempImgC;
undistort(imgB, tempImgC, intrinsic, distCoeffs);


//apply perspective transform
double transData[] = { 0, 0, tvecs[0].at<double>(0), 0, 0,,tvecs[0].at<double>(1), 0, 0,  tvecs[0].at<double>(2) };
Mat translate3x3(3, 3, CV_64F, transData);
Mat rotation3x3;
Rodrigues(rvecs[0], rotation3x3);

Mat transRot3x3(3, 3, CV_64F);
rotation3x3.col(0).copyTo(transRot3x3.col(0));
rotation3x3.col(1).copyTo(transRot3x3.col(1));
translate3x3.col(2).copyTo(transRot3x3.col(2));

Mat imgC;
Mat matPerspective = intrinsic*transRot3x3;
warpPerspective(tempImgC, imgC, matPerspective, Size(2500, 2000));

//write
string outputName = "../C.jpg";
imwrite(outputName, imgC); // A JPG FILE IS BEING SAVED

Y aquí está la imagen del resultado.C, que no trata la transformación de perspectiva en absoluto.

Entonces, ¿alguien podría enseñarme cómo recuperarme?A? Gracias.

Respuestas a la pregunta(1)

Su respuesta a la pregunta