基于ArUco标记的透视场景下2D平面真实距离点求解
透视拍摄下基于ArUco标记计算色卡角点的解决方案
问题背景
现有一把集成ArUco标记与色卡的标尺,标记尺寸、色卡尺寸及二者间距均已知。需在透视拍摄场景下,通过ArUco标记的四个角点(M1-M4)计算色卡的四个角点(C1-C4)坐标——此场景下无法直接通过向量缩放完成计算,采用C++结合OpenCV实现。
错误尝试过程
曾尝试直接构建透视变换矩阵,但因将ArUco标记的理想坐标设置在图像原点导致方案失效,代码如下:
const std::vector<cv::Point2f> ruler_inner_rect_real = { left_marker.at(0), left_marker.at(1), left_marker.at(2), left_marker.at(3) }; const std::vector<cv::Point2f> RULER_INNER_RECT_IDEAL = { cv::Point2f(0, 0), cv::Point2f(this->marker_size, 0), cv::Point2f(this->marker_size, this->marker_size), cv::Point2f(0, this->marker_size), }; cv::Mat tmat = cv::getPerspectiveTransform(ruler_inner_rect_real, RULER_INNER_RECT_IDEAL);
正确解决方案
参考评论指导,通过以下逻辑实现:
- 在理想坐标系中,结合已知的标记尺寸、色卡相对位置及色卡尺寸,计算色卡四个角点的坐标
- 对之前生成的透视变换矩阵取逆,将理想坐标系下的色卡角点通过逆透视变换映射到实际图像坐标系,得到色卡角点的真实坐标
实现代码如下:
const std::vector<cv::Point2f> in = { cv::Point2f(this->marker_size+this->color_checker_position_mm.width, this->color_checker_position_mm.height), cv::Point2f(this->marker_size+this->color_checker_position_mm.width+this->color_checker_width, this->color_checker_position_mm.height), cv::Point2f(this->marker_size+this->color_checker_position_mm.width+this->color_checker_width, this->marker_size+this->color_checker_position_mm.height), cv::Point2f(this->marker_size+this->color_checker_position_mm.width, this->marker_size+this->color_checker_position_mm.height), }; std::vector<cv::Point2f> out; cv::perspectiveTransform(in, out, tmat.inv());
内容的提问来源于stack exchange,提问作者Matej
相关产品推荐
相关产品推荐

