如何将像素坐标转换为世界坐标?
问题描述:
我正在研究一个机器人项目,就是我需要检测关键点获取这些点的坐标并将它们传送给机器人进行操作。 我做了相机校准,并使用校准信息从我的相机取消失真图像,然后应用ORB技术检测关键点。直到现在一切都很好,但我不知道如何映射这些关键点坐标来与机器人一起工作。如何将像素坐标转换为世界坐标?
这里是我使用的代码:
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;
}
答
的坐标系与机器人的基地就在地图的坐标系,并使其原点。在做这件事之前,请确保您已经以毫米级精度正确校准了您的视力。
有很多方法可以用这种方式使用关键点。你对odometry还是其他什么感兴趣?我猜广义术语是单应性。 – jdv
所以如果我使用单应性技术,可以将这个坐标映射到真正的坐标,由机器人操作 – Ahmad
当然。这里有一些讨论:https://*.com/q/30502687/1531971(和其他人)这个问题感觉它可能有点宽泛,需要更多的研究。 – jdv