и, таким образом, потеря информации предотвращается.
ально у меня есть изображение с идеальной круговой сеткой, обозначенное какA Я добавляю некоторые искажения объектива и трансформацию перспективы, и это становитсяB В калибровке камеры,A будет мое изображение назначения, иB будет моим исходным изображением. Допустим, у меня есть все координаты центра круга на обоих изображениях, сохраненные вstdPts а такжеdisPts.
//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();
Я хочу создать изображениеC это так близкоAот ввода:B, stdPts а такжеdisPts, Я попытался использовать внутреннее и внешнее, сгенерированное cv :: calibrateCamera. Вот мой код:
//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
И вот результат изображенияC, который не имеет дело с перспективным преобразованием вообще.
Так может ли кто-нибудь научить меня, как выздороветьA? Благодарю.