2

v 視差と u 視差を計算する関数を OpenCV で作成しているので、最初に視差画像が必要です。sgbm.minDisparity = 0 と numberOfDisparities = 160 を設定しました。

視差画像は CV_16SC1 で、関数のプログラミングを続けるには符号なしの値が必要です。

Mat全体を印刷したところ、負の値と160を超える値があります。ドキュメントをよく理解していれば、視差画像は視差値を表しています*16。私の場合、最大値は 16*160 ということですか? そうでない場合、何が間違っている可能性がありますか?. とにかく、minDisparity が 0 に設定されているのに 0 未満の値があるのはなぜですか? コードは次のとおりです。

void Stereo_SGBM(){
    int numberOfDisparities;
    StereoSGBM sgbm;
    Mat img1, img2;

    img1=left_frame;   //left and right frames are global variables
    img2=right_frame;

    Size img_size = img1.size();

    //I make sure the number of disparities is divisible by 16
    numberOfDisparities = 160;  

    int cn=1;   //Grayscale

    sgbm.preFilterCap = 63;
    sgbm.SADWindowSize = 3;
    sgbm.P1 = 8*cn*sgbm.SADWindowSize*sgbm.SADWindowSize;
    sgbm.P2 = 32*cn*sgbm.SADWindowSize*sgbm.SADWindowSize;
    sgbm.minDisparity = 0;
    sgbm.numberOfDisparities = numberOfDisparities;
    sgbm.uniquenessRatio = 10;
    sgbm.speckleWindowSize = 100;
    sgbm.speckleRange = 2;
    sgbm.disp12MaxDiff = 1;
    sgbm.fullDP = false;  

    Mat disp;   // CV_16SC1
    Mat disp8;  //CV_8UC1 (used later in the code


    sgbm(img1, img2, disp); 
    //disp contains negative values and larger than 160!!!

    //img1 and img2 are left and right channels of size 1242x375 grayscale    
}
4

1 に答える 1

1

私の見方では、視差はフロートであることが意図されており、パラメーターに反映されています。結果を float に変換して 16 で割ると、もう少し理にかなっています。

アルゴリズムは、一致しなかった場合に -1 (実際には minDisparity - 1) を報告するようです。また、 numberOfDisparities は、実際の値の数ではなく、「最大視差 - 最小視差」です。

たとえば、minDisparity=2 と numberOfDisparities=144 を指定すると、1.0 ~ 145.0 の範囲で結果が得られます。異なる値の数は、1/16 ずつ増加するため、実際には 144*16 になります。

そうです、あなたの場合、整数を使用すると、これは 16*160 の最大値を取得することを意味します。

于 2016-10-13T07:03:25.233 に答える