2013-01-20 74 views
0

我有一個使用OpenCV和兩個攝像頭的立體聲設置。我使用BM對應算法計算了基本矩陣和基本矩陣,內省extrinces等。現在我想在另一個圖像的左側圖像中找到一個像素的匹配點。爲此,我定義了下面的函數,這是不完整的,因爲我的主要目的是計算真實世界的距離。OpenCV立體匹配基本矩陣奇怪值

void StereoVision::findEpipolarLineForXY(int x, int y ,int lr) 
{ 

if(calibrationDone) 
{ 
    CvPoint3D32f p1={x,y,1}; 
    qDebug("%d,_,_,%d",p1.x,p1.y); 

    CvMat pt1=cvMat(3,1,CV_64FC1,&p1); 
    qDebug("-"); 
    CvMat e=_E; 
    qDebug("pt1:"); 
    PrintMat(&pt1); 
    qDebug("e:"); 
    PrintMat(&e); 

    //CvMat * corLine; 
    //CvMat* pt2=e*pt1; 

    CvMat *pt2 = cvCreateMat(e.rows, pt1.cols, CV_64FC1); 
    qDebug("pt2:"); 
    PrintMat(pt2); 
    qDebug("--%d--->%d",pt2->rows,pt2->cols); 

    cvMatMul(&e, &pt1, pt2); 

    qDebug("--%d--->%d",pt2->cols,pt2->data); 
    //const CvMat* f=&_F; 
    qDebug("---"); 
    //cvComputeCorrespondEpilines(&mat,lr,f,corLine); 
    qDebug("----"); 
    //qDebug("%d,,,%d",corLine->height,corLine->rows); 

    } 

} 


void StereoVision::PrintMat(CvMat *A) 
{ 
int i, j; 

for (i = 0; i < A->rows; i++) 
{ 
    QDebug dbg(QtDebugMsg); 
    dbg<<"\n"; 
    switch (CV_MAT_DEPTH(A->type)) 
    { 
    case CV_32F: 
    case CV_64F: 
     for (j = 0; j < A->cols; j++) 
      dbg <<"%8.3f "<< ((float)cvGetReal2D(A, i, j)); 
     break; 
    case CV_8U: 
    case CV_16U: 
     for(j = 0; j < A->cols; j++) 
      dbg <<"%6d"<<((int)cvGetReal2D(A, i, j)); 
     break; 
    default: 
     break; 
    } 
    dbg.~QDebug(); 
} 
qDebug(""); 
} 

我想知道爲什麼基本矩陣是不好的?所有輸出低於:

350,,317

0,,1081466880

-

PT1:

%8.3f 350

%8.3f 317

%8.3f 1

E:

%8.3f 0%8.3f INF%8.3f 0

%8.3f 0%8.3f 0%0 8.3f

%8.3 f 0的%8​​.3f 0%0 8.3f

PT2:

%8.3f -INF

%8.3f -INF

%8.3f -INF

--3 ---> 1

--1 ---> 44201616



另外我想知道如果我在正確的道路上找到真實世界座標中像素的3D距離嗎?

回答

0

您應該查看Stereo Ranging

如果您有像差值(即兩幀中兩點之間的水平像素距離),則可以找出該點的真實世界深度(相對於相機基線)。

focal_length_pixels = focal_length_mm * sensor_pixels_per_mm; 
distance_mm = baseline_mm * focal_length_pixels/disparity_pixels; 

disparity_pixels - 兩幀之間的水平像素距離(對於該點)。例如。如果在左圖像的位置是(100, 150)和第二圖像中(125, 160)disparity_pixel = 25

您可以從您的攝像頭規格focal_length_mm

focal_length_pixels = distance_mm * disparity_pixels/baseline_mm; 
sensor_pixels_per_mm = focal_length_pixels/focal_length_mm; 

保持距攝像機基線距離x mm處的物體。如上所示獲得disparity_pixels。你知道baseline_mm。這會給你focal_length_pixelssensor_pixels_per_mm。閱讀this