赞
踩
摘要:前段时间做了一个正射影像道路错开修复的项目,其中的关键是采用薄板函数模型对单张正射进行几何纠正,最后对纠正后的单张正射进行羽化拼接达到道路错开修复的效果(展示我做后处理的结果图)。当然,中间了遇到了一些困难,比如影像匹配效果不稳定和下文要讲的OpenCV中TPS接口的参数定义错误。下面是我利用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<DMatch>& matches) = 0;**
发现了吗?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给的参数说明中的起始形状、点对映射
欢迎提问和共同交流。
希望对你有所帮助!
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。