图像几何纠正之:OpenCV实现薄板函数模型(TPS)对图像进行几何纠正

摘要:前段时间做了一个正射影像道路错开修复的项目,其中的关键是采用薄板函数模型对单张正射进行几何纠正,最后对纠正后的单张正射进行羽化拼接达到道路错开修复的效果(展示我做后处理的结果图)。当然,中间了遇到了一些困难,比如影像匹配效果不稳定和下文要讲的OpenCV中TPS接口的参数定义错误。下面是我利用OpenCV实现TPS时候遇到的一个问题:

1. 首先看看OpenCV中实现TPS功能的接口定义

(1)图片
图像几何纠正之:OpenCV实现薄板函数模型(TPS)对图像进行几何纠正_第1张图片

(2)OpenCV的源代码

/** @brief Estimate the transformation parameters of the current transformer algorithm, based on point matches.

    @param transformingShape Contour defining first shape.
    @param targetShape Contour defining second shape (Target).
    @param matches Standard vector of Matches between points.
     */
    **CV_WRAP virtual void estimateTransformation(InputArray transformingShape, InputArray targetShape,  std::vector& matches) = 0;**

2 正确的使用OpenCV的TPS接口

发现了吗?OpenCV中给的参数说明是,第一个点数组是目标点数组(目标形状),第二个点数组是起始坐标(开始时的形状),但如果这样用了,你会怀疑TPS的功能是否能满足你的要求。。。。。防止其他人和我一样跳入这个参数定义误导的坑,我分享该博客,下面是正确的使用方式:

std::cout << "\n正在TPS纠正第1张影像.....\n\n";
	m_TPSTransformer = cv::createThinPlateSplineShapeTransformer(0.0);
	m_TPSTransformer->estimateTransformation(leftGoalPtrs, leftStartPtrs, PointMatchesL);
	m_TPSTransformer->warpImage(inLeftImage, tpsOutLeftImage, cv::INTER_CUBIC);

	std::cout << "正在TPS纠正第2张影像......\n\n";
	m_TPSTransformer = cv::createThinPlateSplineShapeTransformer(0.0);
	m_TPSTransformer->estimateTransformation(rightGoaltPtrs, rightStartPtrs, PointMatchesR);
	m_TPSTransformer->warpImage(inRightImage, tpsOutRightImage, cv::INTER_CUBIC);

	inLeftImage.release();
	inRightImage.release();

其中 leftGoalPtrs是目标坐标的vector数组,leftStartPtrs是起始坐标的vectors数组,当然,怎么由leftStartPtrs和rightStartPtrs我们在这不需要关心,只需明白,estimateTransformation(leftGoalPtrs, leftStartPtrs, PointMatchesL)参数顺序为:目标形状、起始映射,而非OpenCV给的参数说明中的起始形状、点对映射

3. 下面是我用TPS模型实现的正射影像道路错开修复效果

欢迎提问和共同交流。
图像几何纠正之:OpenCV实现薄板函数模型(TPS)对图像进行几何纠正_第2张图片

希望对你有所帮助!

你可能感兴趣的:(图像几何纠正之:OpenCV实现薄板函数模型(TPS)对图像进行几何纠正)