如何计算两次透视变换后的结果?
How to compute the result after two perspective transformations?
我正在使用 OpenCV 进行图像拼接项目。现在我有了 img1 和 img2 之间的单应性 H1,以及 img2 和 img3 之间的单应性 H2。现在我需要计算 img1 和 img3 之间的单应性,简单地乘以 H1*H2 是行不通的。
有什么想法可以计算 img1 和 img3 之间的新单应性吗?
对我来说,计算 H1 * H2
效果很好,并给出了正确的结果。
这里,H1 = H2_1
因为它从 image2 扭曲到 image1。
H2 = H3_2
因为它从 image3 扭曲到 image2。
H1 * H2 = H3_1
因为它从图像 3 扭曲到图像 1。
int main()
{
try {
cv::Mat H2_1 = (cv::Mat_<double>(3, 3) << 1.0e+00, 0.0e+00, 1.8e+03, 0.0e+00, 1.0e+00, 5.0e+01, 0.0e+00, 0.0e+00, 1.0e+00);
cv::Mat H3_2 = (cv::Mat_<double>(3, 3) << 0.949534471, -0.00581765975, 66.7917766, -0.0113810490, 0.981450515, -0.672362563, -0.000147974585, 0.00000992770511, 1.0);
cv::Mat H3_1 = H2_1 * H3_2;
cv::Point2f p3(500, 500);
std::vector<cv::Point2f> src3;
src3.push_back( p3 );
src3.push_back(p3);
std::vector<cv::Point2f> dst2;
cv::perspectiveTransform(src3, dst2, H3_2);
std::cout << "p1: " << p3 << std::endl;
std::cout << "p2: " << dst2[0] << std::endl;
std::vector<cv::Point2f> dst1;
cv::perspectiveTransform(dst2, dst1, H2_1);
std::cout << "p1 from p2: " << dst1[0] << std::endl;
dst1.clear();
cv::perspectiveTransform(src3, dst1, H3_1);
std::cout << "p1 from p3: " << dst1[0] << std::endl;
}
catch (std::exception& e)
{
std::cout << e.what() << std::endl;
}
std::cin.get();
}
结果:
我正在使用 OpenCV 进行图像拼接项目。现在我有了 img1 和 img2 之间的单应性 H1,以及 img2 和 img3 之间的单应性 H2。现在我需要计算 img1 和 img3 之间的单应性,简单地乘以 H1*H2 是行不通的。
有什么想法可以计算 img1 和 img3 之间的新单应性吗?
对我来说,计算 H1 * H2
效果很好,并给出了正确的结果。
这里,H1 = H2_1
因为它从 image2 扭曲到 image1。
H2 = H3_2
因为它从 image3 扭曲到 image2。
H1 * H2 = H3_1
因为它从图像 3 扭曲到图像 1。
int main()
{
try {
cv::Mat H2_1 = (cv::Mat_<double>(3, 3) << 1.0e+00, 0.0e+00, 1.8e+03, 0.0e+00, 1.0e+00, 5.0e+01, 0.0e+00, 0.0e+00, 1.0e+00);
cv::Mat H3_2 = (cv::Mat_<double>(3, 3) << 0.949534471, -0.00581765975, 66.7917766, -0.0113810490, 0.981450515, -0.672362563, -0.000147974585, 0.00000992770511, 1.0);
cv::Mat H3_1 = H2_1 * H3_2;
cv::Point2f p3(500, 500);
std::vector<cv::Point2f> src3;
src3.push_back( p3 );
src3.push_back(p3);
std::vector<cv::Point2f> dst2;
cv::perspectiveTransform(src3, dst2, H3_2);
std::cout << "p1: " << p3 << std::endl;
std::cout << "p2: " << dst2[0] << std::endl;
std::vector<cv::Point2f> dst1;
cv::perspectiveTransform(dst2, dst1, H2_1);
std::cout << "p1 from p2: " << dst1[0] << std::endl;
dst1.clear();
cv::perspectiveTransform(src3, dst1, H3_1);
std::cout << "p1 from p3: " << dst1[0] << std::endl;
}
catch (std::exception& e)
{
std::cout << e.what() << std::endl;
}
std::cin.get();
}
结果: