0

OpenCV と 2 つの Web カメラを使用したステレオ設定があります。BM対応アルゴリズムを使用して、本質的および基本的な行列、内在性外在性などを計算しました。ここで、左の画像のピクセルの一致点を他の画像で見つけたいと思います。これを行うために、次の関数を定義しました。これは、主な目的が現実世界の距離を計算することであるため、不完全です。

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

-

ポイント1:

%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 %8.3f 0

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

pt2:

%8.3f -inf

%8.3f -inf

%8.3f -inf

--3--->1

--1--->44201616



また、実世界の座標でピクセルの 3D 距離を見つけるための正しいパス上にあるかどうかを知りたいですか?

4

1 に答える 1

0

ステレオレンジを検索する必要があります。

視差ピクセル値、つまり2つのフレーム内の2つのポイント間の水平方向のピクセル距離がある場合、そのポイントの実際の深度(カメラのベースラインに対する)を見つけることができます。

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

disparity_pixels-2つのフレーム間の水平方向のピクセル距離(そのポイントの場合)。例えば。左の画像の点が(100, 150)で、2番目の画像の点がである場合(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_pixelsとを与えるでしょうsensor_pixels_per_mmこれを読んでください。

于 2013-03-24T02:25:54.177 に答える