2017-10-18 57 views
0

私はロボットプロジェクトに取り組んでいます。キーポイントを検出し、このポイントの座標を取得してロボットに転送して操作する必要があるということです。 私はカメラのキャリブレーションを行い、キャリブレーション情報を使用してカメラから画像を歪ませた後、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; 
} 
+0

このようにキーポイントを使用する方法はたくさんあります。オドメトリーや他の何かに興味がありますか?一般化された言葉はホモグラフィだと思います。 – jdv

+0

私はホモグラフィ技術を使用すると、この座標をマニピュレータによって操作される実際の座標にマップすることができます – Ahmad

+0

確かに。そこにいくつかの議論があります:https://stackoverflow.com/q/30502687/1531971(およびその他)この質問は、それが少し広範であるかもしれないと感じ、あなたの部分についてより多くの研究が必要です。 – jdv

答えて

0

ちょうどロボット座標系のベースに座標系をマッピングし、その起源ます。ここ

は、私が使用しているコードです。これを行う前に、mm精度で視力を正しく較正してください。

関連する問題