Aruco标记检测单个标记

时间:2019-03-08 11:22:48

标签: c++ opencv aruco

我有一个可识别aruco标记的程序,我想使用1个标记的姿势来从具有多个aruco ID的相机图像进行计算。

我有一块具有aruco id 256、257、258的电路板。问题是,当看到aruco id 256时,它将计算图像中的所有aruco标签,而不仅是aruco id256。

在我的代码下方是否有解决此问题的方法。

**************代码****************

    // if marker detected = ID 256
for(int i = 0;i < ids.size();i++){
std::cout << "aruco ID: " << ids[i] << std::endl; //print de marker ID die we gevonden hebben
    if (ids[i]==256) // als de gedetecteerde marker gelijk is aan de gewenste marker 
    {
    std::cout << "aruco marker grootte in meters: " << actual_marker_length << std::endl;   
        cv::aruco::drawDetectedMarkers(image_copy, corners, ids); 
        std::vector<cv::Vec3d> rvecs, tvecs;
        cv::aruco::estimatePoseSingleMarkers(corners, actual_marker_length,
                camera_matrix, dist_coeffs, rvecs, tvecs);

        cv::aruco::drawAxis(image_copy, camera_matrix, dist_coeffs,
                rvecs[i], tvecs[i], 0.1);

        vector_to_marker.str(std::string());
        vector_to_marker << std::setprecision(4) 
                         << "x: " << std::setw(8)<<  tvecs[0](0);
        std::cout << "x: " << tvecs[0](0) << std::endl;

        cv::putText(image_copy, vector_to_marker.str(), 
                cvPoint(10, 30), cv::FONT_HERSHEY_SIMPLEX, 0.6, 
                cvScalar(0, 252, 124), 1, CV_AA);

        vector_to_marker.str(std::string());
        vector_to_marker << std::setprecision(4) 
                         << "y: " << std::setw(8) << tvecs[0](1);
        std::cout << "y: " << tvecs[0](1) << std::endl;

        cv::putText(image_copy, vector_to_marker.str(), 
                cvPoint(10, 50), cv::FONT_HERSHEY_SIMPLEX, 0.6, 
                cvScalar(0, 252, 124), 1, CV_AA);

    vector_to_marker.str(std::string());
    vector_to_marker << std::setprecision(4) 
    << "z: " << std::setw(8) << tvecs[0](2);

        berekenZ(ArucoMarker, tvecs[0](2));

    cv::putText(image_copy, vector_to_marker.str(), 
        cvPoint(10, 70), cv::FONT_HERSHEY_SIMPLEX, 0.6, 
        cvScalar(0, 252, 124), 1, CV_AA);

berekeningenIrLock(tvecs[0](0), tvecs[0](1), tvecs[0](2));


    }

1 个答案:

答案 0 :(得分:-1)

如果您指的是绘制所有检测到的标记,我不确定何时说“计算所有标记”。如果是这样,则您的代码存在问题,位于if语句的下面一行。

cv::aruco::drawDetectedMarkers(image_copy, corners, ids); 

即使您仅将idsrvec[i]传递给tvec[i]函数,这仍将绘制所有检测到的drawAxis