OpenCV findHomography变换结果不准确问题求助
OpenCV findHomography 变换结果不准确问题排查
问题描述
使用OpenCV的findHomography函数时,无法将物体角点正确变换到目标平面(坐标范围-0.5到0.5)。相关代码及测试情况如下:
单应性计算代码
std::vector<cv::Point> srcPts = board.getCornerPoints(); // 图像尺寸: 640x480 // srcPts坐标: // [158, 110; // 488, 114; // 507, 296; // 100, 284] const std::vector<cv::Point2f> destPts { cv::Point2f(-0.5, 0.5), cv::Point2f(0.5, 0.5), cv::Point2f(0.5, -0.5), cv::Point2f(-0.5, -0.5), }; cv::Mat H = cv::findHomography(srcPts, destPts);
测试代码及结果
cv::Point pt = boardDetector.getCornerPoints()[0]; cv::Mat test = (cv::Mat_<double>(3, 1) << pt.x, pt.y, 1); cv::Mat H_pt = H * test;
- 预期结果:
(-0.5, 0.5) - 实际结果:
(-0.59675, 0.59675) - 额外操作:将角点乘相机矩阵转相机坐标后,结果误差更大;手动指定
findHomography计算方法无改善。
原因分析与解决方案
1. 未对齐次坐标结果做归一化
findHomography输出的是3x3齐次变换矩阵,变换后的结果是齐次坐标(x', y', w'),必须除以第三个分量w才能得到笛卡尔坐标(x'/w, y'/w)。当前测试代码直接使用了x'和y',没有做归一化,这是误差的核心原因。
修复代码:
cv::Mat H_pt = H * test; double w = H_pt.at<double>(2, 0); double x = H_pt.at<double>(0, 0) / w; double y = H_pt.at<double>(1, 0) / w; // 此时x、y会接近预期的-0.5和0.5
2. 点对顺序匹配验证(可选排查)
虽然给出的srcPts和destPts顺序看起来是对应的(左上→右上→右下→左下),但仍需确认实际检测到的srcPts坐标顺序完全匹配目标点顺序。如果点对顺序错位,会导致变换结果偏移或扭曲。
3. 错误引入相机坐标转换
单应性矩阵是图像平面到目标2D平面的直接映射,不需要先将图像点转换为相机坐标。额外的相机矩阵变换会破坏原有的单应性映射关系,导致结果更差,应移除这一步操作。
内容的提问来源于stack exchange,提问作者Johan Daniel
相关产品推荐
相关产品推荐

