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;
}
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
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
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