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

使用ArUco标记时坐标轴计算异常问题求助

OpenCV ArUco标记方向识别异常:Z轴始终指向左上角

问题描述

我在研究用OpenCV识别褶皱位置的示例,标记线显示正常,但方向识别存在问题——Z轴始终指向左上角。

原始代码

float markerLength = 0.2;

// Set coordinate system
cv::Mat objPoints(4, 1, CV_32FC3);
objPoints.ptr<cv::Vec3f>(0)[0] = cv::Vec3f(-markerLength/2.f,  markerLength/2.f, 0);
objPoints.ptr<cv::Vec3f>(0)[1] = cv::Vec3f( markerLength/2.f,  markerLength/2.f, 0);
objPoints.ptr<cv::Vec3f>(0)[2] = cv::Vec3f( markerLength/2.f, -markerLength/2.f, 0);
objPoints.ptr<cv::Vec3f>(0)[3] = cv::Vec3f(-markerLength/2.f, -markerLength/2.f, 0);

cv::Mat cameraMatrix(3,3,cv::DataType<double>::type);
cv::setIdentity(cameraMatrix);
cv::Mat distCoeffs(4,1,cv::DataType<double>::type);
distCoeffs.at<double>(0) = 0;
distCoeffs.at<double>(1) = 0;
distCoeffs.at<double>(2) = 0;
distCoeffs.at<double>(3) = 0;

std::vector<cv::Vec3d> rvecs, tvecs;

while (m_videoCap.isOpened()) {
    m_videoCap >> m_frame;

    if (!m_frame.empty()) {
        // Draw marker centers
        cv::Mat outputImage = m_frame.clone();

        std::vector<int> markerIds;
        std::vector<std::vector<cv::Point2f>> markerCorners, rejectedCandidates;
        cv::Ptr<cv::aruco::DetectorParameters> parameters = cv::aruco::DetectorParameters::create();
        cv::Ptr<cv::aruco::Dictionary> dictionary = cv::aruco::getPredefinedDictionary(cv::aruco::DICT_4X4_250);
        cv::aruco::detectMarkers(m_frame, dictionary, markerCorners, markerIds, parameters, rejectedCandidates);
        cv::aruco::drawDetectedMarkers(outputImage, markerCorners);

        int nMarkers = markerCorners.size();
        std::vector<cv::Vec3d> rvecs(nMarkers), tvecs(nMarkers);

        for (int i = 0; i < nMarkers; i++) {
            auto& corners = markerCorners[i];

            cv::solvePnP(objPoints, corners, cameraMatrix, distCoeffs, rvecs.at(i), tvecs.at(i));
            cv::drawFrameAxes(outputImage, cameraMatrix, distCoeffs, rvecs[i], tvecs[i], 0.1, 2);
        }

        m_Pixmap = cvMatToQPixmap(outputImage);
        emit newPixmapCaptured();
    }
}

问题解决

按照建议修改相机初始化代码后,方向识别异常的问题已解决:

// f[px] = x[px] * z[m] / x[m]
float focalLen = 950 * 1.3f / 0.45f;
cv::Matx33f cameraMatrix(focalLen, 0.0f,     (1280-1) / 2.0f,
                         0.0f,     focalLen, (780-1) / 2.0f,
                         0.0f,     0.0f,     1.0f);

内容的提问来源于stack exchange,提问作者JMA

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.20 11:57:25