2016-03-16 4 views
0

Je viens de construire aruco 1.3.0 et l'aruco_test fonctionne parfaitement. Jusqu'ici j'ai essayé d'aller chercher le marqueur avec Opencv + kinect v2. Le marqueur est détecté mais n'a pas de rotation et de traduction. Quelqu'un a déjà rencontré des questions similaires?Aruco marqueur n'a pas de rotation et de traduction

#include <iostream> 

// OpenCV Header 
#include <opencv2/opencv.hpp> 
#include <opencv2/core.hpp> 
#include <opencv2/highgui.hpp> 
#include "opencv2/imgproc/imgproc.hpp" 
#include <aruco.h> 

// Kinect for Windows SDK Header 
#include <Kinect.h> 

using namespace std; 
using namespace aruco; 
using namespace cv; 

float TheMarkerSize = -1; 
int ThePyrDownLevel; 
MarkerDetector MDetector; 
vector<Marker> TheMarkers; 
CameraParameters TheCameraParameters; 


int main(int argc, char** argv) 
{ 
    TheCameraParameters.readFromXMLFile("camera.yml"); 
    if (ThePyrDownLevel > 0) 
     MDetector.pyrDown(ThePyrDownLevel); 


    MDetector.setThresholdParams(7, 7); 
    MDetector.setThresholdParamRange(2, 0); 


    // 1a. Get default Sensor 
    cout << "Try to get default sensor" << endl; 
    IKinectSensor* pSensor = nullptr; 
    if (GetDefaultKinectSensor(&pSensor) != S_OK) 
    { 
     cerr << "Get Sensor failed" << endl; 
     return -1; 
    } 

    // 1b. Open sensor 
    cout << "Try to open sensor" << endl; 
    if (pSensor->Open() != S_OK) 
    { 
     cerr << "Can't open sensor" << endl; 
     return -1; 
    } 

    // 2a. Get frame source 
    cout << "Try to get color source" << endl; 
    IColorFrameSource* pFrameSource = nullptr; 
    if (pSensor->get_ColorFrameSource(&pFrameSource) != S_OK) 
    { 
     cerr << "Can't get color frame source" << endl; 
     return -1; 
    } 

    // 2b. Get frame description 
    cout << "get color frame description" << endl; 
    int  iWidth = 0; 
    int  iHeight = 0; 
    IFrameDescription* pFrameDescription = nullptr; 
    if (pFrameSource->get_FrameDescription(&pFrameDescription) == S_OK) 
    { 
     pFrameDescription->get_Width(&iWidth); 
     pFrameDescription->get_Height(&iHeight); 
    } 
    pFrameDescription->Release(); 
    pFrameDescription = nullptr; 

    // 3a. get frame reader 
    cout << "Try to get color frame reader" << endl; 
    IColorFrameReader* pFrameReader = nullptr; 
    if (pFrameSource->OpenReader(&pFrameReader) != S_OK) 
    { 
     cerr << "Can't get color frame reader" << endl; 
     return -1; 
    } 

    // 2c. release Frame source 
    cout << "Release frame source" << endl; 
    pFrameSource->Release(); 
    pFrameSource = nullptr; 

    // Prepare OpenCV data 
    cv::Mat mImg(iHeight, iWidth, CV_8UC4); 
    cv::Mat mImg2(iHeight, iWidth, CV_8UC1); 
    UINT uBufferSize = iHeight * iWidth * 4 * sizeof(BYTE); 
    cv::namedWindow("Color Map"); 

    // Enter main loop 
    while (true) 
    { 
     // 4a. Get last frame 
     IColorFrame* pFrame = nullptr; 
     if (pFrameReader->AcquireLatestFrame(&pFrame) == S_OK) 
     { 
      cout << GetTickCount() << endl; 
      // 4c. Copy to OpenCV image 
      if (pFrame->CopyConvertedFrameDataToArray(uBufferSize, mImg.data, ColorImageFormat_Bgra) == S_OK) 
      { 
       cvtColor(mImg, mImg2, CV_BGR2GRAY); 
       //camParam.resize(mImg2.size()); 
       MDetector.detect(mImg2, TheMarkers, TheCameraParameters, TheMarkerSize); 

       if (TheMarkers.size() > 0) { 
        //for each marker, draw info and its boundaries in the image 
        for (unsigned int i = 0;i<TheMarkers.size();i++) { 
         cout << TheMarkers[i] << endl; 
         TheMarkers[i].draw(mImg2, Scalar(0, 0, 255), 1); 

        } 
       } 
       if (TheCameraParameters.isValid()) 
        for (unsigned int i = 0; i < TheMarkers.size(); i++) { 
         CvDrawingUtils::draw3dCube(mImg2, TheMarkers[i], TheCameraParameters); 
         CvDrawingUtils::draw3dAxis(mImg2, TheMarkers[i], TheCameraParameters); 
        } 

       cv::imshow("Color Map", mImg2); 
      } 
      else 
      { 
       cerr << "Data copy error" << endl; 
      } 

      // 4e. release frame 
      pFrame->Release(); 
     } 

     // 4f. check keyboard input 
     if (cv::waitKey(30) == VK_ESCAPE) { 
      break; 
     } 
    } 

    // 3b. release frame reader 
    cout << "Release frame reader" << endl; 
    pFrameReader->Release(); 
    pFrameReader = nullptr; 

    // 1c. Close Sensor 
    cout << "close sensor" << endl; 
    pSensor->Close(); 

    // 1d. Release Sensor 
    cout << "Release sensor" << endl; 
    pSensor->Release(); 
    pSensor = nullptr; 

    return 0; 
} 

Le résultat ressemble

637=(934.56,481.291) (763.227,482.706) (737.609,222.863) (907.926,266.524) Txyz= 
-999999 -999999 -999999 Rxyz=-999999 -999999 -999999 
87746890 
637=(934.503,481.388) (763.178,482.765) (737.533,223.02) (907.796,266.664) Txyz= 
-999999 -999999 -999999 Rxyz=-999999 -999999 -999999 
87747390 
637=(934.145,481.07) (762.71,482.473) (737.016,222.63) (907.335,266.239) Txyz=-9 
99999 -999999 -999999 Rxyz=-999999 -999999 -999999 

Répondre

0

Désolé pour l'interruption.

Je viens de définir MarkerSize à une valeur positive (0,05f dans mon cas, -1 par défaut). Toute rotation et traduction apparaissent!

0

Rvec et Tvec doivent d'abord être initialisés. Vous pouvez le faire en appelant la fonction calculateExtrinsics() dans le marqueur. Si vous définissez la taille de vos marqueurs dans la fonction detect() de MarkerDetector, la fonction calculateExtrinsics() sera automatiquement appelée.

0

Vous devez calibrer la caméra à l'aide des cartes ChArUco ou simplement des cartes ArUco, une fois que vous obtenez le fichier de sortie camera.yml. Vous pouvez l'utiliser avec votre application actuelle. Sans le fichier d'étalonnage, Txyz et Rxyz ne seront pas calculés.