7

私は現在、ステレオカメラのペア用のopenCVプログラムを書いています。カメラのキャリブレーションとステレオ キャリブレーションが行われます。

次のステップは、取得した 2 つの画像から空間内のフィーチャの位置を見つけることです。そのため、画像をステレオ修正し、後で計算を行う必要があります。

私が直面している問題initUndistortRectifyMapは次のとおりです。

stereoRectify()- によって計算されたR1 または R2 を渡すinitUndistortRectifyMap()と、再マッピング後に黒い画像が得られます。

- r (空行列) を に渡すとinitUndistortRectifyMap()、再マッピング後に修正されていない画像が得られます。私が得る画像は少し歪んでいます。

initUndistortRectifyMap()2 つのカメラを調整 するために R1 と R2 を渡す必要があります。そうしないと、空のマトリックスを渡すときに、ステレオ ヘッドが同じ平面に回転しません。

以下は私のコードです:

stereoRectify(intrinsic[0], distCoeffs[0], intrinsic[1], distCoeffs[1], imageSize, 
    R, T_Stereo, R1, R2, newP1, newP2, Q, CV_CALIB_ZERO_DISPARITY, -1, imageSize);

if (x_Cam.GetSerial()=="4002678487")
{
    initUndistortRectifyMap(intrinsic[0], distCoeffs[0], R1, newP1, imageSize,        
        CV_16SC2 , mapx1,  mapy1);
    remap(x_Image, imageRectified[0],mapx1, mapy1, INTER_LINEAR);

    return imageRectified[0];
}   

if (x_Cam.GetSerial()=="4002702131")
{
    //flip(in, in, -1);
    initUndistortRectifyMap(intrinsic[1], distCoeffs[1], R2, newP2, imageSize, 
        CV_16SC2 , mapx2,  mapy2);
    remap(x_Image, imageRectified[1],mapx2, mapy2, INTER_LINEAR, BORDER_CONSTANT, 0);

    return imageRectified[1];
}

に入るすべてのマトリックス値をチェックしましたがstereoRectify()、それらは正しいです。回転行列 R1 と R2 も正しいようです。出力として黒い画像を取得しています。

InitUndistortRectifyMap()効果を簡単に確認するために、R1 と R2 (たとえば R1*R2) に不要な値を渡そうとしましたが、奇妙な結果が得られましたが、黒い画像は得られませんでした。

4

2 に答える 2

9

さて、私は一種の問題を回避し、誰もがそれを使用できる場合に備えて解決策を共有したいと思いました。

InitUnConstraintRectifyMapは、StereoRectifyによって生成された回転行列R1およびR2を使用すると、空白の画像を出力しました。

したがって、2つのホモグラフィ行列H1とH2を生成するStereoRectifyUncalibratedを使用しようとし、OpenCVのドキュメントに従って回転を計算しました。

R1 = inv(CamMatrix1)* H1 * CamMatrix1 R2 = inv(CamMatrix2)* H2 * CamMatrix2

新しいR1とR2をInitUncompressRectifyMapに渡して再マップしたところ、満足のいく結果が得られました。

于 2012-12-19T14:02:33.380 に答える
4

最近、この問題に関する調査に力を入れているため、この古い投稿を掘り下げます。つまり、私は同じ問題に直面しました-適切なステレオキャリブレーションと整流(すべてのopencvが提供するステレオビジョン機械)の後、最終的に「歪んだ」画像は黒くなりました。なぜそうなったか説明しよう。

まずはremap(src,dst,mapX, mapY)の仕組み。documentationに行くと、それを見ることができます

ここに画像の説明を入力

また、値 mapX(x,y) または mapY(x,y) のいずれかが src の外にある場合、dst(x,y) = 0 (黒!) になります。つまり、すべてのペア (x,y) が mapX または mapY に無効な値を持っています。たとえば、私の場合、説明できない理由から、すべての値が mapY 負になっています。

しかし、これは特定のステレオ ビジョン構成でのみ発生するためです。カメラ間の回転角度が小さい (数度まで) ようにカメラを並べた例をいくつか作成しました。その場合、opencv の手順はうまく機能します。2 つのオイラー角度が同じで、1 つの角度 (Y を中心とした回転) が 17 度の場合に発生した「黒」出力の問題。その場合、私はいくつかの実験を行いました - 私は次のように mapX と mapY を翻訳しました:

for(int i=0;i<_imageSize.width;i++)
        for(int j=0;j<_imageSize.height;j++) {
            _mapXA.at<float>(j, i) -= 1200;
            _mapYA.at<float>(j, i) -= 1200;
            _mapXB.at<float>(j, i) += 2500;
            _mapYB.at<float>(j, i) += 2500;
        }

(_mapXA が大きすぎて、_mapYB が -1500 付近で負の値になっていることがわかったため)。驚いたことに、 remap()後の出力は黒ではありませんでした。画像は、ある角度で回転したように見えましたが (17 かもしれません。正確には確認しませんでした)、まったく修正されていませんでした。

opencv がステレオ ビジョンで非平行カメラをうまく処理できない可能性があります。つまり、一部の例では機能し、一部の例では機能しませんが、この方法は現実的ではないことを意味します. また、Gary Bradski と Adrian Kaehler Learning OpenCVなどの情報を見つけることができます 。

繰り返しになりますが、これが、カメラをできるだけ正面と平行になるように配置すると、より良い結果が得られる傾向がある理由の 1 つです (少なくともステレオ ビジョンの専門家になるまでは)。

于 2014-03-21T17:04:57.107 に答える