Aruco Marker обнаруживает один маркер - PullRequest
0 голосов
/ 08 марта 2019

У меня есть программа для обнаружения маркеров aruco, я хотел бы использовать 1 маркер его позы для расчета по изображению с камеры с несколькими идентификаторами aruco.

У меня есть доска с идентификатором aruco 256, 257, 258. Проблема в том, что при просмотре идентификатора aruco 256 он вычислит все теги aruco на изображении, а не только идентификатор aruco 256.

Есть ли решение этой проблемы, ниже моего кода.

************** код ****************

    // 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 голосов
/ 08 апреля 2019

Я не уверен, когда вы говорите, что «вычисляет все маркеры», если вы имеете в виду рисование всех обнаруженных маркеров.Если это так, проблема с вашим кодом заключается в приведенной ниже строке внутри оператора if.

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

Это продолжит рисовать все обнаруженные ids, даже если вы передадите только rvec[i] и tvec[i]к функции drawAxis.

...