OpenCV的estimateAffinePartial2D所需输入格式?gocv调用报错如何解决?
问题原因与解决方案
estimateAffinePartial2D输入要求
- 两个输入点集长度必须完全相等,相同索引位置的点为一一对应的匹配点对
- 每个点为2维浮点型坐标,输入点数最少为3个,为保证变换矩阵准确性通常建议不低于6个
- 输入点集格式为
Point2fVector类型,对应OpenCV原生的vector<Point2f>结构
报错根因
你当前的代码存在两个核心错误,触发了OpenCV的断言校验:
- 未提取匹配对应点对:你直接传入了模板图和目标图提取到的所有关键点,这两个点集长度不一致、也没有一一对应关系,完全不符合输入要求。Python代码中是根据筛选后的
good匹配结果,分别取queryIdx(对应模板图关键点索引)和trainIdx(对应目标图关键点索引)来生成等长的对应点集,Go代码中缺失了这一步逻辑。 KnnMatch参数设置错误:你调用时传入的k值为4,而Lowe比率测试仅需要前2个匹配结果,设置为4无意义,虽然不直接导致报错,但会造成不必要的性能开销。
修复代码
首先修改KnnMatch的调用参数:
// 原来的代码 // matches := matcher.KnnMatch(des1, des2, 4) // 修改为 matches := matcher.KnnMatch(des1, des2, 2)
然后替换生成点集的逻辑,删除原有的kp1vec := kp2Point2f(kp1)、kp2vec := kp2Point2f(kp2)代码,替换为以下逻辑:
// 根据匹配结果生成一一对应的点集 srcPoints := make([]gocv.Point2f, 0, len(goodMatches)) dstPoints := make([]gocv.Point2f, 0, len(goodMatches)) for _, match := range goodMatches { srcPoints = append(srcPoints, gocv.Point2f{ X: float32(kp1[match.QueryIdx].X), Y: float32(kp1[match.QueryIdx].Y), }) dstPoints = append(dstPoints, gocv.Point2f{ X: float32(kp2[match.TrainIdx].X), Y: float32(kp2[match.TrainIdx].Y), }) } kp1vec := gocv.NewPoint2fVectorFromPoints(srcPoints) kp2vec := gocv.NewPoint2fVectorFromPoints(dstPoints)
另外可根据需要将Lowe比率阈值调整为和Python一致的0.75,保证结果对齐。
内容的提问来源于stack exchange,提问作者TechplexEngineer
相关产品推荐
相关产品推荐

