2017-10-18 12 views
0

Je travaille sur un projet robotique, c'est que j'ai besoin de détecter les points clés pour obtenir les coordonnées de ces points et les transférer au robot pour les manipuler. J'ai effectué l'étalonnage de la caméra et utilisé les informations d'étalonnage pour déformer l'image de mon appareil photo, puis j'ai appliqué la technique ORB pour détecter les points clés. jusqu'à maintenant tout est bon mais je ne sais pas comment cartographier ces points clés pour travailler avec le robot.comment convertir les coordonnées de pixel en coordonnées du monde?

Voici le code que je utilise:

int main(int argc, char** argv) 
{ 

std::vector<KeyPoint> kp; 
Mat frame; 
Mat frame_un; 
Mat camera_matrix =(Mat_<double>(3,3) << 7.4191833420713715e+02, 0.0, 320.0, 0.0, 7.4191833420713715e+02, 240.0, 0.0, 0.0, 
    1.0); 
Mat distortion_coefficients =(Mat_<double>(5,1) << -1.5271566741564191e-01, 1.5488166759164064e+00, 0.0, 0.0, 
    -7.6517765981508861e+00); 

VideoCapture cap(1); // open the default camera 
if (!cap.isOpened()) // check if we succeeded 
    return -1; 

for (;;) 
{ 

    cap.read(frame); // get a new frame from camera 
    if (frame.empty()) 
continue; 
undistort(frame, frame_un, camera_matrix, distortion_coefficients); 
// Default parameters of ORB 
    int nfeatures=30; 
    float scaleFactor=1.2f; 
    int nlevels=8; 
    int edgeThreshold=31; // Changed default (31); 
    int firstLevel=0; 
    int WTA_K=2; 
    int scoreType=ORB::HARRIS_SCORE; 
    int patchSize=31; 
    int fastThreshold=20; 

Ptr<ORB> detector = ORB::create(
    nfeatures, 
    scaleFactor, 
    nlevels, 
    edgeThreshold, 
    firstLevel, 
    WTA_K, 
    scoreType, 
    patchSize, 
    fastThreshold); 

    detector->detect(frame_un, kp); 
    std::cout << "Found " << kp.size() << " Keypoints " << std::endl; 
for(int i=0; i<=kp.size();i++) 
{ 
int x = kp[i].pt.x; 
int y = kp[i].pt.y; 
cout << "Point "<<i<<" Xpos = " << x << " Point "<<i<< " Ypos = " << y << "\n"; 

}  
Mat out; 

    //drawKeypoints(img, kp, out, Scalar::all(255)); 
drawKeypoints(frame_un, kp, out, Scalar::all (255)); 
namedWindow("Kpts", WINDOW_FREERATIO); 
    imshow("Kpts", out); 
waitKey(0); 
destroyWindow("Kpts"); 
} 
    // waitKey(0); 
    return 0; 
} 
+0

Il existe de nombreuses façons d'utiliser les points-clés de cette manière. Êtes-vous intéressé par l'odométrie ou autre chose? Je suppose que le terme généralisé est l'homographie. – jdv

+0

donc si j'ai utilisé la technique d'homographie, ces coordonnées peuvent-elles être mappées à des coordonnées réelles pour être manipulées par le manipulateur? – Ahmad

+0

Bien sûr. Il y a une discussion de cela ici: https://stackoverflow.com/q/30502687/1531971 (et d'autres) Cette question semble être un peu large, et a besoin de plus de recherche de votre part. – jdv

Répondre

0

map Juste le système de coordonnées de coordonner la base du robot système et le rendre origine. Avant cela, assurez-vous que vous avez correctement calibré votre vision avec précision.