问题描述
我正在使用 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,1.0e+00,5.0e+01,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,H3_1);
std::cout << "p1 from p3: " << dst1[0] << std::endl;
}
catch (std::exception& e)
{
std::cout << e.what() << std::endl;
}
std::cin.get();
}
结果: