2016-11-16 21 views
0

(В прошивке) нужно определить расстояние до нормирующих маркеров, который может быть повернут.OpenCV Получить расстояние до повернутых нормирующих маркеров (Aruco)

Я использую библиотеку Aruco, и до сих пор я реализовал обнаружение маркеров и оценку позиции в iOS, но мне действительно нужно расстояние до этого маркера с камеры.

Я видел несколько примеров использования фактического размера маркера, фокусного расстояния камеры и размера на экране маркера для вычисления расстояния, но это не учитывает любое вращение, применяемое к маркер.

Поскольку у меня есть оценка оценки позы, я «угадываю», что можно было бы повернуть угловые точки маркера, а затем использовать ограничительную рамку этих точек, а также реальный размер и фокусное расстояние камеры , Хотя я не совсем уверен, что это правильно или как его реализовать.

Это мой первый раз, когда я использую OpenCV, поэтому на самом деле я просто догадываюсь.

Любая помощь очень ценится.

Большое спасибо

ответ

0

Я использую этот код в моем проекте, чтобы обнаружить Z расстояние между камерой и маркером. Я не уверен, полностью ли это или нет, но дает приемлемые результаты.

Ptr<aruco::DetectorParameters> detectorParams = aruco::DetectorParameters::create(); 
detectorParams->doCornerRefinement = true; 

Ptr<aruco::Dictionary> dictionary = aruco::getPredefinedDictionary(aruco::PREDEFINED_DICTIONARY_NAME(kMarkerDictionaryID)); 

Mat camMatrix, distCoeffs; 

if (!readCameraParameters(kCameraParametersFile, camMatrix, distCoeffs)) { 

    // ... 

    return; 
} 

VideoCapture inputVideo; 
inputVideo.open(kCameraID); 

while (inputVideo.grab()) { 

    Mat image; 

    inputVideo.retrieve(image); 

    vector<int> ids; 
    vector< vector<Point2f> > corners; 
    vector<Vec3d> rvecs, tvecs; 

    aruco::detectMarkers(image, dictionary, corners, ids, detectorParams); 

    if (ids.size() > 0) { 

     aruco::estimatePoseSingleMarkers(corners, kMarkerLengthInMeters, camMatrix, distCoeffs, rvecs, tvecs); 

     for (unsigned int i = 0; i < ids.size(); i++) { 

      // if (ids[i] != kMarkerID) 
      //  continue; 

      // Calc camera pose 
      Mat R; 
      Rodrigues(rvecs[i], R); 
      Mat cameraPose = -R.t() * (Mat)tvecs[i]; 

      double x = cameraPose.at<double>(0,0); 
      double y = cameraPose.at<double>(0,1); 
      double z = cameraPose.at<double>(0,2); 

      // So z is the distance between camera and marker 

      // Or if you need rotation invariant offsets 
      // x = tvecs[i][0]; 
      // y = tvecs[i][0]; 
      // z = tvecs[i][0]; 

      cout << "X: " << x << " Y: " << y << " Z: " << z << endl; 

      aruco::drawAxis(image, camMatrix, distCoeffs, rvecs[i], tvecs[i], kMarkerLengthInMeters * 0.5f); 
     } 

     aruco::drawDetectedMarkers(image, corners, resultIds); 
    } 

    resize(image, image, Size(image.cols/2, image.rows/2)); 
    imshow("out", image); 
    char key = (char)waitKey(kWaitTimeInmS); 
    if (key == 27) break; 
} 

 Смежные вопросы

  • Нет связанных вопросов^_^