You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于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);

正确解决方案

参考评论指导,通过以下逻辑实现:

  1. 在理想坐标系中,结合已知的标记尺寸、色卡相对位置及色卡尺寸,计算色卡四个角点的坐标
  2. 对之前生成的透视变换矩阵取逆,将理想坐标系下的色卡角点通过逆透视变换映射到实际图像坐标系,得到色卡角点的真实坐标

实现代码如下:

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.15 09:52:37